[jboss-cvs] JBoss Messaging SVN: r3705 - in trunk: src/main/org/jboss/jms/client/api and 26 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Feb 12 09:07:49 EST 2008
Author: jmesnil
Date: 2008-02-12 09:07:49 -0500 (Tue, 12 Feb 2008)
New Revision: 3705
Added:
trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java
trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java
trunk/src/main/org/jboss/messaging/util/RemotingException.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java
trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java
trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java
trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java
Removed:
trunk/src/main/org/jboss/messaging/core/remoting/Client.java
trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java
trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java
trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java
trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java
trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java
trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java
Modified:
trunk/src/main/org/jboss/jms/client/JBossConnection.java
trunk/src/main/org/jboss/jms/client/api/ClientConnection.java
trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java
trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java
trunk/src/main/org/jboss/jms/server/ConnectionManager.java
trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java
trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java
trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java
trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java
trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java
trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java
trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java
trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java
trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java
trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java
trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java
trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java
trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java
trunk/tests/build.xml
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java
trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java
trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java
trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java
trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java
trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java
trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java
trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java
Log:
* remoting refactoring + clean up
- simplified ConnectionManager interface and SimpleConnectionManager implementation
- unified failure handling and merged ConnectionExceptionListener & FailureListener
- merged ClientImpl code into MessagingRemotingConnection
Modified: trunk/src/main/org/jboss/jms/client/JBossConnection.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/JBossConnection.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/JBossConnection.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -337,11 +337,6 @@
return ((ClientConnectionInternal)connection).getServerID();
}
- public String getRemotingClientSessionID()
- {
- return ((ClientConnectionInternal)connection).getRemotingConnection().getSessionID();
- }
-
// Package protected ----------------------------------------------------------------------------
// Protected ------------------------------------------------------------------------------------
Modified: trunk/src/main/org/jboss/jms/client/api/ClientConnection.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/api/ClientConnection.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/api/ClientConnection.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -22,8 +22,6 @@
void stop() throws MessagingException;
- FailureListener getFailureListener() throws MessagingException;
-
void setFailureListener(FailureListener listener) throws MessagingException;
void close() throws MessagingException;
Modified: trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -118,13 +118,6 @@
remotingConnection.send(id, new ConnectionStopMessage());
}
-
- public FailureListener getFailureListener() throws MessagingException
- {
- checkClosed();
-
- return remotingConnection.getFailureListener();
- }
public void setFailureListener(FailureListener listener) throws MessagingException
{
@@ -148,8 +141,6 @@
}
finally
{
- remotingConnection.setFailureListener(null);
-
// Finished with the connection - we need to shutdown callback server
remotingConnection.stop();
Modified: trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -21,13 +21,13 @@
*/
package org.jboss.jms.client.remoting;
+import static java.util.concurrent.TimeUnit.SECONDS;
import static org.jboss.messaging.core.remoting.ConnectorRegistrySingleton.REGISTRY;
import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.Client;
import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.NIOSession;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
import org.jboss.messaging.core.remoting.wireformat.MessagingExceptionMessage;
import org.jboss.messaging.util.Logger;
@@ -35,7 +35,6 @@
/**
*
- * TODO: This class should disappear in favor of Connection/Client
* Encapsulates the state and behaviour from MINA needed for a JMS connection.
*
* Each JMS connection maintains a single Client instance for invoking on the server.
@@ -58,7 +57,11 @@
private RemotingConfiguration remotingConfig;
- private Client client;
+ private NIOConnector connector;
+
+ private NIOSession session;
+
+ private FailureListener listener;
// Constructors ---------------------------------------------------------------------------------
@@ -75,14 +78,11 @@
public void start() throws Throwable
{
- if (log.isTraceEnabled()) { log.trace(this + " created client"); }
+ if (log.isTraceEnabled()) { log.trace(this + " started remoting connection"); }
- //callbackManager = new CallbackManager();
+ connector = REGISTRY.getConnector(remotingConfig);
+ session = connector.connect();
- NIOConnector connector = REGISTRY.getConnector(remotingConfig);
- client = new ClientImpl(connector, remotingConfig);
- client.connect();
-
if (log.isDebugEnabled())
log.debug("Using " + connector + " to connect to " + remotingConfig);
@@ -95,24 +95,32 @@
try
{
- client.disconnect();
- NIOConnector connector = REGISTRY.removeConnector(remotingConfig);
if (connector != null)
- connector.disconnect();
+ {
+ if (listener != null)
+ connector.removeFailureListener(listener);
+ NIOConnector connectorFromRegistry = REGISTRY.removeConnector(remotingConfig);
+ if (connectorFromRegistry != null)
+ connectorFromRegistry.disconnect();
+ }
}
catch (Throwable ignore)
{
log.trace(this + " failed to disconnect the new client", ignore);
}
-
- client = null;
-
+
+ connector = null;
+
log.trace(this + " closed");
}
public String getSessionID()
{
- return client.getSessionID();
+ if (session == null || !session.isConnected())
+ {
+ return null;
+ }
+ return session.getID();
}
/**
@@ -133,7 +141,7 @@
try
{
- response = (AbstractPacket) client.send(packet, oneWay);
+ response = (AbstractPacket) send(packet, oneWay);
}
catch (Exception e)
{
@@ -159,24 +167,22 @@
}
}
- public synchronized void setFailureListener(FailureListener listener)
+ public synchronized void setFailureListener(FailureListener newListener)
{
- if (client != null)
+ if (listener != null && newListener != null)
{
- client.setFailureListener(listener);
+ throw new IllegalStateException("FailureListener already set to " + listener);
}
- }
- public synchronized FailureListener getFailureListener()
- {
- if (client != null)
+ if (newListener != null)
{
- return client.getFailureListener();
+ connector.addFailureListener(newListener);
}
- else
+ else
{
- return null;
+ connector.removeFailureListener(listener);
}
+ this.listener = newListener;
}
// Package protected ----------------------------------------------------------------------------
@@ -184,7 +190,36 @@
// Protected ------------------------------------------------------------------------------------
// Private --------------------------------------------------------------------------------------
-
- // Inner classes --------------------------------------------------------------------------------
+ private AbstractPacket send(AbstractPacket packet, boolean oneWay)
+ throws Exception
+ {
+ assert packet != null;
+ checkConnected();
+ packet.setOneWay(oneWay);
+
+ if (oneWay)
+ {
+ session.write(packet);
+ return null;
+ } else
+ {
+ AbstractPacket response = (AbstractPacket) session.writeAndBlock(packet,
+ remotingConfig.getTimeout(), SECONDS);
+ return response;
+ }
+ }
+
+ private void checkConnected() throws MessagingException
+ {
+ if (session == null)
+ {
+ throw new IllegalStateException("Client " + this
+ + " is not connected.");
+ }
+ if (!session.isConnected())
+ {
+ throw new MessagingException(MessagingException.NOT_CONNECTED);
+ }
+ }
}
Modified: trunk/src/main/org/jboss/jms/server/ConnectionManager.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/ConnectionManager.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/ConnectionManager.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -25,7 +25,6 @@
import org.jboss.jms.server.endpoint.ServerConnectionEndpoint;
import org.jboss.messaging.core.MessagingComponent;
-import org.jboss.messaging.core.remoting.PacketSender;
/**
@@ -34,43 +33,29 @@
*
* @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
* @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
* @version <tt>$Revision$</tt>
*
* $Id$
*/
public interface ConnectionManager extends MessagingComponent
{
- void registerConnection(String jmsClientVMId,
- String remotingClientSessionID,
- ServerConnectionEndpoint endpoint);
+ void registerConnection(String clientVMID,
+ String remotingClientSessionID, ServerConnectionEndpoint endpoint);
/**
+ * @param serverConnectionEndpoint
* @return null if there is no such connection.
*/
- ServerConnectionEndpoint unregisterConnection(String jmsClientVMID, String remotingClientSessionID);
+ ServerConnectionEndpoint unregisterConnection(String remotingClientSessionID, ServerConnectionEndpoint serverConnectionEndpoint);
- boolean containsRemotingSession(String remotingClientSessionID);
-
/**
* Returns a list of active connection endpoints currently maintained by an instance of this
* manager. The implementation should make a copy of the list to avoid
* ConcurrentModificationException. The list could be empty, but never null.
*
- * @return List<ConnectionEndpoint>
+ * @return List<ServerConnectionEndpoint>
*/
- List getActiveConnections();
-
- void addConnectionFactoryCallback(String uniqueName, String VMID,
- String remotingSessionID, PacketSender sender);
-
- void removeConnectionFactoryCallback(String uniqueName, String vmid, PacketSender sender);
-
- PacketSender[] getConnectionFactorySenders(String uniqueName);
-
- /**
- * @param clientToServer - true if the failure has been detected on a direct connection from
- * client to this server, false if the failure has been detected while trying to send a
- * callback from this server to the client.
- */
- void handleClientFailure(String remotingSessionID, boolean clientToServer);
+ List<ServerConnectionEndpoint> getActiveConnections();
}
Modified: trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -22,31 +22,32 @@
package org.jboss.jms.server.connectionmanager;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map.Entry;
+import org.jboss.jms.client.api.FailureListener;
+import org.jboss.jms.client.impl.JMSClientVMIdentifier;
import org.jboss.jms.server.ConnectionManager;
import org.jboss.jms.server.endpoint.ServerConnectionEndpoint;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
-import org.jboss.messaging.core.remoting.PacketSender;
-import org.jboss.messaging.util.ConcurrentHashSet;
import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
import org.jboss.messaging.util.Util;
/**
* @author <a href="tim.fox at jboss.com">Tim Fox</a>
* @author <a href="ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
* @version <tt>$Revision$</tt>
*
* $Id$
*/
-public class SimpleConnectionManager implements ConnectionManager, ConnectionExceptionListener
+public class SimpleConnectionManager implements ConnectionManager, FailureListener
{
// Constants ------------------------------------------------------------------------------------
@@ -54,136 +55,83 @@
// Static ---------------------------------------------------------------------------------------
- private static boolean trace = log.isTraceEnabled();
-
// Attributes -----------------------------------------------------------------------------------
- private Map</** VMID */String, Map</** RemoteSessionID */String, ServerConnectionEndpoint>> jmsClients;
+ private Map<String /* remoting session ID */, List<ServerConnectionEndpoint>> endpoints;
- // Map<remotingClientSessionID<String> - jmsClientVMID<String>
- private Map<String, String> remotingSessions;
-
- // Set<ServerConnectionEndpoint>
private Set<ServerConnectionEndpoint> activeServerConnectionEndpoints;
- private Map</** CFUniqueName*/ String, ConnectionFactoryCallbackInformation> cfCallbackInfo;
+ // the clients maps is for information only: to better identify the clients of
+ // jboss messaging using their VM ID
+ private Map<String /* remoting session id */, String /* client vm id */> clients;
// Constructors ---------------------------------------------------------------------------------
public SimpleConnectionManager()
{
- jmsClients = new HashMap<String, Map<String, ServerConnectionEndpoint>>();
- remotingSessions = new HashMap<String, String>();
+ endpoints = new HashMap<String, List<ServerConnectionEndpoint>>();
activeServerConnectionEndpoints = new HashSet<ServerConnectionEndpoint>();
- cfCallbackInfo = new ConcurrentHashMap<String, ConnectionFactoryCallbackInformation>();
+ clients = new HashMap<String, String>();
}
// ConnectionManager implementation -------------------------------------------------------------
-
-
- public synchronized void registerConnection(String jmsClientVMID,
- String remotingClientSessionID,
- ServerConnectionEndpoint endpoint)
+ public synchronized void registerConnection(String clientVMID, String remotingClientSessionID,
+ ServerConnectionEndpoint endpoint)
{
- Map<String, ServerConnectionEndpoint> endpoints = jmsClients.get(jmsClientVMID);
-
- if (endpoints == null)
+ List<ServerConnectionEndpoint> connectionEndpoints = endpoints.get(remotingClientSessionID);
+
+ if (connectionEndpoints == null)
{
- endpoints = new HashMap<String, ServerConnectionEndpoint>();
-
- jmsClients.put(jmsClientVMID, endpoints);
+ connectionEndpoints = new ArrayList<ServerConnectionEndpoint>();
+ endpoints.put(remotingClientSessionID, connectionEndpoints);
}
-
- endpoints.put(remotingClientSessionID, endpoint);
-
- remotingSessions.put(remotingClientSessionID, jmsClientVMID);
+ connectionEndpoints.add(endpoint);
+
activeServerConnectionEndpoints.add(endpoint);
-
+
+ clients.put(remotingClientSessionID, clientVMID);
+
log.debug("registered connection " + endpoint + " as " +
- Util.guidToString(remotingClientSessionID));
+ Util.guidToString(remotingClientSessionID));
}
-
- public synchronized ServerConnectionEndpoint unregisterConnection(String jmsClientVMId,
- String remotingClientSessionID)
+
+ public synchronized ServerConnectionEndpoint unregisterConnection(String remotingClientSessionID,
+ ServerConnectionEndpoint endpoint)
{
- Map<String, ServerConnectionEndpoint> endpoints = jmsClients.get(jmsClientVMId);
-
- if (endpoints != null)
+ List<ServerConnectionEndpoint> connectionEndpoints = endpoints.get(remotingClientSessionID);
+
+ if (connectionEndpoints != null)
{
- ServerConnectionEndpoint e = endpoints.remove(remotingClientSessionID);
+ boolean removed = connectionEndpoints.remove(endpoint);
- if (e != null)
+ if (removed)
{
- endpoints.remove(e);
- activeServerConnectionEndpoints.remove(e);
+ activeServerConnectionEndpoints.remove(endpoint);
}
- log.debug("unregistered connection " + e + " with remoting session ID " +
- Util.guidToString(remotingClientSessionID));
-
- if (endpoints.isEmpty())
+ log.debug("unregistered connection " + endpoint + " with remoting session ID " + remotingClientSessionID);
+
+ if (connectionEndpoints.isEmpty())
{
- jmsClients.remove(jmsClientVMId);
+ endpoints.remove(remotingClientSessionID);
+ clients.remove(remotingClientSessionID);
}
-
- remotingSessions.remove(remotingClientSessionID);
-
- return e;
+
+ return endpoint;
}
return null;
}
- public synchronized List getActiveConnections()
+ public synchronized List<ServerConnectionEndpoint> getActiveConnections()
{
// I will make a copy to avoid ConcurrentModification
List<ServerConnectionEndpoint> list = new ArrayList<ServerConnectionEndpoint>();
list.addAll(activeServerConnectionEndpoints);
return list;
- }
+ }
- public synchronized void handleClientFailure(String remotingSessionID, boolean clientToServer)
- {
- String jmsClientID = (String)remotingSessions.get(remotingSessionID);
-
- if (jmsClientID == null)
- {
- log.warn(this + " cannot look up remoting session ID " + remotingSessionID);
- }
-
- log.warn("A problem has been detected " +
- (clientToServer ?
- "with the connection to remote client ":
- "trying to send a message to remote client ") +
- remotingSessionID + ", jmsClientID=" + jmsClientID + ". It is possible the client has exited without closing " +
- "its connection(s) or the network has failed. All connection resources " +
- "corresponding to that client process will now be removed.");
-
- closeConsumersForClientVMID(jmsClientID);
- }
-
- /** Synchronized is not really needed.. just to be safe as this is not supposed to be highly contended */
- public void addConnectionFactoryCallback(String uniqueName, String vmID,
- String remotingSessionID, PacketSender sender)
- {
- remotingSessions.put(remotingSessionID, vmID);
- getCFInfo(uniqueName).addClient(vmID, sender);
- }
- /** Synchronized is not really needed.. just to be safe as this is not supposed to be highly contended */
- public synchronized void removeConnectionFactoryCallback(String uniqueName, String vmid,
- PacketSender sender)
- {
- getCFInfo(uniqueName).removeSender(vmid, sender);
- }
-
- /** Synchronized is not really needed.. just to be safe as this is not supposed to be highly contended */
- public synchronized PacketSender[] getConnectionFactorySenders(String uniqueName)
- {
- return getCFInfo(uniqueName).getAllSenders();
- }
-
-
// MessagingComponent implementation ------------------------------------------------------------
public void start() throws Exception
@@ -196,31 +144,19 @@
//NOOP
}
- // ConnectionExceptionListener ------------------------------------------------------------------
+ // FailureListener implementation --------------------------------------------------------------
- public void handleConnectionException(Throwable t, String clientSessionID)
+ public void onFailure(MessagingException me)
{
- handleClientFailure(clientSessionID , true);
+ if (me instanceof RemotingException)
+ {
+ RemotingException re = (RemotingException) me;
+ handleClientFailure(re.getSessionID(), true);
+ }
}
// Public ---------------------------------------------------------------------------------------
- /*
- * Used in testing only
- */
- public synchronized boolean containsRemotingSession(String remotingClientSessionID)
- {
- return remotingSessions.containsKey(remotingClientSessionID);
- }
-
- /*
- * Used in testing only
- */
- public synchronized Map getClients()
- {
- return Collections.unmodifiableMap(jmsClients);
- }
-
public String toString()
{
return "ConnectionManager[" + Integer.toHexString(hashCode()) + "]";
@@ -232,152 +168,96 @@
// Private --------------------------------------------------------------------------------------
- private ConnectionFactoryCallbackInformation getCFInfo(String uniqueName)
+ /**
+ * @param clientToServer - true if the failure has been detected on a direct connection from
+ * client to this server, false if the failure has been detected while trying to send a
+ * callback from this server to the client.
+ */
+ private synchronized void handleClientFailure(String remotingSessionID, boolean clientToServer)
{
- ConnectionFactoryCallbackInformation callback = cfCallbackInfo.get(uniqueName);
- if (callback == null)
- {
- callback = new ConnectionFactoryCallbackInformation(uniqueName);
- cfCallbackInfo.put(uniqueName, callback);
- callback = cfCallbackInfo.get(uniqueName);
- }
- return callback;
- }
+ String clientVMID = clients.get(remotingSessionID);
-
- private synchronized void closeConsumersForClientVMID(String jmsClientID)
- {
- if (jmsClientID == null)
+ if (clientVMID == null)
{
return;
}
- // Remoting only provides one pinger per invoker, not per connection therefore when the pinger
- // dies we must close ALL connections corresponding to that jms client ID.
-
- Map<String, ServerConnectionEndpoint> endpoints = jmsClients.get(jmsClientID);
-
- if (endpoints != null)
- {
- List<ServerConnectionEndpoint> sces = new ArrayList<ServerConnectionEndpoint>();
-
- for (Map.Entry<String, ServerConnectionEndpoint> entry: endpoints.entrySet())
- {
- ServerConnectionEndpoint sce = entry.getValue();
- sces.add(sce);
- }
-
- // Now close the end points - this will result in a callback into unregisterConnection
- // to remove the data from the jmsClients and sessions maps.
- // Note we do this outside the loop to prevent ConcurrentModificationException
-
- for(ServerConnectionEndpoint sce: sces )
- {
- try
- {
- log.debug("clearing up state for connection " + sce);
- sce.close();
- log.debug("cleared up state for connection " + sce);
- }
- catch (Exception e)
- {
- log.error("Failed to close connection", e);
- }
- }
- }
- for (ConnectionFactoryCallbackInformation cfInfo: cfCallbackInfo.values())
- {
- PacketSender[] senders = cfInfo.getAllSenders(jmsClientID);
- for (PacketSender sender: senders)
- {
- cfInfo.removeSender(jmsClientID, sender);
- }
+ log.warn("A problem has been detected " +
+ (clientToServer ?
+ "with the connection to remote client ":
+ "trying to send a message to remote client ") +
+ remotingSessionID + ", client VM ID=" + clientVMID + ". It is possible the client has exited without closing " +
+ "its connection(s) or the network has failed. All connection resources " +
+ "corresponding to that client process will now be removed.");
- }
-
+ closeConsumers(remotingSessionID);
+
+ dump();
}
- // Inner classes --------------------------------------------------------------------------------
-
- /** Class used to organize Callbacks on ClusteredConnectionFactories */
- static class ConnectionFactoryCallbackInformation
+ private synchronized void closeConsumers(String remotingClientSessionID)
{
-
- // We keep two lists, one containing all clients a CF will have to maintain and another
- // organized by JVMId as we will need that organization when cleaning up dead clients
- String uniqueName;
- Map</**VMID */ String , /** Active clients*/ConcurrentHashSet<PacketSender>> clientSendersByVM;
- ConcurrentHashSet<PacketSender> clientSenders;
-
-
- public ConnectionFactoryCallbackInformation(String uniqueName)
- {
- this.uniqueName = uniqueName;
- this.clientSendersByVM = new ConcurrentHashMap<String, ConcurrentHashSet<PacketSender>>();
- this.clientSenders = new ConcurrentHashSet<PacketSender>();
- }
-
- public void addClient(String vmID, PacketSender sender)
- {
- clientSenders.add(sender);
- getSendersList(vmID).add(sender);
- }
+ assert remotingClientSessionID != null;
- public PacketSender[] getAllSenders(String vmID)
+ List<ServerConnectionEndpoint> connectionEndpoints = endpoints.get(remotingClientSessionID);
+ // the connection endpoints are copied in a new list to avoid concurrent modification exception
+ List<ServerConnectionEndpoint> copy;
+ if (connectionEndpoints != null)
+ copy = new ArrayList<ServerConnectionEndpoint>(connectionEndpoints);
+ else
+ copy = new ArrayList<ServerConnectionEndpoint>();
+
+ for (ServerConnectionEndpoint sce : copy)
{
- Set<PacketSender> list = getSendersList(vmID);
- return (PacketSender[]) list.toArray(new PacketSender[list.size()]);
- }
-
- public PacketSender[] getAllSenders()
- {
- return (PacketSender[]) clientSenders.toArray(new PacketSender[clientSenders.size()]);
- }
-
- public void removeSender(String vmID, PacketSender sender)
- {
- clientSenders.remove(sender);
- getSendersList(vmID).remove(sender);
- }
-
- private ConcurrentHashSet<PacketSender> getSendersList(String vmID)
- {
- ConcurrentHashSet<PacketSender> perVMList = clientSendersByVM.get(vmID);
- if (perVMList == null)
+ try
{
- perVMList = new ConcurrentHashSet<PacketSender>();
- clientSendersByVM.put(vmID, perVMList);
- perVMList = clientSendersByVM.get(vmID);
+ log.debug("clearing up state for connection " + sce);
+ sce.close();
+ log.debug("cleared up state for connection " + sce);
}
- return perVMList;
+ catch (Exception e)
+ {
+ log.error("Failed to close connection", e);
+ }
}
}
private void dump()
{
- log.debug("***********Dumping conn map");
- for (Iterator iter = jmsClients.entrySet().iterator(); iter.hasNext(); )
- {
- Map.Entry entry = (Map.Entry)iter.next();
-
- String jmsClientVMID = (String)entry.getKey();
-
- Map endpoints = (Map)entry.getValue();
-
- log.debug(jmsClientVMID + "----->");
-
- for (Iterator iter2 = endpoints.entrySet().iterator(); iter2.hasNext(); )
- {
- Map.Entry entry2 = (Map.Entry)iter2.next();
-
- String sessionID = (String)entry2.getKey();
-
- ServerConnectionEndpoint endpoint = (ServerConnectionEndpoint)entry2.getValue();
-
- log.debug(" " + sessionID + "------>" + System.identityHashCode(endpoint));
- }
- }
- log.debug("*** Dumped conn map");
+ if (log.isDebugEnabled())
+ {
+ StringBuffer buff = new StringBuffer("*********** Dumping connections\n");
+ buff.append("this client VM ID: ").append(JMSClientVMIdentifier.instance).append("\n");
+ buff.append("remoting session ID <----> client VM ID:\n");
+ if (clients.size() == 0)
+ {
+ buff.append(" No registered sessions\n");
+ }
+ for (Entry<String, String> client : clients.entrySet())
+ {
+ String remotingSessionID = client.getKey();
+ String clientVMID = client.getValue();
+ buff.append(" ").append(remotingSessionID).append(" <----> ").append(clientVMID).append("\n");
+ }
+ buff.append("remoting session ID -----> server connection endpoints:\n");
+ if (endpoints.size() == 0)
+ {
+ buff.append(" No registered endpoints\n");
+ }
+ for (Entry<String, List<ServerConnectionEndpoint>> entry : endpoints.entrySet())
+ {
+ List<ServerConnectionEndpoint> connectionEndpoints = entry.getValue();
+ buff.append(" " + entry.getKey() + "----->\n");
+ for (ServerConnectionEndpoint sce : connectionEndpoints)
+ {
+ buff.append(" " + sce + " (" + System.identityHashCode(sce) + ")\n");
+ }
+ }
+ buff.append("*** Dumped connections");
+ log.debug(buff);
+ }
}
+
+ // Inner classes --------------------------------------------------------------------------------
}
Modified: trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -135,19 +135,4 @@
return new CreateConnectionResponse(connectionID);
}
-
- public void addSender(String VMID, String remotingSessionID,
- PacketSender sender) throws Exception
- {
- log.debug("Adding PacketSender on ConnectionFactory");
- messagingServer.getConnectionManager().addConnectionFactoryCallback(getID(), VMID, remotingSessionID, sender);
- }
-
- public void removeSender(String VMID, String remotingSessionID,
- PacketSender sender) throws Exception
- {
- log.debug("Removing PacketSender on ConnectionFactory");
- messagingServer.getConnectionManager().removeConnectionFactoryCallback(getID(), VMID, sender);
- }
-
}
Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -138,7 +138,7 @@
String sessionID = UUID.randomUUID().toString();
ServerSessionEndpoint ep =
- new ServerSessionEndpoint(sessionID, this, autoCommitSends, autoCommitAcks, xa, messagingServer.getResourceManager());
+ new ServerSessionEndpoint(sessionID, this, autoCommitSends, autoCommitAcks, xa, sender, messagingServer.getResourceManager());
synchronized (sessions)
{
@@ -189,7 +189,7 @@
temporaryQueues.clear();
- cm.unregisterConnection(jmsClientVMID, remotingClientSessionID);
+ cm.unregisterConnection(remotingClientSessionID, this);
messagingServer.getRemotingService().getDispatcher().unregister(id);
}
Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -178,7 +178,7 @@
try
{
- sessionEndpoint.handleDelivery(ref, this, replier);
+ sessionEndpoint.handleDelivery(ref, this);
}
catch (Exception e)
{
@@ -303,15 +303,6 @@
sessionEndpoint.promptDelivery(messageQueue);
}
- private PacketSender replier;
-
- //FIXME - this is a hack - we shouldn't have to wait for a change rate message before we can send
- //a message to the client
- private void setReplier(PacketSender replier)
- {
- this.replier = replier;
- }
-
// Inner classes --------------------------------------------------------------------------------
private class ServerConsumerEndpointPacketHandler extends ServerPacketHandlerSupport
@@ -330,8 +321,6 @@
if (type == CONS_FLOWTOKEN)
{
- setReplier(sender);
-
ConsumerFlowTokenMessage message = (ConsumerFlowTokenMessage) packet;
receiveTokens(message.getTokens());
@@ -339,8 +328,6 @@
else if (type == CLOSE)
{
close();
-
- setReplier(null);
}
else
{
Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -170,12 +170,14 @@
private final ResourceManager resourceManager;
+ private PacketSender sender;
+
// Constructors
// ---------------------------------------------------------------------------------
ServerSessionEndpoint(String sessionID,
ServerConnectionEndpoint connectionEndpoint, boolean autoCommitSends,
- boolean autoCommitAcks, boolean xa, ResourceManager resourceManager)
+ boolean autoCommitAcks, boolean xa, PacketSender sender, ResourceManager resourceManager)
throws Exception
{
this.id = sessionID;
@@ -194,6 +196,8 @@
this.autoCommitSends = autoCommitSends;
this.autoCommitAcks = autoCommitAcks;
+
+ this.sender = sender;
this.resourceManager = resourceManager;
}
@@ -230,11 +234,8 @@
}
}
- synchronized void handleDelivery(MessageReference ref, ServerConsumerEndpoint consumer, PacketSender sender) throws Exception
+ synchronized void handleDelivery(MessageReference ref, ServerConsumerEndpoint consumer) throws Exception
{
- // FIXME - we shouldn't have to pass in the packet Sender - this should be
- // creatable
- // without the consumer having to call change rate first
Delivery delivery = new DeliveryImpl(ref, consumer.getID(),
deliveryIDSequence++, sender);
Modified: trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -189,7 +189,7 @@
securityDeployer.start();
queueSettingsDeployer.start();
connectionManager.start();
- remotingService.addConnectionExceptionListener(connectionManager);
+ remotingService.addFailureListener(connectionManager);
memoryManager.start();
postOffice.start();
MessagingServerPacketHandler serverPacketHandler = new MessagingServerPacketHandler(this);
@@ -236,7 +236,7 @@
securityDeployer.stop();
queueSettingsDeployer.stop();
connectionManager.stop();
- remotingService.removeConnectionExceptionListener(connectionManager);
+ remotingService.removeFailureListener(connectionManager);
connectionManager = null;
memoryManager.stop();
memoryManager = null;
Deleted: trunk/src/main/org/jboss/messaging/core/remoting/Client.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/Client.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/Client.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,58 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.util.MessagingException;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public interface Client
-{
-
- void connect() throws Exception;
-
- boolean disconnect() throws Exception;
-
- boolean isConnected();
-
- String getURI();
-
- String getSessionID();
-
- /**
- * @param packet
- * The packet which is sent
- * @param oneWay
- * if the packet must be sent one-way (i.e. do not wait for a
- * response)
- * @return an {@link AbstractPacket} (if <code>oneWay</code> was set to
- * <code>false</code>) or <code>null</code> (if
- * <code>oneWay</code> was set to <code>true</code>)
- *
- * @throws MessagingException
- * if an exception has occured on the server
- * @throws IOException
- * if an exception has occured on the network
- */
- AbstractPacket send(AbstractPacket packet, boolean oneWay)
- throws Exception;
-
- void setBlockingRequestTimeout(int timeout, TimeUnit unit);
-
- void setFailureListener(final FailureListener listener);
-
- FailureListener getFailureListener();
-}
\ No newline at end of file
Deleted: trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,19 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public interface ConnectionExceptionListener
-{
- void handleConnectionException(Throwable t, String sessionID);
-
-}
Modified: trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,7 +6,6 @@
*/
package org.jboss.messaging.core.remoting;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
import org.jboss.messaging.core.remoting.impl.invm.INVMConnector;
import org.jboss.messaging.core.remoting.impl.mina.MinaService;
Modified: trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -18,7 +18,9 @@
public interface KeepAliveFactory
{
- Ping ping();
+ Ping ping(String sessionID);
- Pong pong();
+ Pong pong(String sessionID, Ping ping);
+
+ boolean isPing(String sessionID, Object message);
}
Modified: trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -14,7 +14,6 @@
import java.util.concurrent.ConcurrentHashMap;
import org.jboss.messaging.core.remoting.wireformat.Packet;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
import org.jboss.messaging.util.Logger;
/**
@@ -36,7 +35,6 @@
// Static --------------------------------------------------------
public static final PacketDispatcher client = new PacketDispatcher();
- public static final Map<String, String> sessions = new ConcurrentHashMap<String, String>();
// Constructors --------------------------------------------------
@@ -89,18 +87,6 @@
public void dispatch(Packet packet, PacketSender sender) throws Exception
{
- //FIXME better separation between client and server PacketDispatchers
- if (this != client)
- {
- if (packet instanceof SessionSetIDMessage)
- {
- String clientSessionID = ((SessionSetIDMessage)packet).getSessionID();
- if (log.isDebugEnabled())
- log.debug("associated server session " + sender.getSessionID() + " to client " + clientSessionID);
- sessions.put(sender.getSessionID(), clientSessionID);
- return;
- }
- }
String targetID = packet.getTargetID();
if (NO_ID_SET.equals(targetID))
{
Modified: trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,6 +6,7 @@
*/
package org.jboss.messaging.core.remoting;
+import org.jboss.jms.client.api.FailureListener;
import org.jboss.messaging.core.MessagingComponent;
/**
@@ -24,7 +25,7 @@
void removeInterceptor(Interceptor interceptor);
- void addConnectionExceptionListener(ConnectionExceptionListener listener);
+ void addFailureListener(FailureListener listener);
- void removeConnectionExceptionListener(ConnectionExceptionListener listener);
+ void removeFailureListener(FailureListener listener);
}
Added: trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.codec;
+
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
+
+import org.jboss.messaging.core.remoting.wireformat.Ping;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ */
+public class PingCodec extends AbstractPacketCodec<Ping>
+{
+
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ public PingCodec()
+ {
+ super(PING);
+ }
+
+ // Public --------------------------------------------------------
+
+ // AbstractPacketCodec overrides ---------------------------------
+
+ @Override
+ protected void encodeBody(Ping packet, RemotingBuffer out)
+ throws Exception
+ {
+ String clientSessionID = packet.getSessionID();
+
+ out.putInt(sizeof(clientSessionID));
+ out.putNullableString(clientSessionID);
+ }
+
+ @Override
+ protected Ping decodeBody(RemotingBuffer in)
+ throws Exception
+ {
+ int bodyLength = in.getInt();
+ if (bodyLength > in.remaining())
+ {
+ return null;
+ }
+ String clientSessionID = in.getNullableString();
+
+ return new Ping(clientSessionID);
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Added: trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.codec;
+
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
+
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ */
+public class PongCodec extends AbstractPacketCodec<Pong>
+{
+
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ public PongCodec()
+ {
+ super(PONG);
+ }
+
+ // Public --------------------------------------------------------
+
+ // AbstractPacketCodec overrides ---------------------------------
+
+ @Override
+ protected void encodeBody(Pong packet, RemotingBuffer out) throws Exception
+ {
+ String sessionID = packet.getSessionID();
+ boolean sessionFailed = packet.isSessionFailed();
+
+ int bodyLength = sizeof(sessionID) + BOOLEAN_LENGTH;
+
+ out.putInt(bodyLength);
+ out.putNullableString(sessionID);
+ out.putBoolean(sessionFailed);
+ }
+
+ @Override
+ protected Pong decodeBody(RemotingBuffer in) throws Exception
+ {
+ int bodyLength = in.getInt();
+ if (bodyLength > in.remaining())
+ {
+ return null;
+ }
+ String sessionID = in.getNullableString();
+ boolean sessionFailed = in.getBoolean();
+ return new Pong(sessionID, sessionFailed);
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Deleted: trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,67 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.codec;
-
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SETID;
-
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- */
-public class SessionSetIDMessageCodec extends
- AbstractPacketCodec<SessionSetIDMessage>
-{
-
- // Constants -----------------------------------------------------
-
- // Attributes ----------------------------------------------------
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- public SessionSetIDMessageCodec()
- {
- super(SESS_SETID);
- }
-
- // Public --------------------------------------------------------
-
- // AbstractPacketCodec overrides ---------------------------------
-
- @Override
- protected void encodeBody(SessionSetIDMessage message, RemotingBuffer out)
- throws Exception
- {
- String sessionID = message.getSessionID();
-
- out.putInt(sizeof(sessionID));
- out.putNullableString(sessionID);
- }
-
- @Override
- protected SessionSetIDMessage decodeBody(RemotingBuffer in) throws Exception
- {
- int bodyLength = in.getInt();
- if (bodyLength > in.remaining())
- {
- return null;
- }
- String sessionID = in.getNullableString();
-
- return new SessionSetIDMessage(sessionID);
- }
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- // Inner classes -------------------------------------------------
-}
\ No newline at end of file
Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,202 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import java.util.concurrent.TimeUnit;
-
-import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.Client;
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.NIOSession;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.util.Logger;
-import org.jboss.messaging.util.MessagingException;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- *
- * @version <tt>$Revision$</tt>
- */
-public class ClientImpl implements Client
-{
- // Constants -----------------------------------------------------
-
- private final Logger log = Logger.getLogger(ClientImpl.class);
-
- // Attributes ----------------------------------------------------
-
- private final NIOConnector connector;
-
- private NIOSession session;
-
- // By default, a blocking request will timeout after 5 seconds
- private int blockingRequestTimeout = 5;
-
- private TimeUnit blockingRequestTimeUnit = SECONDS;
-
- private FailureListener failureListener;
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- public ClientImpl(NIOConnector connector, RemotingConfiguration remotingConfig)
- {
- assert connector != null;
- assert remotingConfig != null;
-
- this.connector = connector;
- setBlockingRequestTimeout(remotingConfig.getTimeout(), SECONDS);
- }
-
- // Public --------------------------------------------------------
-
- /* (non-Javadoc)
- * @see org.jboss.messaging.core.remoting.Client#connect()
- */
- public void connect() throws Exception
- {
- this.session = connector.connect();
- }
-
- /* (non-Javadoc)
- * @see org.jboss.messaging.core.remoting.Client#disconnect()
- */
- public boolean disconnect() throws Exception
- {
- if (session == null)
- {
- return false;
- }
- session = null;
- return true;
- }
-
- /* (non-Javadoc)
- * @see org.jboss.messaging.core.remoting.Client#getSessionID()
- */
- public String getSessionID()
- {
- if (session == null || !session.isConnected())
- {
- return null;
- }
- return session.getID();
- }
-
- public AbstractPacket send(AbstractPacket packet, boolean oneWay)
- throws Exception
- {
- assert packet != null;
- checkConnected();
- packet.setOneWay(oneWay);
-
- if (oneWay)
- {
- sendOneWay(packet);
- return null;
- } else
- {
- return sendBlocking(packet);
- }
- }
-
- /* (non-Javadoc)
- * @see org.jboss.messaging.core.remoting.Client#setBlockingRequestTimeout(int, java.util.concurrent.TimeUnit)
- */
- public void setBlockingRequestTimeout(int timeout, TimeUnit unit)
- {
- this.blockingRequestTimeout = timeout;
- this.blockingRequestTimeUnit = unit;
- }
-
- public void setFailureListener(final FailureListener listener)
- {
- if (listener == null && failureListener != null)
- {
- connector.removeFailureListener(failureListener);
-
- failureListener = null;
- }
- else
- {
- if (failureListener != null)
- {
- throw new IllegalStateException("Cannot set FailureListener - already has one set");
- }
- connector.addFailureListener(listener);
-
- failureListener = listener;
- }
- }
-
- public FailureListener getFailureListener()
- {
- return failureListener;
- }
-
- /* (non-Javadoc)
- * @see org.jboss.messaging.core.remoting.Client#isConnected()
- */
- public boolean isConnected()
- {
- if (session == null)
- return false;
- else
- return session.isConnected();
- }
-
- /* (non-Javadoc)
- * @see org.jboss.messaging.core.remoting.Client#getURI()
- */
- public String getURI()
- {
- return connector.getServerURI();
- }
-
- @Override
- public String toString()
- {
- return "Client[session=" + session + "]";
- }
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- private void checkConnected() throws MessagingException
- {
- if (session == null)
- {
- throw new IllegalStateException("Client " + this
- + " is not connected.");
- }
- if (!session.isConnected())
- {
- throw new MessagingException(MessagingException.NOT_CONNECTED);
- }
- }
-
- private void sendOneWay(AbstractPacket packet) throws Exception
- {
- session.write(packet);
- }
-
- private AbstractPacket sendBlocking(AbstractPacket packet) throws Exception
- {
- AbstractPacket response = (AbstractPacket) session.writeAndBlock(packet,
- blockingRequestTimeout, blockingRequestTimeUnit);
- return response;
- }
-
- // Inner classes -------------------------------------------------
-}
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -10,7 +10,6 @@
import java.util.concurrent.TimeUnit;
-import org.jboss.jms.exception.JMSExceptionHelper;
import org.jboss.messaging.core.remoting.NIOSession;
import org.jboss.messaging.core.remoting.PacketDispatcher;
import org.jboss.messaging.core.remoting.PacketSender;
@@ -33,7 +32,8 @@
private String id;
private long correlationCounter;
private PacketDispatcher serverDispatcher;
-
+ private boolean connected;
+
// Static --------------------------------------------------------
private static final Logger log = Logger.getLogger(INVMSession.class);
@@ -46,12 +46,14 @@
this.id = randomUUID().toString();
this.correlationCounter = 0;
this.serverDispatcher = serverDispatcher;
+ connected = true;
}
// Public --------------------------------------------------------
public boolean close()
{
+ connected = false;
return true;
}
@@ -64,7 +66,7 @@
public boolean isConnected()
{
- return true;
+ return connected;
}
public void write(final Object object) throws Exception
@@ -95,10 +97,26 @@
serverDispatcher.dispatch(request,
new PacketSender()
{
- public void send(Packet response) throws Exception
+ public void send(Packet response)
{
- serverDispatcher.callFilters(response);
- responses[0] = response;
+ try
+ {
+ serverDispatcher.callFilters(response);
+ // 1st response is used to reply to the blocking request
+ if (responses[0] == null)
+ {
+ responses[0] = response;
+ } else
+ // other later responses are dispatched directly to the client
+ {
+ PacketDispatcher.client.dispatch(response, null);
+ }
+ }
+ catch (Exception e)
+ {
+ log.warn("An interceptor throwed an exception what caused the packet " + response + " to be ignored", e);
+ responses[0] = null;
+ }
}
public String getSessionID()
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -21,7 +21,7 @@
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
-
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
@@ -30,16 +30,21 @@
// KeepAliveFactory implementation -------------------------------
- public Ping ping()
+ public Ping ping(String clientSessionID)
{
- return new Ping();
+ return new Ping(clientSessionID);
}
- public Pong pong()
+ public boolean isPing(String sessionID, Object message)
{
- return new Pong();
+ return (message instanceof Ping);
}
+ public Pong pong(String sessionID, Ping ping)
+ {
+ return new Pong(sessionID, false);
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,20 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl.mina;
-
-
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public interface ConnectionExceptionNotifier
-{
- public abstract void fireConnectionException(Throwable t, String remoteSessionID);
-}
\ No newline at end of file
Copied: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java (from rev 3699, trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java)
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,22 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.mina;
+
+import org.jboss.messaging.util.MessagingException;
+
+
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public interface FailureNotifier
+{
+ public abstract void fireFailure(MessagingException e);
+}
\ No newline at end of file
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -41,11 +41,12 @@
// Public --------------------------------------------------------
public static void addKeepAliveFilter(DefaultIoFilterChainBuilder filterChain,
- KeepAliveFactory factory, int keepAliveInterval, int keepAliveTimeout)
+ KeepAliveFactory factory, int keepAliveInterval, int keepAliveTimeout, FailureNotifier notifier)
{
assert filterChain != null;
assert factory != null;
-
+ assert notifier != null;
+
if (keepAliveTimeout > keepAliveInterval)
{
throw new IllegalArgumentException("timeout must be greater than the interval: "
@@ -54,7 +55,7 @@
}
filterChain.addLast("keep-alive", new KeepAliveFilter(
- new MinaKeepAliveFactory(factory), EXCEPTION, keepAliveInterval,
+ new MinaKeepAliveFactory(factory, notifier), EXCEPTION, keepAliveInterval,
keepAliveTimeout));
}
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -15,8 +15,8 @@
import java.io.IOException;
import java.net.InetSocketAddress;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.mina.common.CloseFuture;
@@ -28,16 +28,16 @@
import org.apache.mina.common.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
import org.jboss.messaging.core.remoting.KeepAliveFactory;
import org.jboss.messaging.core.remoting.NIOConnector;
import org.jboss.messaging.core.remoting.NIOSession;
import org.jboss.messaging.core.remoting.PacketDispatcher;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
+import org.jboss.messaging.core.remoting.wireformat.Ping;
import org.jboss.messaging.util.Logger;
import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -45,7 +45,7 @@
* @version <tt>$Revision$</tt>
*
*/
-public class MinaConnector implements NIOConnector, ConnectionExceptionNotifier
+public class MinaConnector implements NIOConnector, FailureNotifier
{
// Constants -----------------------------------------------------
@@ -61,9 +61,8 @@
private IoSession session;
- // FIXME clean up this listener mess
- private Map<FailureListener, IoServiceListener> listeners = new HashMap<FailureListener, IoServiceListener>();
- private ConnectionExceptionListener listener;
+ private List<FailureListener> listeners = new ArrayList<FailureListener>();
+ private IoServiceListenerAdapter ioListener;
// Static --------------------------------------------------------
@@ -91,7 +90,7 @@
addLoggingFilter(filterChain);
blockingScheduler = addBlockingRequestResponseFilter(filterChain);
addKeepAliveFilter(filterChain, keepAliveFactory, configuration.getKeepAliveInterval(),
- configuration.getKeepAliveTimeout());
+ configuration.getKeepAliveTimeout(), this);
addExecutorFilter(filterChain);
connector.setHandler(new MinaHandler(PacketDispatcher.client, this));
@@ -110,6 +109,8 @@
InetSocketAddress address = new InetSocketAddress(configuration.getHost(), configuration.getPort());
ConnectFuture future = connector.connect(address);
connector.setDefaultRemoteAddress(address);
+ ioListener = new IoServiceListenerAdapter();
+ connector.addListener(ioListener);
future.awaitUninterruptibly();
if (!future.isConnected())
@@ -117,8 +118,7 @@
throw new IOException("Cannot connect to " + address.toString());
}
this.session = future.getSession();
- AbstractPacket packet = new SessionSetIDMessage(Long.toString(session
- .getId()));
+ AbstractPacket packet = new Ping(Long.toString(session.getId()));
session.write(packet);
return new MinaSession(session);
@@ -134,6 +134,7 @@
CloseFuture closeFuture = session.close().awaitUninterruptibly();
boolean closed = closeFuture.isClosed();
+ connector.removeListener(ioListener);
connector.dispose();
blockingScheduler.shutdown();
@@ -144,25 +145,22 @@
return closed;
}
- public void addFailureListener(final FailureListener listener)
+ public synchronized void addFailureListener(final FailureListener listener)
{
assert listener != null;
assert connector != null;
- IoServiceListener ioListener = new IoServiceListenerAdapter(listener);
- connector.addListener(ioListener);
- listeners.put(listener, ioListener);
+ listeners.add(listener);
if (log.isTraceEnabled())
log.trace("added listener " + listener + " to " + this);
}
- public void removeFailureListener(FailureListener listener)
+ public synchronized void removeFailureListener(FailureListener listener)
{
assert listener != null;
assert connector != null;
- connector.removeListener(listeners.get(listener));
listeners.remove(listener);
if (log.isTraceEnabled())
@@ -173,25 +171,13 @@
{
return configuration.getURI();
}
-
- public void setConnectionExceptionListener(ConnectionExceptionListener listener)
- {
- assert listener != null;
-
- this.listener = listener;
- }
- // ConnectionExceptionNotifier implementation -------------------------------
+ // FailureNotifier implementation -------------------------------
- public void fireConnectionException(Throwable cause, String remoteSessionID)
+ public synchronized void fireFailure(MessagingException me)
{
- if (listener != null)
- listener.handleConnectionException(cause, remoteSessionID);
-
- for (FailureListener listener: listeners.keySet())
+ for (FailureListener listener: listeners)
{
- MessagingException me = new MessagingException(MessagingException.CONNECTION_TIMEDOUT, "Timed out");
-
listener.onFailure(me);
}
}
@@ -216,11 +202,8 @@
private final Logger log = Logger
.getLogger(IoServiceListenerAdapter.class);
- private final FailureListener listener;
-
- private IoServiceListenerAdapter(FailureListener listener)
+ private IoServiceListenerAdapter()
{
- this.listener = listener;
}
public void serviceActivated(IoService service)
@@ -250,11 +233,9 @@
public void sessionDestroyed(IoSession session)
{
log.warn("destroyed session " + session);
-
- MessagingException me =
- new MessagingException(MessagingException.INTERNAL_ERROR, "MINA session has been destroyed");
- if (listener != null)
- listener.onFailure(me);
+ RemotingException re =
+ new RemotingException(MessagingException.INTERNAL_ERROR, "MINA session has been destroyed", Long.toString(session.getId()));
+ fireFailure(re);
}
}
}
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,20 +6,17 @@
*/
package org.jboss.messaging.core.remoting.impl.mina;
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.keepalive.KeepAliveTimeoutException;
import org.apache.mina.filter.reqres.Response;
-import org.jboss.jms.exception.JMSExceptionHelper;
import org.jboss.messaging.core.remoting.PacketDispatcher;
import org.jboss.messaging.core.remoting.PacketSender;
import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
import org.jboss.messaging.core.remoting.wireformat.Packet;
import org.jboss.messaging.core.remoting.wireformat.Ping;
import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -37,16 +34,16 @@
private final PacketDispatcher dispatcher;
- private ConnectionExceptionNotifier connectionExceptionNotifier;
+ private FailureNotifier failureNotifier;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
- public MinaHandler(PacketDispatcher dispatcher, ConnectionExceptionNotifier keepAliveNotifier)
+ public MinaHandler(PacketDispatcher dispatcher, FailureNotifier failureNotifier)
{
this.dispatcher = dispatcher;
- this.connectionExceptionNotifier = keepAliveNotifier;
+ this.failureNotifier = failureNotifier;
}
// Public --------------------------------------------------------
@@ -57,10 +54,14 @@
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception
{
- if (connectionExceptionNotifier != null)
+ log.error("caught exception " + cause + " for session " + session);
+
+ if (failureNotifier != null)
{
String serverSessionID = Long.toString(session.getId());
- connectionExceptionNotifier.fireConnectionException(cause, serverSessionID);
+ RemotingException re = new RemotingException(MessagingException.INTERNAL_ERROR, "unexpected exception", serverSessionID);
+ re.initCause(cause);
+ failureNotifier.fireFailure(re);
}
// FIXME ugly way to know we're on the server side
// close session only on the server side
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -11,54 +11,81 @@
import org.jboss.messaging.core.remoting.KeepAliveFactory;
import org.jboss.messaging.core.remoting.wireformat.Ping;
import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
+ *
* @version <tt>$Revision$</tt>
- *
+ *
*/
public class MinaKeepAliveFactory implements KeepAliveMessageFactory
{
- // Constants -----------------------------------------------------
+ // Constant ------------------------------------------------------
+ private static final Logger log = Logger
+ .getLogger(MinaKeepAliveFactory.class);
+
// Attributes ----------------------------------------------------
private KeepAliveFactory innerFactory;
+ private FailureNotifier notifier;
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
- public MinaKeepAliveFactory(KeepAliveFactory factory)
+ public MinaKeepAliveFactory(KeepAliveFactory factory,
+ FailureNotifier notifier)
{
assert factory != null;
-
+
+ this.notifier = notifier;
this.innerFactory = factory;
}
// Public --------------------------------------------------------
// KeepAliveMessageFactory implementation ------------------------
-
+
public Object getRequest(IoSession session)
{
- return innerFactory.ping();
+ return innerFactory.ping(Long.toString(session.getId()));
}
public Object getResponse(IoSession session, Object request)
{
- return innerFactory.pong();
+ assert request instanceof Ping;
+
+ return innerFactory.pong(Long.toString(session.getId()), (Ping) request);
}
public boolean isRequest(IoSession session, Object request)
{
- return (request instanceof Ping);
+ return innerFactory.isPing(Long.toString(session.getId()), request);
}
public boolean isResponse(IoSession session, Object response)
{
- return (response instanceof Pong);
+ if (response instanceof Pong)
+ {
+ Pong pong = (Pong) response;
+ if (pong.isSessionFailed() && notifier != null)
+ {
+ // FIXME better error code
+ notifier.fireFailure(new RemotingException(
+ MessagingException.CONNECTION_TIMEDOUT,
+ "Session has failed on the server", Long.toString(session
+ .getId())));
+ }
+ return true;
+ } else
+ {
+ return false;
+ }
}
// Package protected ---------------------------------------------
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -19,16 +19,21 @@
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.jboss.beans.metadata.api.annotations.Install;
import org.jboss.beans.metadata.api.annotations.Uninstall;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
+import org.jboss.jms.client.api.FailureListener;
import org.jboss.messaging.core.remoting.Interceptor;
-import org.jboss.messaging.core.remoting.KeepAliveFactory;
import org.jboss.messaging.core.remoting.PacketDispatcher;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
import org.jboss.messaging.core.remoting.RemotingService;
import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -36,7 +41,7 @@
* @version <tt>$Revision$</tt>
*
*/
-public class MinaService implements RemotingService, ConnectionExceptionNotifier
+public class MinaService implements RemotingService, FailureNotifier
{
// Constants -----------------------------------------------------
@@ -50,11 +55,13 @@
private NioSocketAcceptor acceptor;
+ private IoServiceListener acceptorListener;
+
private PacketDispatcher dispatcher;
- private List<ConnectionExceptionListener> listeners = new ArrayList<ConnectionExceptionListener>();
+ private List<FailureListener> listeners = new ArrayList<FailureListener>();
- private KeepAliveFactory factory;
+ private ServerKeepAliveFactory factory;
private List<Interceptor> filters = new CopyOnWriteArrayList<Interceptor>();
@@ -67,7 +74,7 @@
this(remotingConfig, new ServerKeepAliveFactory());
}
- public MinaService(RemotingConfiguration remotingConfig, KeepAliveFactory factory)
+ public MinaService(RemotingConfiguration remotingConfig, ServerKeepAliveFactory factory)
{
assert remotingConfig != null;
assert factory != null;
@@ -89,14 +96,14 @@
this.filters.remove(filter);
}
- public void addConnectionExceptionListener(ConnectionExceptionListener listener)
+ public void addFailureListener(FailureListener listener)
{
assert listener != null;
listeners.add(listener);
}
- public void removeConnectionExceptionListener(ConnectionExceptionListener listener)
+ public void removeFailureListener(FailureListener listener)
{
assert listener != null;
@@ -119,7 +126,7 @@
addCodecFilter(filterChain);
addLoggingFilter(filterChain);
addKeepAliveFilter(filterChain, factory,
- remotingConfig.getKeepAliveInterval(), remotingConfig.getKeepAliveTimeout());
+ remotingConfig.getKeepAliveInterval(), remotingConfig.getKeepAliveTimeout(), this);
addExecutorFilter(filterChain);
// Bind
@@ -131,7 +138,9 @@
acceptor.setHandler(new MinaHandler(dispatcher, this));
acceptor.bind();
-
+ acceptorListener = new MinaSessionListener();
+ acceptor.addListener(acceptorListener);
+
boolean disableInvm = remotingConfig.isInvmDisabled();
if (log.isDebugEnabled())
log.debug("invm optimization for remoting is " + (disableInvm ? "disabled" : "enabled"));
@@ -146,6 +155,9 @@
{
if (acceptor != null)
{
+ // remove the listener before disposing the acceptor
+ // so that we're not notified when the sessions are destroyed
+ acceptor.removeListener(acceptorListener);
acceptor.unbind();
acceptor.dispose();
acceptor = null;
@@ -174,20 +186,26 @@
return acceptor.getFilterChain();
}
- // ConnectionExceptionNotifier implementation -------------------------------
+ // FailureNotifier implementation -------------------------------
- public void fireConnectionException(Throwable t, String remoteSessionID)
+ public void fireFailure(MessagingException me)
{
- for (ConnectionExceptionListener listener : listeners)
+ if (me instanceof RemotingException)
{
- String clientSessionID = PacketDispatcher.sessions.get(remoteSessionID);
- listener.handleConnectionException(t, clientSessionID);
- }
+ RemotingException re = (RemotingException) me;
+ String sessionID = re.getSessionID();
+ String clientSessionID = factory.getSessions().get(sessionID);
+ for (FailureListener listener : listeners)
+ {
+ listener.onFailure(new RemotingException(re.getCode(), re.getMessage(), clientSessionID));
+ }
+ factory.getSessions().remove(sessionID);
+ }
}
// Public --------------------------------------------------------
- public void setKeepAliveFactory(KeepAliveFactory factory)
+ public void setKeepAliveFactory(ServerKeepAliveFactory factory)
{
assert factory != null;
@@ -208,4 +226,32 @@
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
-}
+
+ private final class MinaSessionListener implements IoServiceListener {
+
+ public void serviceActivated(IoService service)
+ {
+ }
+
+ public void serviceDeactivated(IoService service)
+ {
+ }
+
+ public void serviceIdle(IoService service, IdleStatus idleStatus)
+ {
+ }
+
+ public void sessionCreated(IoSession session)
+ {
+ }
+
+ public void sessionDestroyed(IoSession session)
+ {
+ String sessionID = Long.toString(session.getId());
+ if (factory.getSessions().containsKey(sessionID))
+ {
+ fireFailure(new RemotingException(MessagingException.INTERNAL_ERROR, "MINA session destroyed", sessionID));
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -7,8 +7,6 @@
package org.jboss.messaging.core.remoting.impl.mina;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.NULL;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;
import org.jboss.messaging.core.remoting.codec.AbstractPacketCodec;
@@ -20,6 +18,8 @@
import org.jboss.messaging.core.remoting.codec.CreateConnectionResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.DeliverMessageCodec;
import org.jboss.messaging.core.remoting.codec.MessagingExceptionMessageCodec;
+import org.jboss.messaging.core.remoting.codec.PingCodec;
+import org.jboss.messaging.core.remoting.codec.PongCodec;
import org.jboss.messaging.core.remoting.codec.RemotingBuffer;
import org.jboss.messaging.core.remoting.codec.SessionAcknowledgeMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionAddAddressMessageCodec;
@@ -40,7 +40,6 @@
import org.jboss.messaging.core.remoting.codec.SessionQueueQueryResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionRemoveAddressMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionSendMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionSetIDMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionXACommitMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionXAEndMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionXAForgetMessageCodec;
@@ -96,7 +95,6 @@
import org.jboss.messaging.core.remoting.wireformat.SessionRemoveAddressMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionRollbackMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionSendMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionXACommitMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionXAEndMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionXAForgetMessage;
@@ -140,9 +138,8 @@
addCodec(TextPacket.class, TextPacketCodec.class);
addCodec(BytesPacket.class, BytesPacketCodec.class);
- addCodecForEmptyPacket(PING, Ping.class);
- addCodecForEmptyPacket(PONG, Pong.class);
- addCodec(SessionSetIDMessage.class, SessionSetIDMessageCodec.class);
+ addCodec(Ping.class, PingCodec.class);
+ addCodec(Pong.class, PongCodec.class);
addCodec(MessagingExceptionMessage.class, MessagingExceptionMessageCodec.class);
Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,22 +6,36 @@
*/
package org.jboss.messaging.core.remoting.impl.mina;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
import org.jboss.messaging.core.remoting.KeepAliveFactory;
import org.jboss.messaging.core.remoting.wireformat.Ping;
import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.Logger;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
+ *
* @version <tt>$Revision$</tt>
- *
+ *
*/
public class ServerKeepAliveFactory implements KeepAliveFactory
{
// Constants -----------------------------------------------------
+ private static final Logger log = Logger
+ .getLogger(ServerKeepAliveFactory.class);
+
// Attributes ----------------------------------------------------
+ // FIXME session mapping must be cleaned when the server session is closed:
+ // either normally or exceptionally
+ /**
+ * Key = server session ID Value = client session ID
+ */
+ private Map<String, String> sessions = new ConcurrentHashMap<String, String>();
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
@@ -29,17 +43,46 @@
// Public --------------------------------------------------------
// KeepAliveFactory implementation -------------------------------
-
- public Ping ping()
+
+ public Ping ping(String sessionID)
{
- return new Ping();
+ return new Ping(sessionID);
}
- public Pong pong()
+ public boolean isPing(String sessionID, Object message)
{
- return new Pong();
+ if (!(message instanceof Ping))
+ {
+ return false;
+ } else
+ {
+ Ping ping = (Ping) message;
+ String clientSessionID = ping.getSessionID();
+ if (clientSessionID.equals(sessionID))
+ {
+ return false;
+ } else
+ {
+ if (log.isDebugEnabled())
+ log.debug("associated server session " + sessionID
+ + " to client " + clientSessionID);
+ sessions.put(sessionID, clientSessionID);
+ return true;
+ }
+ }
}
+ public Pong pong(String sessionID, Ping ping)
+ {
+ String clientSessionID = ping.getSessionID();
+ return new Pong(sessionID, sessions.containsKey(clientSessionID));
+ }
+
+ public Map<String, String> getSessions()
+ {
+ return sessions;
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -8,7 +8,7 @@
import static org.jboss.messaging.core.remoting.Assert.assertValidID;
-import org.jboss.messaging.core.remoting.Client;
+import org.jboss.jms.client.remoting.MessagingRemotingConnection;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
@@ -37,7 +37,7 @@
* <code>oneWay</code> is <code>true</code> when the packet is sent "one way"
* by the client which does not expect any response to it.
*
- * @see Client#sendOneWay(AbstractPacket)
+ * @see MessagingRemotingConnection#sendOneWay(AbstractPacket)
*/
private boolean oneWay = false;
Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -35,7 +35,6 @@
CONN_STOP ((byte)33),
// Session
- SESS_SETID ((byte)40),
SESS_CREATECONSUMER ((byte)41),
SESS_CREATECONSUMER_RESP ((byte)42),
SESS_CREATEBROWSER ((byte)43),
Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,6 +6,7 @@
*/
package org.jboss.messaging.core.remoting.wireformat;
+import static org.jboss.messaging.core.remoting.Assert.assertValidID;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
/**
@@ -20,17 +21,34 @@
// Attributes ----------------------------------------------------
+ private final String sessionID;
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
- public Ping()
+ public Ping(String sessionID)
{
super(PING);
+
+ assertValidID(sessionID);
+
+ this.sessionID = sessionID;
}
// Public --------------------------------------------------------
+
+ public String getSessionID()
+ {
+ return sessionID;
+ }
+ @Override
+ public String toString()
+ {
+ return getParentString() + ", sessionID=" + sessionID + "]";
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,6 +6,7 @@
*/
package org.jboss.messaging.core.remoting.wireformat;
+import static org.jboss.messaging.core.remoting.Assert.assertValidID;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
/**
@@ -20,17 +21,42 @@
// Attributes ----------------------------------------------------
+ private final String sessionID;
+
+ private final boolean sessionFailed;
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
- public Pong()
+ public Pong(String sessionID, boolean sessionFailed)
{
super(PONG);
+
+ assertValidID(sessionID);
+
+ this.sessionID = sessionID;
+ this.sessionFailed = sessionFailed;
}
-
+
// Public --------------------------------------------------------
+ public String getSessionID()
+ {
+ return sessionID;
+ }
+
+ public boolean isSessionFailed()
+ {
+ return sessionFailed;
+ }
+
+ @Override
+ public String toString()
+ {
+ return getParentString() + ", sessionID=" + sessionID + ", sessionFailed=" + sessionFailed + "]";
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
Deleted: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,57 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.wireformat;
-
-import static org.jboss.messaging.core.remoting.Assert.assertValidID;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SETID;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- *
- * @version <tt>$Revision$</tt>
- */
-public class SessionSetIDMessage extends AbstractPacket
-{
- // Constants -----------------------------------------------------
-
- // Attributes ----------------------------------------------------
-
- private final String sessionID;
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- public SessionSetIDMessage(String sessionID)
- {
- super(SESS_SETID);
-
- assertValidID(sessionID);
- this.sessionID = sessionID;
- }
-
- // Public --------------------------------------------------------
-
- public String getSessionID()
- {
- return sessionID;
- }
-
- @Override
- public String toString()
- {
- return getParentString() + ", sessionID=" + sessionID + "]";
- }
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- // Inner classes -------------------------------------------------
-}
\ No newline at end of file
Added: trunk/src/main/org/jboss/messaging/util/RemotingException.java
===================================================================
--- trunk/src/main/org/jboss/messaging/util/RemotingException.java (rev 0)
+++ trunk/src/main/org/jboss/messaging/util/RemotingException.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.util;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class RemotingException extends MessagingException
+{
+
+ // Constants -----------------------------------------------------
+
+ private static final long serialVersionUID = -6849945921631932738L;
+
+ // Attributes ----------------------------------------------------
+
+ private String sessionID;
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ public RemotingException(int code, String message, String sessionID)
+ {
+ super(code, message);
+ this.sessionID = sessionID;
+ }
+
+ // Public --------------------------------------------------------
+
+ public String getSessionID()
+ {
+ return sessionID;
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Modified: trunk/tests/build.xml
===================================================================
--- trunk/tests/build.xml 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/build.xml 2008-02-12 14:07:49 UTC (rev 3705)
@@ -491,6 +491,7 @@
<sysproperty key="objectstore.dir" value="${objectstore.dir}"/>
<jvmarg value="-Xmx512M"/>
<!--<jvmarg line="-Xmx512M -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"/>-->
+ <!--<jvmarg value="-ea"/>-->
<classpath refid="test.execution.classpath"/>
<formatter type="xml" usefile="${junit.formatter.usefile}"/>
<batchtest todir="${junit.batchtest.todir}"
@@ -505,14 +506,12 @@
<exclude name="**/jms/XARecoveryTest.class"/>
<exclude name="**/jms/XAResourceRecoveryTest.class"/>
<exclude name="**/jms/XATest.class"/>
- <exclude name="**/jms/ClientExitTest.class"/>
<exclude name="**/jms/ConnectionConsumerTest.class"/>
<include name="**/messaging/util/**/${test-mask}.class"/>
<exclude name="**/jms/MemLeakTest.class"/>
<exclude name="**/jms/RemotingConnectionConfigurationTest.class"/>
<exclude name="**/jms/stress/**"/>
- <exclude name="**/jms/crash/ClientCrashTest.class"/>
<exclude name="**/jms/bridge/**"/>
<exclude name="**/jms/manual/**"/>
<exclude name="**/jms/clustering/**"/>
Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,225 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.MANY_MESSAGES;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.reverse;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.jboss.messaging.core.remoting.Client;
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.PacketDispatcher;
-import org.jboss.messaging.core.remoting.PacketSender;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.mina.integration.test.ReversePacketHandler;
-import org.jboss.messaging.core.remoting.test.unit.TestPacketHandler;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.core.remoting.wireformat.TextPacket;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- *
- * @version <tt>$Revision$</tt>
- */
-public abstract class ClientTestBase extends TestCase
-{
- // Constants -----------------------------------------------------
-
- // Attributes ----------------------------------------------------
-
- protected Client client;
-
- protected ReversePacketHandler serverPacketHandler;
-
- protected PacketDispatcher serverDispatcher;
-
- private NIOConnector connector;
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- // Public --------------------------------------------------------
-
- public void testConnected() throws Exception
- {
- NIOConnector connector = createNIOConnector();
- Client client = new ClientImpl(connector, createRemotingConfiguration());
-
- assertFalse(client.isConnected());
-
- client.connect();
- assertTrue(client.isConnected());
-
- assertTrue(client.disconnect());
- assertFalse(client.isConnected());
- assertFalse(client.disconnect());
-
- connector.disconnect();
- }
-
- public void testSendOneWay() throws Exception
- {
- serverPacketHandler.expectMessage(1);
-
- TextPacket packet = new TextPacket("testSendOneWay");
- packet.setTargetID(serverPacketHandler.getID());
- client.send(packet, true);
-
- assertTrue(serverPacketHandler.await(2, SECONDS));
-
- List<TextPacket> messages = serverPacketHandler.getPackets();
- assertEquals(1, messages.size());
- String response = ((TextPacket) messages.get(0)).getText();
- assertEquals(packet.getText(), response);
- }
-
- public void testSendManyOneWay() throws Exception
- {
- serverPacketHandler.expectMessage(MANY_MESSAGES);
-
- TextPacket[] packets = new TextPacket[MANY_MESSAGES];
- for (int i = 0; i < MANY_MESSAGES; i++)
- {
- packets[i] = new TextPacket("testSendManyOneWay " + i);
- packets[i].setTargetID(serverPacketHandler.getID());
- client.send(packets[i], true);
- }
-
- assertTrue(serverPacketHandler.await(10, SECONDS));
-
- List<TextPacket> receivedPackets = serverPacketHandler.getPackets();
- assertEquals(MANY_MESSAGES, receivedPackets.size());
- for (int i = 0; i < MANY_MESSAGES; i++)
- {
- TextPacket receivedPacket = (TextPacket) receivedPackets.get(i);
- assertEquals(packets[i].getText(), receivedPacket.getText());
- }
- }
-
- public void testSendOneWayWithCallbackHandler() throws Exception
- {
- TestPacketHandler callbackHandler = new TestPacketHandler();
- callbackHandler.expectMessage(1);
-
- PacketDispatcher.client.register(callbackHandler);
-
- TextPacket packet = new TextPacket("testSendOneWayWithCallbackHandler");
- packet.setTargetID(serverPacketHandler.getID());
- packet.setCallbackID(callbackHandler.getID());
-
- client.send(packet, true);
-
- assertTrue(callbackHandler.await(5, SECONDS));
-
- assertEquals(1, callbackHandler.getPackets().size());
- String response = callbackHandler.getPackets().get(0).getText();
- assertEquals(reverse(packet.getText()), response);
- }
-
- public void testSendBlocking() throws Exception
- {
- TextPacket request = new TextPacket("testSendBlocking");
- request.setTargetID(serverPacketHandler.getID());
-
- AbstractPacket receivedPacket = client.send(request, false);
-
- assertNotNull(receivedPacket);
- assertTrue(receivedPacket instanceof TextPacket);
- TextPacket response = (TextPacket) receivedPacket;
- assertEquals(reverse(request.getText()), response.getText());
- }
-
- public void testCorrelationCounter() throws Exception
- {
- TextPacket request = new TextPacket("testSendBlocking");
- request.setTargetID(serverPacketHandler.getID());
-
- AbstractPacket receivedPacket = client.send(request, false);
- long correlationID = request.getCorrelationID();
-
- assertNotNull(receivedPacket);
- assertEquals(request.getCorrelationID(), receivedPacket.getCorrelationID());
-
- receivedPacket = client.send(request, false);
- assertEquals(correlationID + 1, request.getCorrelationID());
- assertEquals(correlationID + 1, receivedPacket.getCorrelationID());
- }
-
- public void testClientHandlePacketSentByServer() throws Exception
- {
- TestPacketHandler clientHandler = new TestPacketHandler();
- PacketDispatcher.client.register(clientHandler);
-
- serverPacketHandler.expectMessage(1);
- clientHandler.expectMessage(1);
-
- TextPacket packet = new TextPacket(
- "testClientHandlePacketSentByServer from client");
- packet.setTargetID(serverPacketHandler.getID());
- // send a packet to create a sender when the server
- // handles the packet
- client.send(packet, true);
-
- assertTrue(serverPacketHandler.await(2, SECONDS));
-
- assertNotNull(serverPacketHandler.getLastSender());
- PacketSender sender = serverPacketHandler.getLastSender();
- TextPacket packetFromServer = new TextPacket(
- "testClientHandlePacketSentByServer from server");
- packetFromServer.setTargetID(clientHandler.getID());
- sender.send(packetFromServer);
-
- assertTrue(clientHandler.await(2, SECONDS));
-
- List<TextPacket> packets = clientHandler.getPackets();
- assertEquals(1, packets.size());
- TextPacket packetReceivedByClient = (TextPacket) packets.get(0);
- assertEquals(packetFromServer.getText(), packetReceivedByClient.getText());
- }
-
- // Protected -----------------------------------------------------
-
- @Override
- protected void setUp() throws Exception
- {
- serverDispatcher = startServer();
-
- RemotingConfiguration remotingConfig = createRemotingConfiguration();
- connector = createNIOConnector();
- client = new ClientImpl(connector, remotingConfig);
- client.connect();
-
- serverPacketHandler = new ReversePacketHandler();
- serverDispatcher.register(serverPacketHandler);
- }
-
- @Override
- protected void tearDown() throws Exception
- {
- serverDispatcher.unregister(serverPacketHandler.getID());
-
- connector.disconnect();
- client.disconnect();
- stopServer();
-
- client = null;
- serverDispatcher = null;
- }
-
- protected abstract RemotingConfiguration createRemotingConfiguration();
-
- protected abstract NIOConnector createNIOConnector();
-
- protected abstract PacketDispatcher startServer() throws Exception;
-
- protected abstract void stopServer();
-}
Copied: trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java (from rev 3699, trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java)
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,275 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.MANY_MESSAGES;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.REQRES_TIMEOUT;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.reverse;
+import static org.jboss.messaging.test.unit.RandomUtil.randomString;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.NIOSession;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.PacketHandler;
+import org.jboss.messaging.core.remoting.PacketSender;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.mina.integration.test.ReversePacketHandler;
+import org.jboss.messaging.core.remoting.test.unit.TestPacketHandler;
+import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
+import org.jboss.messaging.core.remoting.wireformat.Packet;
+import org.jboss.messaging.core.remoting.wireformat.TextPacket;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ *
+ * @version <tt>$Revision$</tt>
+ */
+public abstract class SessionTestBase extends TestCase
+{
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ protected ReversePacketHandler serverPacketHandler;
+
+ protected PacketDispatcher serverDispatcher;
+
+ protected NIOConnector connector;
+
+ protected NIOSession session;
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ public void testConnected() throws Exception
+ {
+ NIOConnector connector = createNIOConnector();
+ NIOSession session = connector.connect();
+
+ assertTrue(session.isConnected());
+
+ assertTrue(connector.disconnect());
+ assertFalse(session.isConnected());
+
+ }
+
+ public void testWrite() throws Exception
+ {
+ serverPacketHandler.expectMessage(1);
+
+ TextPacket packet = new TextPacket("testSendOneWay");
+ packet.setTargetID(serverPacketHandler.getID());
+
+ session.write(packet);
+
+ assertTrue(serverPacketHandler.await(2, SECONDS));
+
+ List<TextPacket> messages = serverPacketHandler.getPackets();
+ assertEquals(1, messages.size());
+ String response = ((TextPacket) messages.get(0)).getText();
+ assertEquals(packet.getText(), response);
+ }
+
+ public void testWriteMany() throws Exception
+ {
+ serverPacketHandler.expectMessage(MANY_MESSAGES);
+
+ TextPacket[] packets = new TextPacket[MANY_MESSAGES];
+ for (int i = 0; i < MANY_MESSAGES; i++)
+ {
+ packets[i] = new TextPacket("testSendManyOneWay " + i);
+ packets[i].setTargetID(serverPacketHandler.getID());
+ session.write(packets[i]);
+ }
+
+ assertTrue(serverPacketHandler.await(10, SECONDS));
+
+ List<TextPacket> receivedPackets = serverPacketHandler.getPackets();
+ assertEquals(MANY_MESSAGES, receivedPackets.size());
+ for (int i = 0; i < MANY_MESSAGES; i++)
+ {
+ TextPacket receivedPacket = (TextPacket) receivedPackets.get(i);
+ assertEquals(packets[i].getText(), receivedPacket.getText());
+ }
+ }
+
+ public void testWriteWithCallbackHandler() throws Exception
+ {
+ TestPacketHandler callbackHandler = new TestPacketHandler();
+ callbackHandler.expectMessage(1);
+
+ PacketDispatcher.client.register(callbackHandler);
+
+ TextPacket packet = new TextPacket("testSendOneWayWithCallbackHandler");
+ packet.setTargetID(serverPacketHandler.getID());
+ packet.setCallbackID(callbackHandler.getID());
+
+ session.write(packet);
+
+ assertTrue(callbackHandler.await(5, SECONDS));
+
+ assertEquals(1, callbackHandler.getPackets().size());
+ String response = callbackHandler.getPackets().get(0).getText();
+ assertEquals(reverse(packet.getText()), response);
+ }
+
+ public void testWriteAndBlockWithOneCallbackLater() throws Exception
+ {
+ final PacketSender[] serverSender = new PacketSender[1];
+ PacketHandler serverHandler = new PacketHandler() {
+ private final String id = randomString();
+
+ public String getID()
+ {
+ return id;
+ }
+
+ public void handle(Packet packet, PacketSender sender)
+ {
+ serverSender[0] = sender;
+ // immediate reply
+ TextPacket response = new TextPacket("blockingResponse");
+ response.normalize(packet);
+ try
+ {
+ sender.send(packet);
+ } catch (Exception e)
+ {
+ fail(e.getMessage());
+ }
+ }
+ };
+ serverDispatcher.register(serverHandler);
+
+ TestPacketHandler callbackHandler = new TestPacketHandler();
+ callbackHandler.expectMessage(1);
+ PacketDispatcher.client.register(callbackHandler);
+
+ TextPacket packet = new TextPacket("testSendOneWayWith2Callbacks");
+ packet.setTargetID(serverHandler.getID());
+ packet.setCallbackID(callbackHandler.getID());
+
+ AbstractPacket blockingResponse = (AbstractPacket) session.writeAndBlock(packet, REQRES_TIMEOUT, SECONDS);
+ assertNotNull(blockingResponse);
+
+ assertEquals(0, callbackHandler.getPackets().size());
+
+ assertNotNull(serverSender[0]);
+ TextPacket callbackResponse = new TextPacket("callbackResponse");
+ callbackResponse.setTargetID(callbackHandler.getID());
+ serverSender[0].send(callbackResponse);
+
+ assertTrue(callbackHandler.await(REQRES_TIMEOUT, SECONDS));
+
+ assertEquals(1, callbackHandler.getPackets().size());
+ }
+
+ public void testWriteAndBlock() throws Exception
+ {
+ TextPacket request = new TextPacket("testSendBlocking");
+ request.setTargetID(serverPacketHandler.getID());
+
+ AbstractPacket receivedPacket = (AbstractPacket) session.writeAndBlock(request, REQRES_TIMEOUT, SECONDS);
+
+ assertNotNull(receivedPacket);
+ assertTrue(receivedPacket instanceof TextPacket);
+ TextPacket response = (TextPacket) receivedPacket;
+ assertEquals(reverse(request.getText()), response.getText());
+ }
+
+ public void testCorrelationCounter() throws Exception
+ {
+ TextPacket request = new TextPacket("testSendBlocking");
+ request.setTargetID(serverPacketHandler.getID());
+
+ AbstractPacket receivedPacket = (AbstractPacket) session.writeAndBlock(request, REQRES_TIMEOUT, SECONDS);
+ long correlationID = request.getCorrelationID();
+
+ assertNotNull(receivedPacket);
+ assertEquals(request.getCorrelationID(), receivedPacket.getCorrelationID());
+
+ receivedPacket = (AbstractPacket) session.writeAndBlock(request, REQRES_TIMEOUT, SECONDS);
+ assertEquals(correlationID + 1, request.getCorrelationID());
+ assertEquals(correlationID + 1, receivedPacket.getCorrelationID());
+ }
+
+
+ public void testClientHandlePacketSentByServer() throws Exception
+ {
+ TestPacketHandler clientHandler = new TestPacketHandler();
+ PacketDispatcher.client.register(clientHandler);
+
+ serverPacketHandler.expectMessage(1);
+ clientHandler.expectMessage(1);
+
+ TextPacket packet = new TextPacket(
+ "testClientHandlePacketSentByServer from client");
+ packet.setTargetID(serverPacketHandler.getID());
+ // send a packet to create a sender when the server
+ // handles the packet
+ session.write(packet);
+
+ assertTrue(serverPacketHandler.await(2, SECONDS));
+
+ assertNotNull(serverPacketHandler.getLastSender());
+ PacketSender sender = serverPacketHandler.getLastSender();
+ TextPacket packetFromServer = new TextPacket(
+ "testClientHandlePacketSentByServer from server");
+ packetFromServer.setTargetID(clientHandler.getID());
+ sender.send(packetFromServer);
+
+ assertTrue(clientHandler.await(2, SECONDS));
+
+ List<TextPacket> packets = clientHandler.getPackets();
+ assertEquals(1, packets.size());
+ TextPacket packetReceivedByClient = (TextPacket) packets.get(0);
+ assertEquals(packetFromServer.getText(), packetReceivedByClient.getText());
+ }
+
+ // Protected -----------------------------------------------------
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ serverDispatcher = startServer();
+
+ connector = createNIOConnector();
+ session = connector.connect();
+
+ serverPacketHandler = new ReversePacketHandler();
+ serverDispatcher.register(serverPacketHandler);
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ serverDispatcher.unregister(serverPacketHandler.getID());
+
+ connector.disconnect();
+ stopServer();
+
+ connector = null;
+ session = null;
+ serverDispatcher = null;
+ }
+
+ protected abstract RemotingConfiguration createRemotingConfiguration();
+
+ protected abstract NIOConnector createNIOConnector();
+
+ protected abstract PacketDispatcher startServer() throws Exception;
+
+ protected abstract void stopServer();
+}
Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,70 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl.invm.test.unit;
-
-import static org.jboss.messaging.core.remoting.TransportType.INVM;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
-
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.PacketDispatcher;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientTestBase;
-import org.jboss.messaging.core.remoting.impl.invm.INVMConnector;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public class INVMClientTest extends ClientTestBase
-{
- // Constants -----------------------------------------------------
-
- // Attributes ----------------------------------------------------
-
- PacketDispatcher dispatcher = new PacketDispatcher();
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- // Public --------------------------------------------------------
-
- // ClientTestBase overrides --------------------------------------
-
- @Override
- protected NIOConnector createNIOConnector()
- {
- return new INVMConnector("localhost", PORT, dispatcher);
- }
-
- @Override
- protected RemotingConfiguration createRemotingConfiguration()
- {
- return new RemotingConfiguration(INVM, "localhost", PORT);
- }
-
- @Override
- protected PacketDispatcher startServer() throws Exception
- {
- return dispatcher;
- }
-
- @Override
- protected void stopServer()
- {
- dispatcher = null;
- }
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- // Inner classes -------------------------------------------------
-}
Copied: trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java (from rev 3699, trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java)
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.invm.test.unit;
+
+import static org.jboss.messaging.core.remoting.TransportType.INVM;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
+
+import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.SessionTestBase;
+import org.jboss.messaging.core.remoting.impl.invm.INVMConnector;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class INVMSessionTest extends SessionTestBase
+{
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ PacketDispatcher dispatcher = new PacketDispatcher();
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ // ClientTestBase overrides --------------------------------------
+
+ @Override
+ protected NIOConnector createNIOConnector()
+ {
+ return new INVMConnector("localhost", PORT, dispatcher);
+ }
+
+ @Override
+ protected RemotingConfiguration createRemotingConfiguration()
+ {
+ return new RemotingConfiguration(INVM, "localhost", PORT);
+ }
+
+ @Override
+ protected PacketDispatcher startServer() throws Exception
+ {
+ return dispatcher;
+ }
+
+ @Override
+ protected void stopServer()
+ {
+ dispatcher = null;
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -9,25 +9,30 @@
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.jboss.messaging.core.remoting.TransportType.TCP;
import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_INTERVAL;
import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_TIMEOUT;
import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
+import static org.jboss.messaging.test.unit.RandomUtil.randomString;
import java.util.concurrent.CountDownLatch;
import junit.framework.TestCase;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
+import org.jboss.jms.client.api.FailureListener;
import org.jboss.messaging.core.remoting.KeepAliveFactory;
import org.jboss.messaging.core.remoting.NIOSession;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.mina.ClientKeepAliveFactory;
import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
import org.jboss.messaging.core.remoting.impl.mina.MinaService;
import org.jboss.messaging.core.remoting.wireformat.Ping;
import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -67,33 +72,38 @@
}
public void testKeepAliveWithClientOK() throws Exception
- {
+ {
KeepAliveFactory factory = createMock(KeepAliveFactory.class);
// client never send ping
- expect(factory.ping()).andStubReturn(null);
+ expect(factory.ping(isA(String.class))).andStubReturn(null);
+ expect(factory.isPing(isA(String.class), isA(Ping.class))).andStubReturn(true);
+ expect(factory.isPing(isA(String.class), isA(Object.class))).andStubReturn(false);
// client is responding
- expect(factory.pong()).andReturn(new Pong()).atLeastOnce();
+ expect(factory.pong(isA(String.class), isA(Ping.class))).andReturn(new Pong(randomString(), false)).atLeastOnce();
replay(factory);
final CountDownLatch latch = new CountDownLatch(1);
- service.addConnectionExceptionListener(new ConnectionExceptionListener()
- {
- public void handleConnectionException(Throwable e, String sessionID)
+ FailureListener listener = new FailureListener() {
+ public void onFailure(MessagingException me)
{
+ assertTrue(me instanceof RemotingException);
+ RemotingException re = (RemotingException) me;
latch.countDown();
}
- });
+ };
+ service.addFailureListener(listener);
MinaConnector connector = new MinaConnector(service.getRemotingConfiguration(), factory);
connector.connect();
boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
- + KEEP_ALIVE_TIMEOUT + 1, SECONDS);
+ + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
assertFalse(firedKeepAliveNotification);
+ service.removeFailureListener(listener);
connector.disconnect();
verify(factory);
@@ -101,26 +111,21 @@
public void testKeepAliveWithClientNotResponding() throws Exception
{
- KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+ KeepAliveFactory factory = new ClientKeepAliveFactoryNotResponding();
- // client never send ping
- expect(factory.ping()).andStubReturn(null);
- // no pong -> client is not responding
- expect(factory.pong()).andReturn(null).atLeastOnce();
-
- replay(factory);
-
final String[] clientSessionIDNotResponding = new String[1];
final CountDownLatch latch = new CountDownLatch(1);
- service.addConnectionExceptionListener(new ConnectionExceptionListener()
- {
- public void handleConnectionException(Throwable t, String sessionID)
+ FailureListener listener = new FailureListener() {
+ public void onFailure(MessagingException me)
{
- clientSessionIDNotResponding[0] = sessionID;
+ assertTrue(me instanceof RemotingException);
+ RemotingException re = (RemotingException) me;
+ clientSessionIDNotResponding[0] = re.getSessionID();
latch.countDown();
}
- });
+ };
+ service.addFailureListener(listener);
MinaConnector connector = new MinaConnector(service.getRemotingConfiguration(), factory);
@@ -133,21 +138,25 @@
assertNotNull(clientSessionIDNotResponding[0]);
assertEquals(clientSessionID, clientSessionIDNotResponding[0]);
+ service.removeFailureListener(listener);
connector.disconnect();
-
- verify(factory);
}
public void testKeepAliveWithClientTooLongToRespond() throws Exception
{
KeepAliveFactory factory = new KeepAliveFactory()
{
- public Ping ping()
+ public Ping ping(String sessionID)
{
return null;
}
+
+ public boolean isPing(String sessionID, Object message)
+ {
+ return (message instanceof Ping);
+ }
- public synchronized Pong pong()
+ public synchronized Pong pong(String sessionID, Ping ping)
{
// like a TCP timeout, there is no response in the next 2 hours
try
@@ -157,8 +166,8 @@
{
e.printStackTrace();
}
- return new Pong();
- }
+ return new Pong(randomString(), false);
+ }
};
try
@@ -172,14 +181,16 @@
final String[] clientSessionIDNotResponding = new String[1];
final CountDownLatch latch = new CountDownLatch(1);
- service.addConnectionExceptionListener(new ConnectionExceptionListener()
- {
- public void handleConnectionException(Throwable t, String sessionID)
+ FailureListener listener = new FailureListener() {
+ public void onFailure(MessagingException me)
{
- clientSessionIDNotResponding[0] = sessionID;
+ assertTrue(me instanceof RemotingException);
+ RemotingException re = (RemotingException) me;
+ clientSessionIDNotResponding[0] = re.getSessionID();
latch.countDown();
}
- });
+ };
+ service.addFailureListener(listener);
boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
+ KEEP_ALIVE_TIMEOUT + 2, SECONDS);
@@ -187,6 +198,7 @@
assertNotNull(clientSessionIDNotResponding[0]);
assertEquals(clientSessionID, clientSessionIDNotResponding[0]);
+ service.removeFailureListener(listener);
connector.disconnect();
} finally
@@ -202,27 +214,22 @@
public void testKeepAliveWithClientRespondingAndClientNotResponding()
throws Exception
{
- KeepAliveFactory notRespondingfactory = createMock(KeepAliveFactory.class);
- expect(notRespondingfactory.ping()).andStubReturn(null);
- expect(notRespondingfactory.pong()).andReturn(null).atLeastOnce();
+ KeepAliveFactory notRespondingfactory = new ClientKeepAliveFactoryNotResponding();
+ KeepAliveFactory respondingfactory = new ClientKeepAliveFactory();
- KeepAliveFactory respondingfactory = createMock(KeepAliveFactory.class);
- expect(respondingfactory.ping()).andStubReturn(null);
- expect(respondingfactory.pong()).andReturn(new Pong()).atLeastOnce();
-
- replay(notRespondingfactory, respondingfactory);
-
final String[] sessionIDNotResponding = new String[1];
final CountDownLatch latch = new CountDownLatch(1);
- service.addConnectionExceptionListener(new ConnectionExceptionListener()
- {
- public void handleConnectionException(Throwable t, String sessionID)
+ FailureListener listener = new FailureListener() {
+ public void onFailure(MessagingException me)
{
- sessionIDNotResponding[0] = sessionID;
+ assertTrue(me instanceof RemotingException);
+ RemotingException re = (RemotingException) me;
+ sessionIDNotResponding[0] = re.getSessionID();
latch.countDown();
}
- });
+ };
+ service.addFailureListener(listener);
MinaConnector connectorNotResponding = new MinaConnector(service
.getRemotingConfiguration(), notRespondingfactory);
@@ -244,10 +251,9 @@
assertEquals(clientSessionIDNotResponding, sessionIDNotResponding[0]);
assertNotSame(clientSessionIDResponding, sessionIDNotResponding[0]);
+ service.removeFailureListener(listener);
connectorNotResponding.disconnect();
connectorResponding.disconnect();
-
- verify(notRespondingfactory, respondingfactory);
}
// Package protected ---------------------------------------------
@@ -257,4 +263,19 @@
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
+
+ private class ClientKeepAliveFactoryNotResponding extends ClientKeepAliveFactory
+ {
+ @Override
+ public Ping ping(String clientSessionID)
+ {
+ return null;
+ }
+
+ @Override
+ public Pong pong(String sessionID, Ping ping)
+ {
+ return null;
+ }
+ }
}
\ No newline at end of file
Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -7,10 +7,13 @@
package org.jboss.messaging.core.remoting.impl.mina.integration.test;
import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
import junit.framework.TestCase;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.jboss.messaging.core.remoting.KeepAliveFactory;
+import org.jboss.messaging.core.remoting.impl.mina.FailureNotifier;
import org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport;
/**
@@ -38,15 +41,20 @@
DefaultIoFilterChainBuilder filterChain = new DefaultIoFilterChainBuilder();
KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+ FailureNotifier notifier = createMock(FailureNotifier.class);
+
+ replay(factory, notifier);
try
{
FilterChainSupport.addKeepAliveFilter(filterChain, factory,
- keepAliveInterval, keepAliveTimeout);
+ keepAliveInterval, keepAliveTimeout, notifier);
fail("the interval must be greater than the timeout");
} catch (IllegalArgumentException e)
{
}
+
+ verify(factory, notifier);
}
// Package protected ---------------------------------------------
Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,95 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl.mina.integration.test;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.jboss.messaging.core.remoting.TransportType.TCP;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
-
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.PacketDispatcher;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientTestBase;
-import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
-import org.jboss.messaging.core.remoting.impl.mina.MinaService;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.core.remoting.wireformat.TextPacket;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public class MinaClientTest extends ClientTestBase
-{
-
- private MinaService service;
-
- // Constants -----------------------------------------------------
-
- // Attributes ----------------------------------------------------
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- // Public --------------------------------------------------------
-
- public void testSendBlockingWithTimeout() throws Exception
- {
- client.setBlockingRequestTimeout(500, MILLISECONDS);
- serverPacketHandler.setSleepTime(1000, MILLISECONDS);
-
- AbstractPacket packet = new TextPacket("testSendBlockingWithTimeout");
- packet.setTargetID(serverPacketHandler.getID());
-
- try
- {
- client.send(packet, false);
- fail("a Throwable should be thrown");
- } catch (Throwable t)
- {
- }
- }
-
- // ClientTestBase overrides --------------------------------------
-
- @Override
- protected NIOConnector createNIOConnector()
- {
- return new MinaConnector(createRemotingConfiguration());
- }
-
- @Override
- protected RemotingConfiguration createRemotingConfiguration()
- {
- return new RemotingConfiguration(TCP, "localhost", PORT);
- }
-
- @Override
- protected PacketDispatcher startServer() throws Exception
- {
- service = new MinaService(createRemotingConfiguration());
- service.start();
- return service.getDispatcher();
- }
-
- @Override
- protected void stopServer()
- {
- service.stop();
- }
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- // Inner classes -------------------------------------------------
-}
Added: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,100 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.mina.integration.test;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.jboss.messaging.test.unit.RandomUtil.randomLong;
+import static org.jboss.messaging.test.unit.RandomUtil.randomString;
+import junit.framework.TestCase;
+
+import org.apache.mina.common.IoSession;
+import org.jboss.messaging.core.remoting.KeepAliveFactory;
+import org.jboss.messaging.core.remoting.impl.mina.FailureNotifier;
+import org.jboss.messaging.core.remoting.impl.mina.MinaKeepAliveFactory;
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.MessagingException;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class MinaKeepAliveFactoryTest extends TestCase
+{
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ public void testResponseIsNotAPong()
+ {
+ IoSession session = createMock(IoSession.class);
+ KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+ FailureNotifier notifier = createMock(FailureNotifier.class);
+ replay(session, factory, notifier);
+
+ MinaKeepAliveFactory minaFactory = new MinaKeepAliveFactory(factory, notifier);
+
+ assertFalse(minaFactory.isResponse(session, new Object()));
+
+ verify(session, factory, notifier);
+ }
+
+ public void testResponseIsAPongWithSessionNotFailed()
+ {
+ IoSession session = createMock(IoSession.class);
+ String sessionID = randomString();
+ Pong pong = new Pong(sessionID, false);
+ KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+ FailureNotifier notifier = createMock(FailureNotifier.class);
+ replay(session, factory, notifier);
+
+ MinaKeepAliveFactory minaFactory = new MinaKeepAliveFactory(factory, notifier);
+
+ assertTrue(minaFactory.isResponse(session, pong));
+
+ verify(session, factory, notifier);
+ }
+
+ public void testResponseIsAPongWithSessionFailed()
+ {
+ IoSession session = createMock(IoSession.class);
+ String sessionID = Long.toString(randomLong());
+ expect(session.getId()).andStubReturn(Long.parseLong(sessionID));
+ Pong pong = new Pong(sessionID, true);
+ KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+ FailureNotifier notifier = createMock(FailureNotifier.class);
+ notifier.fireFailure(isA(MessagingException.class));
+ expectLastCall().once();
+ replay(session, factory, notifier);
+
+ MinaKeepAliveFactory minaFactory = new MinaKeepAliveFactory(factory, notifier);
+
+ assertTrue(minaFactory.isResponse(session, pong));
+
+ verify(session, factory, notifier);
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Added: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.mina.integration.test;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.jboss.messaging.core.remoting.TransportType.TCP;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
+
+import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.SessionTestBase;
+import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
+import org.jboss.messaging.core.remoting.impl.mina.MinaService;
+import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
+import org.jboss.messaging.core.remoting.wireformat.TextPacket;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class MinaSessionTest extends SessionTestBase
+{
+
+ private MinaService service;
+
+ // Constants -----------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ public void testWriteAndBlockWithTimeout() throws Exception
+ {
+ serverPacketHandler.setSleepTime(1000, MILLISECONDS);
+
+ AbstractPacket packet = new TextPacket("testSendBlockingWithTimeout");
+ packet.setTargetID(serverPacketHandler.getID());
+
+ try
+ {
+ session.writeAndBlock(packet, 500, MILLISECONDS);
+ fail("a Throwable should be thrown");
+ } catch (Throwable t)
+ {
+ }
+ }
+
+ // ClientTestBase overrides --------------------------------------
+
+ @Override
+ protected NIOConnector createNIOConnector()
+ {
+ return new MinaConnector(createRemotingConfiguration());
+ }
+
+ @Override
+ protected RemotingConfiguration createRemotingConfiguration()
+ {
+ return new RemotingConfiguration(TCP, "localhost", PORT);
+ }
+
+ @Override
+ protected PacketDispatcher startServer() throws Exception
+ {
+ service = new MinaService(createRemotingConfiguration());
+ service.start();
+ return service.getDispatcher();
+ }
+
+ @Override
+ protected void stopServer()
+ {
+ service.stop();
+ }
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -7,10 +7,6 @@
package org.jboss.messaging.core.remoting.impl.mina.integration.test;
import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
import static org.jboss.messaging.core.remoting.TransportType.TCP;
import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_INTERVAL;
import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_TIMEOUT;
@@ -20,12 +16,16 @@
import junit.framework.TestCase;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
-import org.jboss.messaging.core.remoting.KeepAliveFactory;
+import org.jboss.jms.client.api.FailureListener;
import org.jboss.messaging.core.remoting.NIOSession;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
import org.jboss.messaging.core.remoting.impl.mina.MinaService;
+import org.jboss.messaging.core.remoting.impl.mina.ServerKeepAliveFactory;
+import org.jboss.messaging.core.remoting.wireformat.Ping;
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
/**
* @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -61,46 +61,114 @@
public void testKeepAliveWithServerNotResponding() throws Exception
{
- KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+ ServerKeepAliveFactory factory = new ServerKeepAliveFactory()
+ {
+ // server does not send ping
+ @Override
+ public Ping ping(String sessionID)
+ {
+ return null;
+ }
- // server does not send ping
- expect(factory.ping()).andStubReturn(null);
- // no pong -> server is not responding
- expect(factory.pong()).andReturn(null).atLeastOnce();
+ @Override
+ public Pong pong(String sessionID, Ping ping)
+ {
+ // no pong -> server is not responding
+ super.pong(sessionID, ping);
+ return null;
+ }
+ };
- replay(factory);
-
- RemotingConfiguration remotingConfig = new RemotingConfiguration(TCP, "localhost", PORT);
+ RemotingConfiguration remotingConfig = new RemotingConfiguration(TCP,
+ "localhost", PORT);
remotingConfig.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
remotingConfig.setKeepAliveTimeout(KEEP_ALIVE_TIMEOUT);
service = new MinaService(remotingConfig, factory);
service.start();
- MinaConnector connector = new MinaConnector(service.getRemotingConfiguration());
+ MinaConnector connector = new MinaConnector(service
+ .getRemotingConfiguration());
final String[] sessionIDNotResponding = new String[1];
final CountDownLatch latch = new CountDownLatch(1);
-
- connector.setConnectionExceptionListener(new ConnectionExceptionListener()
+
+ FailureListener listener = new FailureListener()
{
- public void handleConnectionException(Throwable t, String sessionID)
+ public void onFailure(MessagingException me)
{
- sessionIDNotResponding[0] = sessionID;
+ assertTrue(me instanceof RemotingException);
+ RemotingException re = (RemotingException) me;
+ sessionIDNotResponding[0] = re.getSessionID();
latch.countDown();
}
- });
-
+ };
+ connector.addFailureListener(listener);
+
NIOSession session = connector.connect();
boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
+ KEEP_ALIVE_TIMEOUT + 2, SECONDS);
assertTrue(firedKeepAliveNotification);
assertEquals(session.getID(), sessionIDNotResponding[0]);
-
+
+ connector.removeFailureListener(listener);
connector.disconnect();
-
- verify(factory);
}
-
+
+ public void testKeepAliveWithServerSessionFailed() throws Exception
+ {
+ ServerKeepAliveFactory factory = new ServerKeepAliveFactory()
+ {
+ // server does not send ping
+ @Override
+ public Ping ping(String sessionID)
+ {
+ return null;
+ }
+
+ @Override
+ public Pong pong(String sessionID, Ping ping)
+ {
+ // no pong -> server is not responding
+ super.pong(sessionID, ping);
+ return new Pong(sessionID, true);
+ }
+ };
+
+ RemotingConfiguration remotingConfig = new RemotingConfiguration(TCP,
+ "localhost", PORT);
+ remotingConfig.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
+ remotingConfig.setKeepAliveTimeout(KEEP_ALIVE_TIMEOUT);
+ service = new MinaService(remotingConfig, factory);
+ service.start();
+
+ MinaConnector connector = new MinaConnector(service
+ .getRemotingConfiguration());
+ final String[] sessionIDNotResponding = new String[1];
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ FailureListener listener = new FailureListener()
+ {
+ public void onFailure(MessagingException me)
+ {
+ assertTrue(me instanceof RemotingException);
+ RemotingException re = (RemotingException) me;
+ sessionIDNotResponding[0] = re.getSessionID();
+ latch.countDown();
+ }
+ };
+ connector.addFailureListener(listener);
+
+ NIOSession session = connector.connect();
+
+ boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
+ + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
+ assertTrue(firedKeepAliveNotification);
+ assertEquals(session.getID(), sessionIDNotResponding[0]);
+
+ connector.removeFailureListener(listener);
+ connector.disconnect();
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -22,6 +22,8 @@
public static final int KEEP_ALIVE_TIMEOUT = 1; // in seconds
+ public static final long REQRES_TIMEOUT = 2; // in seconds
+
public static final int PORT = 9090;
// Attributes ----------------------------------------------------
Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -15,12 +15,11 @@
import junit.framework.TestCase;
-import org.jboss.messaging.core.remoting.Client;
import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.NIOSession;
import org.jboss.messaging.core.remoting.PacketHandler;
import org.jboss.messaging.core.remoting.PacketSender;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
import org.jboss.messaging.core.remoting.impl.mina.MinaService;
import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
@@ -86,8 +85,7 @@
CountDownLatch latch = new CountDownLatch(1);
service.getDispatcher().register(new ServerHandler(handlerID, latch, spinner));
- Client client = new ClientImpl(connector, service.getRemotingConfiguration());
- client.connect();
+ NIOSession session = connector.connect();
byte[] payloadBytes = generatePayload(PAYLOAD);
AbstractPacket packet = new BytesPacket(payloadBytes);
@@ -96,7 +94,7 @@
long start = System.currentTimeMillis();
for (int i = 0; i < MANY_MESSAGES; i++)
{
- client.send(packet, true);
+ session.write(packet);
if (i % spinner == 0)
System.out.print('#');
}
Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,183 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.test.unit;
-
-import static java.util.UUID.randomUUID;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.jboss.messaging.core.remoting.TransportType.TCP;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
-
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import org.jboss.messaging.core.remoting.Client;
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.NIOSession;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
-import org.jboss.messaging.core.remoting.wireformat.NullPacket;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- *
- * @version <tt>$Revision$</tt>
- */
-public class ClientTest extends TestCase
-{
- // Constants -----------------------------------------------------
-
- // Attributes ----------------------------------------------------
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- // Public --------------------------------------------------------
-
- private RemotingConfiguration remotingConfig;
-
- public void testConnected() throws Exception
- {
- NIOConnector connector = createStrictMock(NIOConnector.class);
- NIOSession session1 = createStrictMock(NIOSession.class);
- NIOSession session2 = createStrictMock(NIOSession.class);
-
- expect(connector.connect()).andReturn(session1).andReturn(session2);
- expect(session1.isConnected()).andReturn(true);
- expect(session2.isConnected()).andReturn(true);
-
- replay(connector, session1, session2);
-
- Client client = new ClientImpl(connector, remotingConfig);
- client.connect();
- assertTrue(client.isConnected());
- assertTrue(client.disconnect());
- assertFalse(client.isConnected());
-
- client.connect();
- assertTrue(client.isConnected());
-
- assertTrue(client.disconnect());
- assertFalse(client.isConnected());
- assertFalse(client.disconnect());
-
- verify(connector, session1, session2);
- }
-
- public void testConnectionFailure() throws Exception
- {
- NIOConnector connector = createStrictMock(NIOConnector.class);
- expect(connector.connect()).andThrow(new IOException("connection exception"));
-
- replay(connector);
-
- Client client = new ClientImpl(connector, remotingConfig);
-
- try
- {
- client.connect();
- fail("connection must fail");
- } catch (IOException e)
- {
- }
-
- verify(connector);
- }
-
- public void testSessionID() throws Exception
- {
- String sessionID = randomUUID().toString();
-
- NIOConnector connector = createStrictMock(NIOConnector.class);
- NIOSession session = createStrictMock(NIOSession.class);
-
- expect(connector.connect()).andReturn(session);
- expect(session.isConnected()).andReturn(true);
- expect(session.getID()).andReturn(sessionID);
-
- replay(connector, session);
-
- Client client = new ClientImpl(connector, remotingConfig);
-
- assertNull(client.getSessionID());
- client.connect();
-
- String actualSessionID = client.getSessionID();
-
- assertNotNull(actualSessionID);
- assertEquals(sessionID, actualSessionID);
- client.disconnect();
- assertNull(client.getSessionID());
-
- verify(connector, session);
- }
-
- public void testURI() throws Exception
- {
- NIOConnector connector = createStrictMock(NIOConnector.class);
- NIOSession session = createStrictMock(NIOSession.class);
-
- expect(connector.getServerURI()).andReturn(null);
- expect(connector.connect()).andReturn(session);
- expect(connector.getServerURI()).andReturn("tcp://localhost:" + PORT);
- expect(connector.getServerURI()).andReturn(null);
- // no expectation for the session
-
- replay(connector, session);
-
- Client client = new ClientImpl(connector, remotingConfig);
-
- assertNull(client.getURI());
- client.connect();
- assertNotNull(client.getURI());
- client.disconnect();
- assertNull(client.getURI());
-
- verify(connector, session);
- }
-
- public void testCanNotSendPacketIfNotConnected() throws Exception
- {
- NIOConnector connector = createStrictMock(NIOConnector.class);
-
- // connector is not expected to be called at all;
- replay(connector);
-
- Client client = new ClientImpl(connector, remotingConfig);
- try
- {
- client.send(new NullPacket(), true);
- fail("can not send a packet if the dispatcher is not connected");
- }
- catch (IllegalStateException e)
- {
- //Ok
- }
-
- verify(connector);
- }
-
- @Override
- protected void setUp() throws Exception
- {
- super.setUp();
-
- this.remotingConfig = new RemotingConfiguration(TCP, "localhost", PORT);
- }
-
- @Override
- protected void tearDown() throws Exception
- {
- remotingConfig = null;
-
- super.tearDown();
- }
-}
Modified: trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -19,60 +19,59 @@
import static org.jboss.messaging.core.remoting.impl.mina.MinaPacketCodec.UTF_8_ENCODER;
import static org.jboss.messaging.core.remoting.wireformat.AbstractPacket.NO_ID_SET;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.BYTES;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CLOSE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_START;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_STOP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONS_FLOWTOKEN;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.NULL;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_ACKNOWLEDGE;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_ADD_ADDRESS;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE_RESP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_RESET;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CANCEL;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONS_FLOWTOKEN;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CLOSE;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_COMMIT;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEQUEUE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_DELETE_QUEUE;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_DELIVER;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY_RESP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_RECOVER;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_REMOVE_ADDRESS;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_ROLLBACK;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SEND;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SETID;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_START;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_STOP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_COMMIT;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_END;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_FORGET;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_GET_TIMEOUT;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_GET_TIMEOUT_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS_RESP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_JOIN;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_PREPARE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_RESP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_RESUME;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_ROLLBACK;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_SET_TIMEOUT;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_SET_TIMEOUT_RESP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_START;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_SUSPEND;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.NULL;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEQUEUE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_DELETE_QUEUE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_PREPARE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS_RESP;
import static org.jboss.messaging.core.remoting.wireformat.PacketType.TEXT;
import static org.jboss.messaging.core.remoting.wireformat.test.unit.CodecAssert.assertEqualsByteArrays;
import static org.jboss.messaging.test.unit.RandomUtil.randomByte;
@@ -93,31 +92,33 @@
import org.jboss.messaging.core.Message;
import org.jboss.messaging.core.impl.MessageImpl;
import org.jboss.messaging.core.remoting.codec.AbstractPacketCodec;
+import org.jboss.messaging.core.remoting.codec.BytesPacketCodec;
+import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionMessageCodec;
+import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.codec.ConsumerFlowTokenMessageCodec;
+import org.jboss.messaging.core.remoting.codec.CreateConnectionMessageCodec;
+import org.jboss.messaging.core.remoting.codec.CreateConnectionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.codec.DeliverMessageCodec;
+import org.jboss.messaging.core.remoting.codec.PingCodec;
+import org.jboss.messaging.core.remoting.codec.PongCodec;
+import org.jboss.messaging.core.remoting.codec.RemotingBuffer;
+import org.jboss.messaging.core.remoting.codec.SessionAcknowledgeMessageCodec;
+import org.jboss.messaging.core.remoting.codec.SessionAddAddressMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionBindingQueryMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionBindingQueryResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionBrowserHasNextMessageResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionBrowserNextMessageBlockMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionBrowserNextMessageBlockResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionBrowserNextMessageResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.BytesPacketCodec;
-import org.jboss.messaging.core.remoting.codec.CreateConnectionMessageCodec;
-import org.jboss.messaging.core.remoting.codec.CreateConnectionResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.ConsumerFlowTokenMessageCodec;
+import org.jboss.messaging.core.remoting.codec.SessionCancelMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionCreateBrowserMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionCreateBrowserResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionCreateConsumerMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionCreateConsumerResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionMessageCodec;
-import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.codec.SessionCreateQueueMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionDeleteQueueMessageCodec;
-import org.jboss.messaging.core.remoting.codec.DeliverMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionQueueQueryMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionQueueQueryResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.RemotingBuffer;
-import org.jboss.messaging.core.remoting.codec.SessionAcknowledgeMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionAddAddressMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionCancelMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionCreateQueueMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionRemoveAddressMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionSendMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionXACommitMessageCodec;
@@ -133,11 +134,26 @@
import org.jboss.messaging.core.remoting.codec.SessionXASetTimeoutMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionXASetTimeoutResponseMessageCodec;
import org.jboss.messaging.core.remoting.codec.SessionXAStartMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionSetIDMessageCodec;
import org.jboss.messaging.core.remoting.codec.TextPacketCodec;
import org.jboss.messaging.core.remoting.impl.mina.PacketCodecFactory;
import org.jboss.messaging.core.remoting.impl.mina.MinaPacketCodec.BufferWrapper;
import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
+import org.jboss.messaging.core.remoting.wireformat.BytesPacket;
+import org.jboss.messaging.core.remoting.wireformat.CloseMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionResponseMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionStartMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionStopMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConsumerFlowTokenMessage;
+import org.jboss.messaging.core.remoting.wireformat.CreateConnectionRequest;
+import org.jboss.messaging.core.remoting.wireformat.CreateConnectionResponse;
+import org.jboss.messaging.core.remoting.wireformat.DeliverMessage;
+import org.jboss.messaging.core.remoting.wireformat.NullPacket;
+import org.jboss.messaging.core.remoting.wireformat.PacketType;
+import org.jboss.messaging.core.remoting.wireformat.Ping;
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.core.remoting.wireformat.SessionAcknowledgeMessage;
+import org.jboss.messaging.core.remoting.wireformat.SessionAddAddressMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionBindingQueryMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionBindingQueryResponseMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionBrowserHasNextMessageMessage;
@@ -147,30 +163,16 @@
import org.jboss.messaging.core.remoting.wireformat.SessionBrowserNextMessageMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionBrowserNextMessageResponseMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionBrowserResetMessage;
-import org.jboss.messaging.core.remoting.wireformat.BytesPacket;
-import org.jboss.messaging.core.remoting.wireformat.CloseMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConsumerFlowTokenMessage;
+import org.jboss.messaging.core.remoting.wireformat.SessionCancelMessage;
+import org.jboss.messaging.core.remoting.wireformat.SessionCommitMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionCreateBrowserMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionCreateBrowserResponseMessage;
-import org.jboss.messaging.core.remoting.wireformat.CreateConnectionRequest;
-import org.jboss.messaging.core.remoting.wireformat.CreateConnectionResponse;
import org.jboss.messaging.core.remoting.wireformat.SessionCreateConsumerMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionCreateConsumerResponseMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionCreateQueueMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionResponseMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionDeleteQueueMessage;
-import org.jboss.messaging.core.remoting.wireformat.DeliverMessage;
-import org.jboss.messaging.core.remoting.wireformat.NullPacket;
-import org.jboss.messaging.core.remoting.wireformat.PacketType;
-import org.jboss.messaging.core.remoting.wireformat.Ping;
-import org.jboss.messaging.core.remoting.wireformat.Pong;
import org.jboss.messaging.core.remoting.wireformat.SessionQueueQueryMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionQueueQueryResponseMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionAcknowledgeMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionAddAddressMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionCancelMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionCommitMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionRecoverMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionRemoveAddressMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionRollbackMessage;
@@ -191,9 +193,6 @@
import org.jboss.messaging.core.remoting.wireformat.SessionXASetTimeoutResponseMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionXAStartMessage;
import org.jboss.messaging.core.remoting.wireformat.SessionXASuspendMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionStartMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionStopMessage;
import org.jboss.messaging.core.remoting.wireformat.TextPacket;
import org.jboss.messaging.test.unit.RandomUtil;
import org.jboss.messaging.test.unit.UnitTestCase;
@@ -375,36 +374,39 @@
public void testPing() throws Exception
{
- Ping packet = new Ping();
- AbstractPacketCodec<AbstractPacket> codec = PacketCodecFactory
- .createCodecForEmptyPacket(PING, Ping.class);
-
- SimpleRemotingBuffer buffer = encode(packet, codec);
- checkHeader(buffer, packet);
- checkBodyIsEmpty(buffer);
+ Ping ping = new Ping(randomString());
+ AbstractPacketCodec<Ping> codec = new PingCodec();
+
+ SimpleRemotingBuffer buffer = encode(ping, codec);
+ checkHeader(buffer, ping);
+ checkBody(buffer, ping.getSessionID());
buffer.rewind();
AbstractPacket decodedPacket = codec.decode(buffer);
assertTrue(decodedPacket instanceof Ping);
- assertEquals(PING, decodedPacket.getType());
+ Ping decodedPing = (Ping) decodedPacket;
+ assertEquals(PING, decodedPing.getType());
+ assertEquals(ping.getSessionID(), decodedPing.getSessionID());
}
public void testPong() throws Exception
{
- Pong packet = new Pong();
- AbstractPacketCodec<AbstractPacket> codec = PacketCodecFactory
- .createCodecForEmptyPacket(PONG, Pong.class);
-
- SimpleRemotingBuffer buffer = encode(packet, codec);
- checkHeader(buffer, packet);
- checkBodyIsEmpty(buffer);
+ Pong pong = new Pong(randomString(), true);
+ AbstractPacketCodec<Pong> codec = new PongCodec();
+
+ SimpleRemotingBuffer buffer = encode(pong, codec);
+ checkHeader(buffer, pong);
+ checkBody(buffer, pong.getSessionID(), pong.isSessionFailed());
buffer.rewind();
AbstractPacket decodedPacket = codec.decode(buffer);
assertTrue(decodedPacket instanceof Pong);
- assertEquals(PONG, decodedPacket.getType());
+ Pong decodedPong = (Pong) decodedPacket;
+ assertEquals(PONG, decodedPong.getType());
+ assertEquals(pong.getSessionID(), decodedPong.getSessionID());
+ assertEquals(pong.isSessionFailed(), decodedPong.isSessionFailed());
}
public void testTextPacket() throws Exception
@@ -444,24 +446,6 @@
assertEquals(BYTES, p.getType());
assertEqualsByteArrays(packet.getBytes(), p.getBytes());
}
-
- public void testSetSessionIDMessage() throws Exception
- {
- SessionSetIDMessage message = new SessionSetIDMessage(randomString());
-
- AbstractPacketCodec codec = new SessionSetIDMessageCodec();
- SimpleRemotingBuffer buffer = encode(message, codec);
- checkHeader(buffer, message);
- checkBody(buffer, message.getSessionID());
- buffer.rewind();
-
- AbstractPacket decodedPacket = codec.decode(buffer);
-
- assertTrue(decodedPacket instanceof SessionSetIDMessage);
- SessionSetIDMessage decodedMessage = (SessionSetIDMessage) decodedPacket;
- assertEquals(SESS_SETID, decodedMessage.getType());
- assertEquals(message.getSessionID(), decodedMessage.getSessionID());
- }
public void testCreateConnectionRequest() throws Exception
{
Modified: trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -37,9 +37,11 @@
import javax.transaction.TransactionManager;
import org.jboss.jms.client.JBossConnectionFactory;
+import org.jboss.jms.server.ConnectionManager;
import org.jboss.jms.server.security.Role;
import org.jboss.messaging.core.MessagingServer;
import org.jboss.messaging.core.MessagingServerManagement;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
import org.jboss.messaging.microcontainer.JBMBootstrapServer;
import org.jboss.test.messaging.tools.ServerManagement;
import org.jboss.test.messaging.tools.container.DatabaseClearer;
@@ -719,12 +721,22 @@
protected boolean assertRemainingMessages(int expected) throws Exception
{
+ sleepIfRemoting(500);
+
Integer messageCount = servers.get(0).getMessageCountForQueue("Queue1");
assertEquals(expected, messageCount.intValue());
return expected == messageCount.intValue();
}
+ protected static void assertActiveConnectionsOnTheServer(int expectedSize)
+ throws Exception
+ {
+ ConnectionManager cm = servers.get(0).getMessagingServer()
+ .getConnectionManager();
+ assertEquals(expectedSize, cm.getActiveConnections().size());
+ }
+
public static void deployConnectionFactory(String clientId, String objectName,
String[] jndiBindings)
throws Exception
@@ -945,5 +957,24 @@
log.info("server " + i + " killed and dead");
}
}
+
+ /**
+ * Sleeps a little if invm optimization is disabled for remoting.
+ *
+ * This little sleep is necessary due to the async behavior of our remoting code.
+ * If we send non-durable messages and checks immediately that
+ * they've been received on the server, it may fail since these
+ * messages are sent asynchronously.
+ *
+ * @param time sleep time in milliseconds
+ */
+ private void sleepIfRemoting(int time) throws Exception
+ {
+ RemotingConfiguration remotingConf = servers.get(0).getMessagingServer().getRemotingService().getRemotingConfiguration();
+ if (remotingConf.isInvmDisabled())
+ {
+ Thread.sleep(time);
+ }
+ }
}
Modified: trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,203 +1,142 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.test.messaging.jms;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.ObjectOutputStream;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.MessageConsumer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-import javax.naming.InitialContext;
-
-import org.jboss.messaging.util.Logger;
-import org.jboss.test.messaging.JBMServerTestCase;
-
-/**
- * A test that makes sure that a Messaging client gracefully exists after the last connection is
- * closed. Test for http://jira.jboss.org/jira/browse/JBMESSAGING-417.
- *
- * This is not technically a crash test, but it uses the same type of topology as the crash tests
- * (local server, remote VM client).
- *
- * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
- * @version 1.1
- *
- * $Id$
- */
-public class ClientExitTest extends JBMServerTestCase
-{
- // Constants ------------------------------------------------------------------------------------
-
- public static final String SERIALIZED_CF_FILE_NAME = "CFandQueue.ser";
- public static final String MESSAGE_TEXT = "kolowalu";
-
- // Static ---------------------------------------------------------------------------------------
-
- private static final Logger log = Logger.getLogger(ClientExitTest.class);
-
- // Attributes -----------------------------------------------------------------------------------
-
- // Constructors ---------------------------------------------------------------------------------
-
- public ClientExitTest(String name)
- {
- super(name);
- }
-
- // Public ---------------------------------------------------------------------------------------
-
- public void testGracefulClientExit() throws Exception
- {
- File serialized = null;
-
- Connection conn = null;
-
- try
- {
-
- //localServer.start("all", true);
- createQueue("Queue");
-
- // lookup the connection factory and the queue which we'll send to the client VM via a
- // serialized instances saved in file
-
- InitialContext ic = getInitialContext();
- ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
- Queue queue = (Queue)ic.lookup("/queue/Queue");
-
- serialized = writeToFile(cf, queue);
-
- // spawn a JVM that creates a JMS client, which sends a test message
-
- Process p = spawnVM(serialized);
-
- // read the message from the queue
-
- conn = cf.createConnection();
- conn.start();
- Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageConsumer cons = sess.createConsumer(queue);
- TextMessage tm = (TextMessage)cons.receive(15000);
-
- assertNotNull(tm);
- assertEquals(MESSAGE_TEXT, tm.getText());
-
- // the client VM should exit by itself. If it doesn't, that means we have a problem
- // and the test will timeout
- log.info("waiting for the client VM to exit ...");
- p.waitFor();
-
- assertEquals(0, p.exitValue());
- }
- finally
- {
- try
- {
- if (conn != null)
- conn.close();
-
- // TODO delete the file
- if (serialized != null)
- {
- serialized.delete();
- }
-
- }
- catch (Throwable ignored)
- {
- log.warn("Exception ignored:" + ignored.toString(), ignored);
- }
- }
- }
-
- // Package protected ----------------------------------------------------------------------------
-
- // Protected ------------------------------------------------------------------------------------
-
-
-
- // Private --------------------------------------------------------------------------------------
-
- private Process spawnVM(File serialized) throws Exception
- {
- StringBuffer sb = new StringBuffer();
-
- sb.append("java").append(' ');
-
- String classPath = System.getProperty("java.class.path");
-
- if (System.getProperty("os.name").equals("Linux"))
- {
- sb.append("-cp").append(" ").append(classPath).append(" ");
- }
- else
- {
- sb.append("-cp").append(" \"").append(classPath).append("\" ");
- }
-
- sb.append("org.jboss.test.messaging.jms.GracefulClient ");
-
- // the first argument
- sb.append(serialized.getAbsolutePath());
-
- String commandLine = sb.toString();
-
- Process process = Runtime.getRuntime().exec(commandLine);
-
- log.trace("process: " + process);
-
- return process;
- }
-
- private File writeToFile(ConnectionFactory cf, Queue queue) throws Exception
- {
- String moduleOutput = System.getProperty("module.output");
- if (moduleOutput == null)
- {
- throw new Exception("Can't find 'module.output'");
- }
- File dir = new File(moduleOutput);
-
- if (!dir.isDirectory() || !dir.canWrite())
- {
- throw new Exception(dir + " is either not a directory or not writable");
- }
-
- File file = new File(dir, SERIALIZED_CF_FILE_NAME);
-
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
- oos.writeObject(cf);
- oos.writeObject(queue);
- oos.flush();
- oos.close();
-
- return file;
- }
-
- // Inner classes --------------------------------------------------------------------------------
-
-}
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.messaging.jms;
+
+import java.io.File;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.InitialContext;
+
+import org.jboss.messaging.util.Logger;
+import org.jboss.test.messaging.JBMServerTestCase;
+
+/**
+ * A test that makes sure that a Messaging client gracefully exists after the last connection is
+ * closed. Test for http://jira.jboss.org/jira/browse/JBMESSAGING-417.
+ *
+ * This is not technically a crash test, but it uses the same type of topology as the crash tests
+ * (local server, remote VM client).
+ *
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @version 1.1
+ *
+ * $Id$
+ */
+public class ClientExitTest extends JBMServerTestCase
+{
+ // Constants ------------------------------------------------------------------------------------
+
+ public static final String SERIALIZED_CF_FILE_NAME = "CFandQueue.ser";
+ public static final String MESSAGE_TEXT = "kolowalu";
+
+ // Static ---------------------------------------------------------------------------------------
+
+ private static final Logger log = Logger.getLogger(ClientExitTest.class);
+
+ // Attributes -----------------------------------------------------------------------------------
+
+ // Constructors ---------------------------------------------------------------------------------
+
+ public ClientExitTest(String name)
+ {
+ super(name);
+ }
+
+ // Public ---------------------------------------------------------------------------------------
+
+ public void testGracefulClientExit() throws Exception
+ {
+ File serialized = null;
+
+ Connection conn = null;
+
+ try
+ {
+
+ //localServer.start("all", true);
+ createQueue("Queue");
+
+ // lookup the connection factory and the queue which we'll send to the client VM via a
+ // serialized instances saved in file
+
+ InitialContext ic = getInitialContext();
+ ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
+ Queue queue = (Queue)ic.lookup("/queue/Queue");
+
+ serialized = SerializedClientSupport.writeToFile(SERIALIZED_CF_FILE_NAME, cf, queue);
+
+ // spawn a JVM that creates a JMS client, which sends a test message
+ Process p = SerializedClientSupport.spawnVM(GracefulClient.class.getName(), new String[] {serialized.getAbsolutePath()});
+
+ // read the message from the queue
+
+ conn = cf.createConnection();
+ conn.start();
+ Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer cons = sess.createConsumer(queue);
+ TextMessage tm = (TextMessage)cons.receive(15000);
+
+ assertNotNull(tm);
+ assertEquals(MESSAGE_TEXT, tm.getText());
+
+ // the client VM should exit by itself. If it doesn't, that means we have a problem
+ // and the test will timeout
+ log.info("waiting for the client VM to exit ...");
+ p.waitFor();
+
+ assertEquals(0, p.exitValue());
+ }
+ finally
+ {
+ try
+ {
+ if (conn != null)
+ conn.close();
+
+ // TODO delete the file
+ if (serialized != null)
+ {
+ serialized.delete();
+ }
+
+ }
+ catch (Throwable ignored)
+ {
+ log.warn("Exception ignored:" + ignored.toString(), ignored);
+ }
+ }
+ }
+
+ // Package protected ----------------------------------------------------------------------------
+
+ // Protected ------------------------------------------------------------------------------------
+
+ // Private --------------------------------------------------------------------------------------
+
+ // Inner classes --------------------------------------------------------------------------------
+
+}
Added: trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java (rev 0)
+++ trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,105 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.test.messaging.jms;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.ObjectOutputStream;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Queue;
+
+import org.jboss.messaging.util.Logger;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class SerializedClientSupport
+{
+ // Constants -----------------------------------------------------
+
+ private static final Logger log = Logger.getLogger(ClientExitTest.class);
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ public static Process spawnVM(String className, String[] args) throws Exception
+ {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("java").append(' ');
+
+ String classPath = System.getProperty("java.class.path");
+
+ if (System.getProperty("os.name").equals("Linux"))
+ {
+ sb.append("-cp").append(" ").append(classPath).append(" ");
+ }
+ else
+ {
+ sb.append("-cp").append(" \"").append(classPath).append("\" ");
+ }
+
+ sb.append(className).append(' ');
+
+ // the first argument
+ for (int i = 0; i < args.length; i++)
+ {
+ sb.append(args[i]).append(' ');
+ }
+
+ String commandLine = sb.toString();
+
+ Process process = Runtime.getRuntime().exec(commandLine);
+
+ log.trace("process: " + process);
+
+ return process;
+ }
+
+ public static File writeToFile(String fileName, ConnectionFactory cf, Queue queue) throws Exception
+ {
+ String moduleOutput = System.getProperty("java.io.tmpdir");
+ if (moduleOutput == null)
+ {
+ throw new Exception("Can't find 'module.output'");
+ }
+ File dir = new File(moduleOutput);
+
+ if (!dir.isDirectory() || !dir.canWrite())
+ {
+ throw new Exception(dir + " is either not a directory or not writable");
+ }
+
+ File file = new File(dir, fileName);
+
+ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
+ oos.writeObject(cf);
+ oos.writeObject(queue);
+ oos.flush();
+ oos.close();
+
+ return file;
+ }
+
+ // Constructors --------------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+}
Modified: trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -21,43 +21,51 @@
*/
package org.jboss.test.messaging.jms.crash;
+import java.io.File;
+
+import javax.jms.Connection;
import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
import javax.jms.Queue;
-import javax.jms.Topic;
+import javax.jms.Session;
+import javax.jms.TextMessage;
import javax.naming.InitialContext;
import org.jboss.jms.server.ConnectionManager;
-import org.jboss.jms.server.connectionmanager.SimpleConnectionManager;
import org.jboss.messaging.util.Logger;
import org.jboss.test.messaging.JBMServerTestCase;
-import org.jboss.test.messaging.tools.ServerManagement;
-import org.jboss.test.messaging.tools.container.Server;
-import org.jboss.test.messaging.tools.container.ServiceContainer;
+import org.jboss.test.messaging.jms.SerializedClientSupport;
+
/**
+ * A test that makes sure that a Messaging server cleans up the associated
+ * resources when one of its client crashes.
*
- * A ClientCrashTest.
- *
* @author <a href="tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
* @version <tt>$Revision$</tt>
- *
- * $Id$
*
*/
public class ClientCrashTest extends JBMServerTestCase
{
// Constants -----------------------------------------------------
+ public static final String SERIALIZED_CF_FILE_NAME = "ClientCrashTest_CFandQueue.ser";
+ public static final String MESSAGE_TEXT_FROM_SERVER = "ClientCrashTest from server";
+ public static final String MESSAGE_TEXT_FROM_CLIENT = "ClientCrashTest from client";
+
// Static --------------------------------------------------------
-
+
private static final Logger log = Logger.getLogger(ClientCrashTest.class);
-
+
// Attributes ----------------------------------------------------
-
- protected Server localServer;
-
- protected Server remoteServer;
+ private File serialized;
+ private ConnectionFactory cf;
+ private Queue queue;
+
// Constructors --------------------------------------------------
public ClientCrashTest(String name)
@@ -67,168 +75,114 @@
// Public --------------------------------------------------------
- // JIRA http://jira.jboss.org/jira/browse/JBMESSAGING-1196
- // The tests have been disabled until a heartbeat is added to the
- // new remoting code to check when client crashes
-
-// public void setUp() throws Exception
-// {
-// //Server might have been left around by other tests
-// kill(1);
-//
-// //stop();
-//
-// // Start the local server
-// localServer = new LocalTestServer(1);
-// localServer.start(getContainerConfig(), getConfiguration(), false);
-//
-// // Start all the services locally
-// //localServer.start("all", true);
-//
-// // This crash test is relying on a precise value of LeaseInterval, so we don't rely on
-// // the default, whatever that is ...
-//
-// localServer.deployQueue("Queue", null, false);
-//
-// localServer.deployTopic("Topic", null, false);
-//
-// // Connect to the remote server, but don't start a servicecontainer on it. We are only using
-// // the remote server to open a client connection to the local server.
-// //ServerManagement.create();
-//
-// remoteServer = servers.get(0);
-//
-// super.setUp();
-//
-// }
-//
-// public void tearDown() throws Exception
-// {
-// localServer.stop();
-//
-// super.tearDown();
-// }
-
- private void performCrash(long wait, boolean contains) throws Exception
+ public void testCrashClientWithOneConnection() throws Exception
{
- InitialContext theIC = getInitialContext();
-
- ConnectionFactory cf = (ConnectionFactory)theIC.lookup("/ConnectionFactory");
-
- Queue queue = (Queue)theIC.lookup("/queue/Queue");
-
- CreateClientOnServerCommand command = new CreateClientOnServerCommand(cf, queue, true);
-
- String remotingSessionId = (String)remoteServer.executeCommand(command);
-
- ConnectionManager cm = localServer.getServerPeer().getConnectionManager();
-
- assertTrue(cm.containsRemotingSession(remotingSessionId));
-
- // Now we should have a client connection from the remote server to the local server
-
- ServerManagement.kill(0);
-
- log.trace("killed remote server");
-
- //Wait for connection resources to be cleared up
- Thread.sleep(wait);
-
- // See if we still have a connection with this id
- assertEquals(contains, cm.containsRemotingSession(remotingSessionId));
+ crashClient(1);
}
-
- public void testTestsAreNotRunUntilJBMESSAGING_1196_IsDone() throws Exception
+
+ public void testCrashClientWithTwoConnections() throws Exception
{
-
+ crashClient(2);
}
-
- /**
- * Test that when a remote jms client crashes, server side resources for connections are
- * cleaned-up.
- */
- public void _testClientCrash() throws Exception
+
+ public void crashClient(int numberOfConnectionsOnTheClient) throws Exception
{
- localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "2000");
-
- performCrash(8000, false);
+ Connection conn = null;
+
+ try
+ {
+ assertActiveConnections(0);
+
+ // spawn a JVM that creates a JMS client, which waits to receive a test
+ // message
+ Process p = SerializedClientSupport.spawnVM(CrashClient.class
+ .getName(), new String[] { serialized.getAbsolutePath(),
+ Integer.toString(numberOfConnectionsOnTheClient) });
+
+ // send the message to the queue
+ conn = cf.createConnection();
+ conn.start();
+ Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageProducer producer = sess.createProducer(queue);
+ MessageConsumer consumer = sess.createConsumer(queue);
+
+ TextMessage messageFromClient = (TextMessage) consumer.receive(5000);
+ assertEquals(MESSAGE_TEXT_FROM_CLIENT, messageFromClient.getText());
+
+ // 1 local connection to the server
+ // + 1 per connection to the client
+ assertActiveConnections(1 + numberOfConnectionsOnTheClient);
+
+ producer.send(sess.createTextMessage(MESSAGE_TEXT_FROM_SERVER));
+
+ log.info("waiting for the client VM to crash ...");
+ p.waitFor();
+
+ assertEquals(9, p.exitValue());
+
+ Thread.sleep(2000);
+ // the crash must have been detected and the client resources cleaned
+ // up only the local connection remains
+ assertActiveConnections(1);
+
+ conn.close();
+
+ assertActiveConnections(0);
+ } finally
+ {
+ try
+ {
+ if (conn != null)
+ conn.close();
+ } catch (Throwable ignored)
+ {
+ log.warn("Exception ignored:" + ignored.toString(), ignored);
+ }
+ }
}
-
- public void _testClientCrashLargeLease() throws Exception
+
+ // Package protected ---------------------------------------------
+
+ @Override
+ protected void setUp() throws Exception
{
- localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "30000");
-
- performCrash(8000, true);
+ super.setUp();
+
+ createQueue("Queue");
+
+ InitialContext ic = getInitialContext();
+ cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");
+ queue = (Queue) ic.lookup("/queue/Queue");
+
+ serialized = SerializedClientSupport.writeToFile(SERIALIZED_CF_FILE_NAME,
+ cf, queue);
}
- public void _testClientCrashNegativeLease() throws Exception
+ @Override
+ protected void tearDown() throws Exception
{
- //Set lease period to -1 --> this should disable leasing so the state won't be cleared up
-
- localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "-1");
-
- performCrash(8000, true);
+ servers.get(0).destroyQueue("Queue", "/queue/Queue");
+
+ if (serialized != null)
+ {
+ serialized.delete();
+ }
+
+ super.tearDown();
}
-
- public void _testClientCrashZeroLease() throws Exception
- {
- //Set lease period to 0 --> this should disable leasing so the state won't be cleared up
-
- localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "0");
-
- performCrash(8000, true);
- }
-
- public void _testClientCrashWithTwoConnections() throws Exception
- {
- localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "2000");
-
- InitialContext ic = getInitialContext();
- Topic topic = (Topic)ic.lookup("/topic/Topic");
-
- ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
-
- CreateTwoClientOnServerCommand command = new CreateTwoClientOnServerCommand(cf, topic, true);
-
- String remotingSessionId[] = (String[])remoteServer.executeCommand(command);
-
- ConnectionManager cm = localServer.getServerPeer().getConnectionManager();
-
- log.info("server(0) = " + remotingSessionId[0]);
- log.info("server(1) = " + remotingSessionId[1]);
- log.info("we have = " + ((SimpleConnectionManager)cm).getClients().size() + " clients registered on SimpleconnectionManager");
-
- assertFalse(cm.containsRemotingSession(remotingSessionId[0]));
- assertTrue(cm.containsRemotingSession(remotingSessionId[1]));
-
- ServerManagement.kill(0);
-
- // Now we should have a client connection from the remote server to the local server
-
- log.info("killed remote server");
-
- // Wait for connection resources to be cleared up
- Thread.sleep(8000);
-
- // See if we still have a connection with this id
-
- //Connection state should have been cleared up by now
- assertFalse(cm.containsRemotingSession(remotingSessionId[0]));
- assertFalse(cm.containsRemotingSession(remotingSessionId[1]));
-
- log.info("Servers = " + ((SimpleConnectionManager)cm).getClients().size());
-
- assertEquals(0,((SimpleConnectionManager)cm).getClients().size());
- }
-
-
- // Package protected ---------------------------------------------
-
+
// Protected -----------------------------------------------------
-
+
// Private -------------------------------------------------------
-
-
+
+ private static void assertActiveConnections(int expectedActiveConnections)
+ throws Exception
+ {
+ ConnectionManager cm = servers.get(0).getMessagingServer()
+ .getConnectionManager();
+ assertEquals(expectedActiveConnections, cm.getActiveConnections().size());
+ }
+
// Inner classes -------------------------------------------------
}
Added: trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java (rev 0)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,107 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.messaging.jms.crash;
+
+import java.io.FileInputStream;
+import java.io.ObjectInputStream;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+
+/**
+ * Code to be run in an external VM, via main().
+ *
+ * This client will open a connection, receive a message and crash.
+ *
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ */
+public class CrashClient
+{
+ // Constants ------------------------------------------------------------------------------------
+
+ // Static ---------------------------------------------------------------------------------------
+
+ public static void main(String[] args) throws Exception
+ {
+
+ String serializedFileName = args[0];
+ int numberOfConnections = Integer.parseInt(args[1]);
+
+ // we don't want to mess with JNDI, read the connection factory and the queue from their
+ // serialized format, from disk
+ ObjectInputStream ois =
+ new ObjectInputStream(new FileInputStream(serializedFileName));
+ ConnectionFactory cf =(ConnectionFactory)ois.readObject();
+ Queue queue = (Queue)ois.readObject();
+
+ ois.close();
+
+ // create one connection which is used
+ Connection conn = cf.createConnection();
+ Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer cons = sess.createConsumer(queue);
+ MessageProducer prod = sess.createProducer(queue);
+
+ if (numberOfConnections > 1)
+ {
+ // create (num - 1) unused connections
+ for (int i = 0; i < numberOfConnections - 1; i++)
+ {
+ cf.createConnection();
+ }
+ }
+
+ prod.send(sess.createTextMessage(ClientCrashTest.MESSAGE_TEXT_FROM_CLIENT));
+
+
+ conn.start();
+ cons.receive(5000);
+
+ // crash
+ System.exit(9);
+ }
+
+ // Attributes -----------------------------------------------------------------------------------
+
+ // Constructors ---------------------------------------------------------------------------------
+
+ // Command implementation -----------------------------------------------------------------------
+
+ // Public ---------------------------------------------------------------------------------------
+
+ // Package protected ----------------------------------------------------------------------------
+
+ // Protected ------------------------------------------------------------------------------------
+
+ // Private --------------------------------------------------------------------------------------
+
+ // Inner classes --------------------------------------------------------------------------------
+
+}
Deleted: trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,98 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.test.messaging.jms.crash;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-
-import org.jboss.jms.client.JBossConnection;
-import org.jboss.test.messaging.tools.container.Command;
-import org.jboss.test.messaging.tools.container.Server;
-
-/**
- *
- * A CreateClientOnServerCommand.
- *
- * @author <a href="tim.fox at jboss.com">Tim Fox</a>
- * @version <tt>$Revision$</tt>
- *
- * $Id$
- */
-public class CreateClientOnServerCommand implements Command
-{
- private static final long serialVersionUID = -997724797145152821L;
-
- private ConnectionFactory cf;
-
- private Queue queue;
-
- private boolean retainReference;
-
- private static List commands = new ArrayList();
-
- public CreateClientOnServerCommand(ConnectionFactory cf, Queue queue, boolean retainReference)
- {
- this.cf = cf;
-
- this.queue = queue;
-
- this.retainReference = retainReference;
- }
-
- /*
- * Just create a connection, send and receive a message and leave the connection open.
- */
- public Object execute(Server server) throws Exception
- {
- if (retainReference)
- {
- commands.add(this);
- }
-
- Connection conn = cf.createConnection();
-
- Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- MessageProducer prod = sess.createProducer(queue);
-
- prod.send(sess.createMessage());
-
- MessageConsumer cons = sess.createConsumer(queue);
-
- conn.start();
-
- cons.receive();
-
- //Leave the connection unclosed
-
- //Return the remoting client session id for the connection
- return ((JBossConnection)conn).getRemotingClientSessionID();
- }
-
-}
Deleted: trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,80 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.test.messaging.jms.crash;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.Queue;
-import javax.jms.Session;
-
-import org.jboss.jms.client.JBossConnection;
-import org.jboss.test.messaging.tools.container.Command;
-import org.jboss.test.messaging.tools.container.Server;
-
-/**
- * @author <a href="tim.fox at jboss.com">Tim Fox</a>
- * @version <tt>$Revision$</tt>
- *
- * $Id$
- */
-public class CreateHangingConsumerCommand implements Command
-{
- private static final long serialVersionUID = -997724797145152821L;
-
- private ConnectionFactory cf;
- private Queue queue;
-
- public CreateHangingConsumerCommand(ConnectionFactory cf, Queue queue)
- {
- this.cf = cf;
- this.queue = queue;
- }
-
- public Object execute(Server server) throws Exception
- {
- Connection conn = cf.createConnection();
-
- Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- conn.start();
-
- MessageConsumer cons = sess.createConsumer(queue);
-
- cons.setMessageListener(new Listener());
-
- // leave the connection unclosed
-
- // return the remoting client session id for the connection
- return ((JBossConnection)conn).getRemotingClientSessionID();
- }
-
- class Listener implements MessageListener
- {
- public void onMessage(Message m)
- {
- }
- }
-
-}
Deleted: trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,96 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.test.messaging.jms.crash;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Topic;
-
-import org.jboss.jms.client.JBossConnection;
-import org.jboss.test.messaging.tools.container.Command;
-import org.jboss.test.messaging.tools.container.Server;
-
-/**
- *
- * A CreateClientOnServerCommand.
- *
- * @author <a href="tim.fox at jboss.com">Tim Fox</a>
- * @author <a href="clebert.suconic at jboss.com">Clebert Suconic</a>
- * @version <tt>$Revision$</tt>
- *
- * $Id$
- */
-public class CreateTwoClientOnServerCommand implements Command
-{
- private static final long serialVersionUID = -997724797145152821L;
-
- private ConnectionFactory cf;
-
- private boolean retainReference;
-
- private static List commands = new ArrayList();
-
- Topic topic;
- Connection conn1;
- Connection conn2;
-
- public CreateTwoClientOnServerCommand(ConnectionFactory cf, Topic topic, boolean retainReference)
- {
- this.cf = cf;
- this.topic = topic;
-
- this.retainReference = retainReference;
- }
-
- /*
- * Just create a connection, send and receive a message and leave the connection open.
- */
- public Object execute(Server server) throws Exception
- {
- if (retainReference)
- {
- commands.add(this);
- }
-
- conn1 = cf.createConnection();
- conn1.setClientID("test1");
- conn1.start();
-
- conn2 = cf.createConnection();
- conn2.setClientID("test2");
- conn2.start();
-
- String arrays[] = new String[2];
- arrays[0] = ((JBossConnection)conn1).getRemotingClientSessionID();
- arrays[1] = ((JBossConnection)conn2).getRemotingClientSessionID();
-
- conn1.close();
-
-
- // Return the remoting client session id for the connection
- return arrays;
- }
-
-}
Modified: trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -195,7 +195,7 @@
assertEquals(topic1, m.getJMSReplyTo());
assertEquals("someArbitraryType", m.getJMSType());
assertEquals(queue1, m.getJMSDestination());
- assertTrue(m.getJMSRedelivered() == redelivered);
+ assertEquals("JMS Redelivered property", m.getJMSRedelivered(), redelivered);
assertEquals(mode, m.getJMSDeliveryMode());
}
Modified: trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java 2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -32,10 +32,10 @@
import javax.jms.JMSException;
import javax.jms.QueueConnection;
-import org.jboss.jms.server.ConnectionManager;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
+import org.jboss.jms.client.api.FailureListener;
import org.jboss.messaging.core.remoting.RemotingConfiguration;
import org.jboss.messaging.core.remoting.impl.mina.MinaService;
+import org.jboss.messaging.util.MessagingException;
import org.jboss.test.messaging.jms.JMSTestCase;
/**
@@ -86,11 +86,15 @@
networkFailureFilter = new NetworkFailureFilter();
minaService.getFilterChain().addFirst("network-failure",
networkFailureFilter);
+
+ assertActiveConnectionsOnTheServer(0);
}
@Override
protected void tearDown() throws Exception
{
+ assertActiveConnectionsOnTheServer(0);
+
minaService.getFilterChain().remove("network-failure");
minaService.stop();
@@ -119,9 +123,8 @@
exceptionLatch.countDown();
}
});
- ConnectionExceptionListener listener = new ListenerWithLatch(
- exceptionLatch);
- minaService.addConnectionExceptionListener(listener);
+ FailureListener listener = new FailureListenerWithLatch(exceptionLatch);
+ minaService.addFailureListener(listener);
networkFailureFilter.messageSentThrowsException = new IOException(
"Client is unreachable");
@@ -140,7 +143,7 @@
{
}
- minaService.removeConnectionExceptionListener(listener);
+ minaService.removeFailureListener(listener);
}
public void testServerResourcesCleanUpWhenClientCommDropsPacket()
@@ -153,13 +156,13 @@
{
public void onException(JMSException e)
{
+ log.warn("got expected exception on the client");
exceptionLatch.countDown();
}
});
- ConnectionExceptionListener listener = new ListenerWithLatch(
- exceptionLatch);
- minaService.addConnectionExceptionListener(listener);
+ FailureListener listener = new FailureListenerWithLatch(exceptionLatch);
+ minaService.addFailureListener(listener);
assertActiveConnectionsOnTheServer(1);
@@ -167,7 +170,7 @@
networkFailureFilter.messageReceivedDropsPacket = true;
boolean gotExceptionsOnTheServerAndTheClient = exceptionLatch.await(
- KEEP_ALIVE_INTERVAL + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
+ KEEP_ALIVE_INTERVAL + KEEP_ALIVE_TIMEOUT + 3, SECONDS);
assertTrue(gotExceptionsOnTheServerAndTheClient);
assertActiveConnectionsOnTheServer(0);
@@ -186,27 +189,18 @@
// Private -------------------------------------------------------
- private static void assertActiveConnectionsOnTheServer(int expectedSize)
- throws Exception
+ private final class FailureListenerWithLatch implements FailureListener
{
- ConnectionManager cm = servers.get(0).getMessagingServer()
- .getConnectionManager();
- assertEquals(expectedSize, cm.getActiveConnections().size());
- }
-
- // Inner classes -------------------------------------------------
-
- private final class ListenerWithLatch implements ConnectionExceptionListener
- {
private final CountDownLatch exceptionLatch;
- private ListenerWithLatch(CountDownLatch exceptionLatch)
+ private FailureListenerWithLatch(CountDownLatch exceptionLatch)
{
this.exceptionLatch = exceptionLatch;
}
- public void handleConnectionException(Throwable e, String sessionID)
+ public void onFailure(MessagingException me)
{
+ log.warn("got expected exception on the server");
exceptionLatch.countDown();
}
}
Added: trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java (rev 0)
+++ trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java 2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.messaging.jms.server;
+
+import javax.jms.Connection;
+
+import org.jboss.test.messaging.JBMServerTestCase;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class ConnectionManagerTest extends JBMServerTestCase
+{
+ // Constants -----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Attributes ----------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+ public ConnectionManagerTest(String name)
+ {
+ super(name);
+ }
+
+ // TestCase overrides -------------------------------------------
+
+ // Public --------------------------------------------------------
+
+ public void testTwoConnectionsFromTheSameVM() throws Exception
+ {
+
+ assertActiveConnectionsOnTheServer(0);
+
+ Connection conn_1 = getConnectionFactory().createConnection();
+
+ assertActiveConnectionsOnTheServer(1);
+
+ Connection conn_2 = getConnectionFactory().createConnection();
+
+ assertActiveConnectionsOnTheServer(2);
+
+ assertFalse(conn_1.equals(conn_2));
+
+ conn_1.close();
+
+ assertActiveConnectionsOnTheServer(1);
+
+ conn_2.close();
+
+ assertActiveConnectionsOnTheServer(0);
+ }
+
+}
More information about the jboss-cvs-commits
mailing list