Chapter 18. High-Availability Web Sessions
JBoss Enterprise Application Server allows you to make web sessions highly available by storing them in a database table.
Important
HTTP session replication with JBoss Cache is the preferred approach to securing web session failover. It is strongly recommended to use this approach if possible (refer to Chapter 17, HTTP session state replication).
To provide high availability web sessions, you can configure JBoss Application Server to store the web session state in a database table. If the server then becomes unavailable, the web session state is still preserved in the database table and can be used by failover servers, while if using session replication, the web session is available on the server and the respective failover nodes. The high availability web session setup can be useful in a WAN with several application server instance or in combination with session replication.
To make web sessions highly available, you need to do the following:
- configure the server to use the session manager set on your web application (JBoss Application Server by default ignores the web application session manager and switches to JBossCacheManager automatically);
- configure your web applications to use DataSourcePersistentManager as their session manager (the manager handles the storing of web sessions to the defined database table);
- create the web session table in the target database and deploy the datasource, which will provide the connection between the session manager and the database table.
Configuring JBoss Enterprise Application Server
To configure JBoss Enterprise Application Server to allow storing of sessions in a database, disable overriding of the session manager set on your web application (overriden to JBossCacheManager; this allows the web application to use its own session manager):
- Open the
JBOSS_HOME/server/PROFILE/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml
file for editing. - Set the overrideDistributableManager property of the
WarDeployer
bean tofalse
:<bean name="WarDeployer" class="org.jboss.web.tomcat.service.deployers.TomcatDeployer"> . . . <!-- "False" disables overriding the session manager for distributable webapps --> <property name="overrideDistributableManager">false</property> </bean>
Configuring Web Application
Configure your web application to use the database persistent session manager:
- In the application's
WEB-INF
directory, create thecontext.xml
file, which will define what session manager is to be used as well as the manager's attributes.Important
Note that it is not recommended to add the manager definition to thejboss-web.xml
file, although it is the standard web application deployment descriptor. The goal of using thecontext.xml
file instead is to avoid any unnecessary changes to the existing JBoss Application Server code. - In the
context.xml
file, add the Manager element and its attributes:- className
- fully-qualified class name of the session manager implementation
- dataSourceJndiName
- datasource that allows the session manager to communicate with the database that stores the web sessions
<Context cookies="true" crossContext="true"> <Manager className="org.jboss.web.tomcat.service.session.persistent.DataSourcePersistentManager" dataSourceJndiName="java:HttpSessionDS"/> :</Context>
Note
The className and dataSourceJndiName are compulsory attributes. You can also define further Context and Manager attributes (refer to Section 18.1, “DataSourcePersistentManager Configuration Attributes”.
Configuring Database and Datasource
Create the database session table, which will hold the web session data and then create the respective datasource:
- Create the web session ( httpsessions ) database table:You can change the name of the table and of the columns; however, make sure to configure the DataSourcePersistentManager attributes appropriately.Individual columns must be able to store values of particular datatypes:
- creationtime and lastaccess : java long values
- maxinactive and version : java int value
- metadata : serialized java objects (currently not used)
- attributes : serialized java objects (stores the session attributes map; should be large enough to store your largest sessions)
- primary key : synthetic primary key (optional, make sure there is a UNIQUE INDEX on app + id).
The following command creates the table with default settings in the most common databases (MySQL, IBM DB2, Oracle Database):CREATE TABLE httpsessions (app VARCHAR(255) NOT NULL, id VARCHAR(255) NOT NULL, fullId VARCHAR(255) NOT NULL, creationtime BIGINT NOT NULL, maxinactive BIGINT NOT NULL, version INT NOT NULL, lastaccess BIGINT NOT NULL, isnew CHAR(1) NOT NULL, valid CHAR(1) NOT NULL, metadata VARBINARY NULL, attributes LONGVARBINARY NOT NULL, CONSTRAINT app_id PRIMARY KEY (app, id))
- Deploy an appropriate datasource to allow the DataSourcePersistentManager to communicate with the database (refer to the chapter on Datasource Configuration in the Administration and Configuration Guide. Make sure the datasource is set up as local-tx-datasource (xa-datasources are not supported).
- Add the dataSourceJndiName with the jndi-name of the created datasource to DataSourcePersistentManager element in the
context.xml
file.
18.1. DataSourcePersistentManager Configuration Attributes
The DataSourcePersistentManager element must define the className and dataSourceJndiName attributes. Apart from these, it can define other properties to specify manager's behavior and the way it interacts with the database.
Compulsory Properties
- className
- fully-qualified class name of the org.apache.catalina.Manager implementation (that is,
org.jboss.web.tomcat.service.session.persistent.DataSourcePersistentManager
) - dataSourceJndiName
- JNDI name of the data source, which defines the database connection to the httpsessions
Properties Defining the Database Connection Properties
- connectionName
- value of the username parameter to pass to the
DataSource.getConnection
method (ifnull
, the getConnection with no arguments is called) - connectionPassword
- password to pass to DataSource.getConnection
- sessionTable
- name of the database session table in which sessions are stored (by default
httpsessions
) - sessionAppCol
- name of the column with the web application name associated with the session (by default
app
) - sessionIdCol
- name of the column with the core, immutable part of a session ID (by default
id
; this and the sessionAppCol columns form the unique index for the table) - sessionFullIdCol
- name of the column with the full session ID (including any mutable element added to the core session ID, for example a jvmRoute; by default
fullid
) - sessionCreationTimeCol
- name of the column with the time when the session was created (of the long datatype, by default
creationtime
) - sessionMaxInactiveCol
- name of the column with the maximum number of milliseconds the session can remain unaccessed before expiring (by default
maxinactive
) - sessionVersionCol
- name of the column which stores the session's "version" (session version is incremented each time the session is persisted; by default
version
) - sessionLastAccessedCol
- name of the column with the timestamp of the last session access (take the long data type value; by default
lastaccess
) - sessionNewCol
- Name of the column with the flag indicating whether the session is new (session is considered new if it was not yet joined by the client; by default
isnew
- sessionValidCol
- name of the column with the flag indicating whether the session is valid (by default
isvalid
- sessionMetadataCol
- name of the column which can store serialized metadata about the session (currently unused; by default
metadata
- sessionAttributeCol
- name of the column with the serialized session attribute map (by default
attributes
)
Properties Defining the Manager's Behavior
- cleanupInterval
- minimum period of time in seconds that must lapse from the last cleaning of old "abandoned" sessions from the database before the next cleaning (by default 14400 seconds, that is, 4 hours)A session is abandoned if the only server that was handling the session requests was shut down before the session expired, no further requests for the session were received so that the session did not fail over to another server. Such session do not expire on the normal session expiration checks. Therefore a special process runs periodically to clean the session from the database.
- replicationTriggerString
- activity executed during a request that makes the session database persistent (the activity with the replication-trigger property SET)
- maxUnreplicatedInterval
- maximum interval between requests, in seconds, after which the session's timestamp is persisted regardless of whether the request caused the session to become dirty in any other way
- useJK
- flag determining whether the container assumes a JK-based software load balancer is used for load balancing (if set to
true
, the container examines the session ID associated with every request and replace the jvmRoute portion of the session ID if it detects a failover) - maxActiveAllowed
- maximum number of active sessions
- useSessionPassivation
- flag for enabling/disabling session passivation (session is removed from memory but remains always in the persistent store)
- passivationMinIdleTime
- minimum time, in seconds, a session must be inactive before passivated
- passivationMaxIdleTime
- maximum time, in seconds, a session can be inactive before passivated
- processExpiresFrequency
- frequency at which the background process thread calls the session manager to perform background processes (for example, expire or passivate sessions; (by default, every 10 seconds)This configuration is defined as value N with the background cleanup process called 1 in N callings to the session manager. Default is 1, that is, the cleanup process is performed every time the manager is called by the background process, that is cleanup is performed every 10 seconds. For example, if set to
6
, the manager performs the cleanup once a minute (1/6, that is once in 60 seconds). - sessionNotificationPolicy
- fully qualified class name of the implementation of the ClusteredSessionNotificationPolicy interface that is used to govern whether servlet specification notifications is emitted to any registered HttpSessionListener, HttpSessionAttributeListener or HttpSessionBindingListener.