diff --git a/README.adoc b/README.adoc index 1fea16f..ed78b15 100644 --- a/README.adoc +++ b/README.adoc @@ -1,10 +1,10 @@ image::https://www.aiticon.com/assets/images/appng_logo_760px.jpg[] -:version: 0.2.0-SNAPSHOT +:version: 0.2.2-SNAPSHOT :mongo-version: 3.10.2 :jedis-version: 3.1.0 :pool2-version: 2.6.2 -:hazelcast-version: 3.12.2 +:hazelcast-version: 3.12.3 == appNG Tomcat Session This library contains implementations of http://tomcat.apache.org/[Apache Tomcat^]s @@ -97,17 +97,23 @@ Add the following into your Tomcat `context.xml` (or the context block of the `s + multicastGroup="224.2.2.3" multicastPort="54327" multicastTimeoutSeconds="2" multicastTimeToLive="32" /> + + + + - - <-- standalone mode, for development purposes --> + ---- diff --git a/pom.xml b/pom.xml index 2acdda9..dc45817 100644 --- a/pom.xml +++ b/pom.xml @@ -230,7 +230,7 @@ com.hazelcast hazelcast-client - 3.12.2 + 3.12.3 diff --git a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastPersistentManager.java b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastPersistentManager.java index 39d8f45..0a45e5b 100644 --- a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastPersistentManager.java +++ b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastPersistentManager.java @@ -75,7 +75,7 @@ public Session findSession(String id) throws IOException { @Override public String getName() { if (this.name == null) { - this.name = Utils.getContextName(getContext()); + this.name = Utils.getContextName(getContext()).replace('/', '_'); } return this.name; } diff --git a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java index db66c6e..cfd3dbb 100644 --- a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java +++ b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java @@ -29,11 +29,13 @@ import com.hazelcast.client.HazelcastClient; import com.hazelcast.client.config.ClientConfig; +import com.hazelcast.config.ClasspathXmlConfig; import com.hazelcast.config.Config; import com.hazelcast.config.GroupConfig; -import com.hazelcast.config.JoinConfig; +import com.hazelcast.config.ManagementCenterConfig; import com.hazelcast.config.MulticastConfig; import com.hazelcast.config.NetworkConfig; +import com.hazelcast.config.TcpIpConfig; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IMap; @@ -87,24 +89,18 @@ public class HazelcastStore extends StoreBase { private int multicastTimeToLive = MulticastConfig.DEFAULT_MULTICAST_TTL; private String tcpMembers; + private String managementCenterUrl; private String instanceName = "appNG"; + private String configFile = "hazelcast.xml"; public enum Mode { - MULTICAST, TCP, CLIENT, STANDALONE; + MULTICAST, TCP, CLIENT, STANDALONE, CLASSPATH; } @Override protected void initInternal() { super.initInternal(); - Config config = new Config(); - config.setInstanceName(instanceName); - GroupConfig groupConfig = new GroupConfig(); - groupConfig.setName(group); - config.setGroupConfig(groupConfig); - config.getNetworkConfig().setPort(port); - JoinConfig joinConfig = config.getNetworkConfig().getJoin(); - joinConfig.getTcpIpConfig().setEnabled(false); - joinConfig.getMulticastConfig().setEnabled(false); + Config config = getConfig(); switch (mode) { case CLIENT: instance = HazelcastClient.getHazelcastClientByName(instanceName); @@ -125,29 +121,59 @@ protected void initInternal() { return; case TCP: - joinConfig.getTcpIpConfig().setEnabled(true); + TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig(); + tcpIpConfig.setEnabled(true); if (null != tcpMembers) { - joinConfig.getTcpIpConfig().addMember(tcpMembers); + tcpIpConfig.addMember(tcpMembers); + log.info("Using TCP mode with members: " + tcpMembers); + } else { + log.warn("TCP mode is used, but tcpMembers is not set!"); } instance = Hazelcast.getOrCreateHazelcastInstance(config); break; case MULTICAST: - joinConfig.getMulticastConfig().setEnabled(true); - joinConfig.getMulticastConfig().setMulticastGroup(multicastGroup); - joinConfig.getMulticastConfig().setMulticastPort(multicastPort); - joinConfig.getMulticastConfig().setMulticastTimeoutSeconds(multicastTimeoutSeconds); - joinConfig.getMulticastConfig().setMulticastTimeToLive(multicastTimeToLive); + MulticastConfig multicastConfig = config.getNetworkConfig().getJoin().getMulticastConfig(); + multicastConfig.setEnabled(true); + multicastConfig.setMulticastGroup(multicastGroup); + multicastConfig.setMulticastPort(multicastPort); + multicastConfig.setMulticastTimeoutSeconds(multicastTimeoutSeconds); + multicastConfig.setMulticastTimeToLive(multicastTimeToLive); + log.info("Using MULTICAST on " + multicastGroup + ":" + multicastPort); instance = Hazelcast.getOrCreateHazelcastInstance(config); break; - + case CLASSPATH: + config = new ClasspathXmlConfig(configFile); + instance = Hazelcast.getOrCreateHazelcastInstance(config); + log.info("Using classpath config:" + getClass().getClassLoader().getResource(configFile)); + break; default: instance = Hazelcast.getOrCreateHazelcastInstance(config); + log.info("Using STANDALONE config"); break; } log.info(String.format("Using instance %s", instance)); } + private Config getConfig() { + Config config = new Config(); + config.setInstanceName(instanceName); + GroupConfig groupConfig = new GroupConfig(); + groupConfig.setName(group); + config.setGroupConfig(groupConfig); + config.getNetworkConfig().setPort(port); + if (null != managementCenterUrl) { + ManagementCenterConfig manCenterConfig = new ManagementCenterConfig(); + config.setManagementCenterConfig(manCenterConfig); + manCenterConfig.setEnabled(true); + manCenterConfig.setUrl(managementCenterUrl); + log.info("Using management center at " + managementCenterUrl); + } + config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(false); + config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); + return config; + } + @Override protected void destroyInternal() { log.info(String.format("Shutting down instance %s", instance)); @@ -183,12 +209,12 @@ public StandardSession load(String id) throws ClassNotFoundException, IOExceptio // pessimistic lock block to prevent concurrency problems whilst finding sessions getSessions().lock(id); - try { - getSessions().remove(id); - getSessions().set(id, data); - } finally { - getSessions().unlock(id); - } + try { + getSessions().remove(id); + getSessions().set(id, data); + } finally { + getSessions().unlock(id); + } return session; } } @@ -261,4 +287,20 @@ public void setInstanceName(String instanceName) { this.instanceName = instanceName; } + public String getManagementCenterUrl() { + return managementCenterUrl; + } + + public void setManagementCenterUrl(String managementCenterUrl) { + this.managementCenterUrl = managementCenterUrl; + } + + public String getConfigFile() { + return configFile; + } + + public void setConfigFile(String configFile) { + this.configFile = configFile; + } + }