Skip to content

Commit

Permalink
Distributed Session Management #7529
Browse files Browse the repository at this point in the history
Hazelcast
  • Loading branch information
rymsha committed Jan 5, 2020
1 parent 6a62b1e commit 13bc3c0
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 1 deletion.
3 changes: 3 additions & 0 deletions modules/runtime/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ addBundle( "org.apache.ignite:ignite-core:${igniteVersion}", 8 )
addBundle( "org.apache.ignite:ignite-osgi:${igniteVersion}", 8 )
addBundle( "org.apache.ignite:ignite-slf4j:${igniteVersion}", 8 )

addBundle( 'com.hazelcast:hazelcast:3.12.4' , 8 )
addBundle( 'com.hazelcast:hazelcast-client:3.12.4' , 8 )

addBundle( project( ':core:core-internal' ), 9 )

// API bundles
Expand Down
6 changes: 5 additions & 1 deletion modules/web/web-session/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ apply from: "$rootDir/gradle/osgi.gradle"
dependencies {
compile project( ':web:web-api' )
compile "org.eclipse.jetty:jetty-server:${jettyVersion}"
compile "org.eclipse.jetty:jetty-hazelcast:${jettyVersion}"
compile "org.apache.ignite:ignite-core:${igniteVersion}"
compile "com.hazelcast:hazelcast-client:3.12.4"

testCompile project( path: ':web:web-api', configuration: 'testOutput' )
}

jar {
bnd( 'Bundle-Name': 'Enonic XP Web - Websession' )
bnd( 'Bundle-Name': 'Enonic XP Web - Websession',
'Export-Package': 'org.eclipse.jetty.hazelcast.*')
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.enonic.xp.web.session.impl.hazelcast;

import org.eclipse.jetty.hazelcast.session.SessionDataSerializer;
import org.eclipse.jetty.server.session.SessionData;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;

import com.hazelcast.config.Config;
import com.hazelcast.config.JoinConfig;
import com.hazelcast.config.SerializerConfig;
import com.hazelcast.config.TcpIpConfig;
import com.hazelcast.osgi.HazelcastOSGiInstance;
import com.hazelcast.osgi.HazelcastOSGiService;

@Component(immediate = true)
public class HazelcastInstanceActivator
{
private final HazelcastOSGiService hazelcastOSGiService;

private HazelcastOSGiInstance hazelcastOSGiInstance;

@Activate
public HazelcastInstanceActivator( @Reference final HazelcastOSGiService hazelcastOSGiService )
{
this.hazelcastOSGiService = hazelcastOSGiService;
}

@Activate
public void activate()
{
SerializerConfig sc = new SerializerConfig().setImplementation( new SessionDataSerializer() ).setTypeClass( SessionData.class );
Config config = new Config();
config.getSerializationConfig().addSerializerConfig( sc );
final JoinConfig join = config.getNetworkConfig().getJoin();
join.getMulticastConfig().setEnabled( false );
final TcpIpConfig tcpIpConfig = join.getTcpIpConfig();
tcpIpConfig.setEnabled( true );
tcpIpConfig.addMember( "10.0.2.4" );
tcpIpConfig.addMember( "10.0.2.15" );

hazelcastOSGiInstance = hazelcastOSGiService.newHazelcastInstance( config );
}

@Deactivate
public void deactivate()
{
hazelcastOSGiService.shutdownHazelcastInstance( hazelcastOSGiInstance );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.enonic.xp.web.session.impl.hazelcast;

import org.eclipse.jetty.hazelcast.session.HazelcastSessionDataStoreFactory;
import org.eclipse.jetty.server.session.NullSessionCacheFactory;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hazelcast.core.HazelcastInstance;

import com.enonic.xp.cluster.ClusterConfig;
import com.enonic.xp.web.session.impl.AbstractSessionDataStoreFactoryActivator;
import com.enonic.xp.web.session.impl.WebSessionConfig;

@Component(immediate = true, configurationPid = "com.enonic.xp.web.session")
public class HazelcastSessionDataStoreFactoryActivator
extends AbstractSessionDataStoreFactoryActivator
{
private static final Logger LOG = LoggerFactory.getLogger( HazelcastSessionDataStoreFactoryActivator.class );

private final ClusterConfig clusterConfig;

private final HazelcastInstance hazelcastInstance;

@Activate
public HazelcastSessionDataStoreFactoryActivator( final BundleContext bundleContext, @Reference final ClusterConfig clusterConfig,
@Reference final HazelcastInstance hazelcastInstance )
{
super( bundleContext );
this.clusterConfig = clusterConfig;
this.hazelcastInstance = hazelcastInstance;
}

@Activate
public void activate( final WebSessionConfig webSessionConfig )
{
if ( clusterConfig.isEnabled() && clusterConfig.isSessionReplicationEnabled() )
{
final HazelcastSessionDataStoreFactory sessionDataStoreFactory = new HazelcastSessionDataStoreFactory();
sessionDataStoreFactory.setSavePeriodSec( webSessionConfig.session_save_period() );
sessionDataStoreFactory.setHazelcastInstance( hazelcastInstance );

NullSessionCacheFactory sessionCacheFactory = new NullSessionCacheFactory();
sessionCacheFactory.setSaveOnCreate( true );
sessionCacheFactory.setRemoveUnloadableSessions( true );
sessionCacheFactory.setFlushOnResponseCommit( true );
registerServices( sessionDataStoreFactory, sessionCacheFactory );
}
}

@Deactivate
public void deactivate()
{
unregisterServices();
}
}

0 comments on commit 13bc3c0

Please sign in to comment.