HTTP Session Replication

Apache Karaf Cellar supports replication of the HTTP sessions on the cluster.

It means that the same web application deployed on multiple nodes in the cluster will share the same HTTP sessions pool, allowing clients to transparently connect to any node, without loosing any session state.

Enable Cluster HTTP Session Replication

In order to be able to be stored on the cluster, all HTTP Sessions used in your web application have to implement Serializable interface. Any non-serializable attribute has to be flagged as transient.

You have to enable a specific filter in your application to enable the replication. See next chapter for details.

At runtime level, you just have to install http, http-whiteboard, and cellar features:

karaf@root()> feature:install http
karaf@root()> feature:install http-whiteboard
karaf@root()> feature:repo-add cellar
karaf@root()> feature:install cellar

Web Application Session Replication

In order to use HTTP session replication on the cluster, you just have to add a filter in your web application.

Basically, the WEB-INF/web.xml file of your web application should look like this:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">

	<filter>
		<filter-name>hazelcast-filter</filter-name>
		<filter-class>com.hazelcast.web.WebFilter</filter-class>
	    <!--
	        Name of the distributed map storing
	        your web session objects
	    -->
		<init-param>
			<param-name>map-name</param-name>
			<param-value>my-sessions</param-value>
		</init-param>
	    <!-- How is your load-balancer configured? stick-session means all requests of
	    	a session is routed to the node where the session is first created. This is
	    	excellent for performance. If sticky-session is set to false, when a session
	    	 is updated on a node, entry for this session on all other nodes is invalidated.
	    	 You have to know how your load-balancer is configured before setting this
	    	 parameter. Default is true. -->
		<init-param>
			<param-name>sticky-session</param-name>
			<param-value>false</param-value>
		</init-param>
	    <!--
	        Are you debugging? Default is false.
	    -->
		<init-param>
			<param-name>debug</param-name>
			<param-value>false</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>hazelcast-filter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
	<listener>
		<listener-class>com.hazelcast.web.SessionListener</listener-class>
	</listener>

</web-app>