[infinispan-commits] Infinispan SVN: r1084 - in trunk/core/src: test/java/org/infinispan/remoting and 1 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Fri Oct 30 11:20:36 EDT 2009
Author: manik.surtani at jboss.com
Date: 2009-10-30 11:20:35 -0400 (Fri, 30 Oct 2009)
New Revision: 1084
Added:
trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java
trunk/core/src/test/java/org/infinispan/remoting/jgroups/
trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java
Modified:
trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java
Log:
[ISPN-185] Need to provide a mechanism in which a JGroups channel can be passed in
Added: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java (rev 0)
+++ trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java 2009-10-30 15:20:35 UTC (rev 1084)
@@ -0,0 +1,18 @@
+package org.infinispan.remoting.transport.jgroups;
+
+import org.jgroups.Channel;
+
+/**
+ * A hook to pass in a JGroups channel. Implementations need to provide a public no-arg constructor as instances are
+ * created via reflection.
+ *
+ * @author Manik Surtani
+ * @since 4.0
+ */
+public interface JGroupsChannelLookup {
+ Channel getJGroupsChannel();
+
+ boolean shouldStartAndConnect();
+
+ boolean shouldStopAndDisconnect();
+}
Property changes on: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsChannelLookup.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified: trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java 2009-10-30 14:49:30 UTC (rev 1083)
+++ trunk/core/src/main/java/org/infinispan/remoting/transport/jgroups/JGroupsTransport.java 2009-10-30 15:20:35 UTC (rev 1084)
@@ -71,8 +71,17 @@
import static java.util.concurrent.TimeUnit.MILLISECONDS;
/**
- * An encapsulation of a JGroups transport
- *
+ * An encapsulation of a JGroups transport. JGroups transports can be configured using a variety of methods, usually
+ * by passing in one of the following properties:
+ * <ul>
+ * <li><tt>configurationString</tt> - a JGroups configuration String</li>
+ * <li><tt>configurationXml</tt> - JGroups configuration XML as a String</li>
+ * <li><tt>configurationFile</tt> - String pointing to a JGroups XML configuration file</li>
+ * <li><tt>channelLookup</tt> - Fully qualified class name of a {@link org.infinispan.remoting.transport.jgroups.JGroupsChannelLookup} instance</li>
+ * </ul>
+ * These are normally passed in as Properties in {@link org.infinispan.config.GlobalConfiguration#setTransportProperties(java.util.Properties)}
+ * or in the Infinispan XML configuration file.
+ *
* @author Manik Surtani
* @author Galder Zamarreño
* @since 4.0
@@ -81,7 +90,9 @@
public static final String CONFIGURATION_STRING = "configurationString";
public static final String CONFIGURATION_XML = "configurationXml";
public static final String CONFIGURATION_FILE = "configurationFile";
+ public static final String CHANNEL_LOOKUP = "channelLookup";
private static final String DEFAULT_JGROUPS_CONFIGURATION_FILE = "config-samples/jgroups-udp.xml";
+ private boolean startChannel = true, stopChannel = true;
Channel channel;
boolean createdChannel = false;
@@ -137,11 +148,12 @@
initChannelAndRPCDispatcher();
- //otherwise just connect
- try {
- channel.connect(c.getClusterName());
- } catch (ChannelException e) {
- throw new CacheException("Unable to start JGroups Channel", e);
+ if (startChannel) {
+ try {
+ channel.connect(c.getClusterName());
+ } catch (ChannelException e) {
+ throw new CacheException("Unable to start JGroups Channel", e);
+ }
}
log.info("Cache local address is {0}", getAddress());
@@ -158,7 +170,7 @@
public void stop() {
try {
- if (channel != null && channel.isOpen()) {
+ if (stopChannel && channel != null && channel.isOpen()) {
log.info("Disconnecting and closing JGroups Channel");
channel.disconnect();
channel.close();
@@ -208,7 +220,22 @@
// finally the legacy JGroups String properties.
String cfg;
if (props != null) {
- if (props.containsKey(CONFIGURATION_FILE)) {
+ if (props.containsKey(CHANNEL_LOOKUP)) {
+ String channelLookupClassName = props.getProperty(CHANNEL_LOOKUP);
+
+ try {
+ JGroupsChannelLookup lookup = (JGroupsChannelLookup) Util.getInstance(channelLookupClassName);
+ channel = lookup.getJGroupsChannel();
+ startChannel = lookup.shouldStartAndConnect();
+ stopChannel = lookup.shouldStopAndDisconnect();
+ } catch (ClassCastException e) {
+ log.error("Class [" + channelLookupClassName + "] cannot be cast to JGroupsChannelLookup! Not using a channel lookup.");
+ } catch (Exception e) {
+ log.error("Errors instantiating [" + channelLookupClassName + "]! Not using a channel lookup.");
+ }
+ }
+
+ if (channel == null && props.containsKey(CONFIGURATION_FILE)) {
cfg = props.getProperty(CONFIGURATION_FILE);
try {
channel = new JChannel(new FileLookup().lookupFileLocation(cfg));
@@ -218,7 +245,7 @@
}
}
- if (props.containsKey(CONFIGURATION_XML)) {
+ if (channel == null && props.containsKey(CONFIGURATION_XML)) {
cfg = props.getProperty(CONFIGURATION_XML);
try {
channel = new JChannel(XmlConfigHelper.stringToElement(cfg));
@@ -228,7 +255,7 @@
}
}
- if (props.containsKey(CONFIGURATION_STRING)) {
+ if (channel == null && props.containsKey(CONFIGURATION_STRING)) {
cfg = props.getProperty(CONFIGURATION_STRING);
try {
channel = new JChannel(cfg);
@@ -395,7 +422,7 @@
} else if (value instanceof Throwable) {
Throwable t = (Throwable) value;
if (trace) log.trace("Unexpected throwable from " + rsp.getSender(), t);
- throw new CacheException("Remote (" + rsp.getSender() +") failed unexpectedly", t);
+ throw new CacheException("Remote (" + rsp.getSender() + ") failed unexpectedly", t);
}
}
}
@@ -577,4 +604,7 @@
return dispatcher;
}
+ public Channel getChannel() {
+ return channel;
+ }
}
Added: trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java (rev 0)
+++ trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java 2009-10-30 15:20:35 UTC (rev 1084)
@@ -0,0 +1,59 @@
+package org.infinispan.remoting.jgroups;
+
+import org.easymock.classextension.EasyMock;
+import org.infinispan.config.GlobalConfiguration;
+import org.infinispan.factories.GlobalComponentRegistry;
+import org.infinispan.manager.CacheManager;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.remoting.transport.Transport;
+import org.infinispan.remoting.transport.jgroups.JGroupsChannelLookup;
+import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
+import org.infinispan.test.AbstractInfinispanTest;
+import org.infinispan.test.TestingUtil;
+import org.jgroups.Address;
+import org.jgroups.Channel;
+import org.jgroups.JChannel;
+import org.testng.annotations.Test;
+
+import java.util.Properties;
+
+ at Test(testName = "remoting.jgroups.ChannelLookupTest", groups = "functional")
+public class ChannelLookupTest extends AbstractInfinispanTest {
+ public void channelLookupTest() {
+ GlobalConfiguration gc = GlobalConfiguration.getClusteredDefault();
+ Properties p = new Properties();
+ p.setProperty("channelLookup", DummyLookup.class.getName());
+ gc.setTransportProperties(p);
+ CacheManager cm = new DefaultCacheManager(gc);
+ cm.start();
+ cm.getCache();
+ GlobalComponentRegistry gcr = TestingUtil.extractGlobalComponentRegistry(cm);
+ Transport t = gcr.getComponent(Transport.class);
+ assert t != null;
+ assert t instanceof JGroupsTransport;
+ assert !(((JGroupsTransport) t).getChannel() instanceof JChannel);
+ }
+
+ public static class DummyLookup implements JGroupsChannelLookup {
+ Channel mockChannel;
+ Address a = EasyMock.createNiceMock(Address.class);
+
+ public DummyLookup() {
+ mockChannel = EasyMock.createNiceMock(Channel.class);
+ EasyMock.expect(mockChannel.getAddress()).andReturn(a);
+ EasyMock.replay(mockChannel, a);
+ }
+
+ public Channel getJGroupsChannel() {
+ return mockChannel;
+ }
+
+ public boolean shouldStartAndConnect() {
+ return false;
+ }
+
+ public boolean shouldStopAndDisconnect() {
+ return false;
+ }
+ }
+}
Property changes on: trunk/core/src/test/java/org/infinispan/remoting/jgroups/ChannelLookupTest.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
More information about the infinispan-commits
mailing list