Simple test class is attached below. It basically sends messages to one server 
until it gets an exception, at which point it starts sending them to a second 
server.

I am running this test case on the server1 (localhost) machine. I run it and 
leave it for a few minutes sending messages to the server1 JBoss Messaging 
instance on localhost. I then shutdown the server1 instance and the messages 
begin to be sent to server2 (as expected). If you leave it run for a few 
minutes more, eventually sending to server2 will fail as well with the 
exception:


  | 2006-11-09 14:21:36,859 ERROR 
org.jboss.jms.client.container.ExceptionInterceptor - Caught RuntimeException
  | org.jboss.remoting.CannotConnectException: Can not get connection to 
server.  Problem establishing socket connection for locator - InvokerLocator 
[socket://161.117.20.9:4457/?dataType=jms&marshaller=org.jboss.jms.server.remoting.JMSWireFormat&serializationtype=jboss&socket.check_connection=false&unmarshaller=org.jboss.jms.server.remoting.JMSWireFormat]
  |     at 
org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:323)
  |     at 
org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:125)
  |     at org.jboss.remoting.Client.invoke(Client.java:589)
  |     at org.jboss.remoting.Client.invoke(Client.java:581)
  |     at 
org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate.invoke(ClientConnectionFactoryDelegate.java:199)
  |     at 
org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate$getIdBlock_2799534920426283165.invokeNext(ClientConnectionFactoryDelegate$getIdBlock_2799534920426283165.java)
  |     at 
org.jboss.jms.client.container.ExceptionInterceptor.invoke(ExceptionInterceptor.java:69)
  |     at 
org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate$getIdBlock_2799534920426283165.invokeNext(ClientConnectionFactoryDelegate$getIdBlock_2799534920426283165.java)
  |     at 
org.jboss.jms.client.container.ClientLogInterceptor.invoke(ClientLogInterceptor.java:107)
  |     at 
org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate$getIdBlock_2799534920426283165.invokeNext(ClientConnectionFactoryDelegate$getIdBlock_2799534920426283165.java)
  |     at 
org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate.getIdBlock(ClientConnectionFactoryDelegate.java)
  |     at 
org.jboss.jms.message.MessageIdGenerator.getNextBlock(MessageIdGenerator.java:72)
  |     at 
org.jboss.jms.message.MessageIdGenerator.getId(MessageIdGenerator.java:86)
  |     at 
org.jboss.jms.client.container.ProducerAspect.handleSend(ProducerAspect.java:230)
  |     at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
  |     at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  |     at java.lang.reflect.Method.invoke(Method.java:324)
  |     at 
org.jboss.aop.advice.PerInstanceAdvice.invoke(PerInstanceAdvice.java:130)
  |     at 
org.jboss.jms.client.delegate.ClientProducerDelegate$send_3961598017717988886.invokeNext(ClientProducerDelegate$send_3961598017717988886.java)
  |     at 
org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:182)
  |     at 
org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:117)
  |     at 
org.jboss.jms.client.delegate.ClientProducerDelegate$send_3961598017717988886.invokeNext(ClientProducerDelegate$send_3961598017717988886.java)
  |     at 
org.jboss.jms.client.container.ExceptionInterceptor.invoke(ExceptionInterceptor.java:69)
  |     at 
org.jboss.jms.client.delegate.ClientProducerDelegate$send_3961598017717988886.invokeNext(ClientProducerDelegate$send_3961598017717988886.java)
  |     at 
org.jboss.jms.client.container.ClientLogInterceptor.invoke(ClientLogInterceptor.java:107)
  |     at 
org.jboss.jms.client.delegate.ClientProducerDelegate$send_3961598017717988886.invokeNext(ClientProducerDelegate$send_3961598017717988886.java)
  |     at 
org.jboss.jms.client.delegate.ClientProducerDelegate.send(ClientProducerDelegate.java)
  |     at 
org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:172)
  |     at 
org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:220)
  |     at 
org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:147)
  |     at 
org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:138)
  |     at 
TestMultiConnectionMessageProducer.test(TestMultiConnectionMessageProducer.java:140)
  |     at 
TestMultiConnectionMessageProducer.main(TestMultiConnectionMessageProducer.java:27)
  | Caused by: java.net.ConnectException: Connection refused: connect
  |     at java.net.PlainSocketImpl.socketConnect(Native Method)
  |     at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
  |     at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
  |     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
  |     at java.net.Socket.connect(Socket.java:452)
  |     at java.net.Socket.connect(Socket.java:402)
  |     at java.net.Socket.<init>(Socket.java:309)
  |     at java.net.Socket.<init>(Socket.java:124)
  |     at 
org.jboss.remoting.transport.socket.SocketClientInvoker.createSocket(SocketClientInvoker.java:183)
  |     at 
org.jboss.remoting.transport.socket.MicroSocketClientInvoker.getConnection(MicroSocketClientInvoker.java:685)
  |     at 
org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:319)
  |     ... 32 more
  | 

I've put the session.createQueue calls in for each message dispatch as this is 
what the Spring JmsTemplate class does (which is what we're using in our 
application).  When I debug our application, the first call to the 
session.createQueue method after the server has failed takes quite a long time 
(30 seconds or more).  I can't replicate this delay in the test case at the 
moment.  In our application, this causes a delay in the failover as at the 
point of calling createQueue, we don't know that the server has failed yet.

You'll notice in the output that the ExceptionListener on the connection can 
fire quite a while (30 seconds) after the connection has actually been lost. We 
use the ExceptionListener to shutdown our session pool and initiate 
reconnection in a separate thread.  Until the listener fires, we may still hand 
out sessions from the pool that are for the server that is no longer there.

As an aside, when we detect a failed connection what should we do to clean it 
up?  If I put in the code to try closing the Producer, Session and Connection 
and ignore any exceptions it takes quite a long time to execute (around 60 
seconds for session.close() and 60 seconds for connection.close()). With this 
close code in place, when it tries the second server the error that is 
generated is:


  | 2006-11-09 14:41:00,937 ERROR 
org.jboss.jms.client.container.ExceptionInterceptor - Caught Exception: 
  | org.jboss.aop.NotFoundInDispatcherException: Object with oid: -2147483641 
was not found in the Dispatcher
  |     at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:85)
  |     at 
org.jboss.jms.server.remoting.JMSServerInvocationHandler.invoke(JMSServerInvocationHandler.java:127)
  |     at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:1008)
  |     at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:857)
  |     at 
org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:454)
  |     at 
org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:541)
  |     at 
org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:261)
  |     at 
org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:172)
  |     at org.jboss.remoting.Client.invoke(Client.java:589)
  |     at org.jboss.remoting.Client.invoke(Client.java:581)
  |     at 
org.jboss.jms.client.delegate.DelegateSupport.invoke(DelegateSupport.java:111)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate$createQueue_6431069199924553036.invokeNext(ClientSessionDelegate$createQueue_6431069199924553036.java)
  |     at 
org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:182)
  |     at 
org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:117)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate$createQueue_6431069199924553036.invokeNext(ClientSessionDelegate$createQueue_6431069199924553036.java)
  |     at 
org.jboss.jms.client.container.ExceptionInterceptor.invoke(ExceptionInterceptor.java:69)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate$createQueue_6431069199924553036.invokeNext(ClientSessionDelegate$createQueue_6431069199924553036.java)
  |     at 
org.jboss.jms.client.container.ClientLogInterceptor.invoke(ClientLogInterceptor.java:107)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate$createQueue_6431069199924553036.invokeNext(ClientSessionDelegate$createQueue_6431069199924553036.java)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate.createQueue(ClientSessionDelegate.java)
  |     at org.jboss.jms.client.JBossSession.createQueue(JBossSession.java:272)
  |     at 
TestMultiConnectionMessageProducer.test(TestMultiConnectionMessageProducer.java:135)
  |     at 
TestMultiConnectionMessageProducer.main(TestMultiConnectionMessageProducer.java:27)
  | org.jboss.jms.util.MessagingJMSException: Caught exception
  | Connection 2 failed:
  |     at 
org.jboss.jms.client.container.ExceptionInterceptor.invoke(ExceptionInterceptor.java:99)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate$createQueue_6431069199924553036.invokeNext(ClientSessionDelegate$createQueue_6431069199924553036.java)
  |     at 
org.jboss.jms.client.container.ClientLogInterceptor.invoke(ClientLogInterceptor.java:107)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate$createQueue_6431069199924553036.invokeNext(ClientSessionDelegate$createQueue_6431069199924553036.java)
  |     at 
org.jboss.jms.client.delegate.ClientSessionDelegate.createQueue(ClientSessionDelegate.java)
  |     at org.jboss.jms.client.JBossSession.createQueue(JBossSession.java:272)
  |     at 
TestMultiConnectionMessageProducer.test(TestMultiConnectionMessageProducer.java:135)
  |     at 
TestMultiConnectionMessageProducer.main(TestMultiConnectionMessageProducer.java:27)
  | 

Thanks for your assistance,

David

Test Case:


  | import java.util.Hashtable;
  | 
  | import javax.jms.Connection;
  | import javax.jms.ConnectionFactory;
  | import javax.jms.ExceptionListener;
  | import javax.jms.JMSException;
  | import javax.jms.Message;
  | import javax.jms.MessageConsumer;
  | import javax.jms.MessageListener;
  | import javax.jms.MessageProducer;
  | import javax.jms.Queue;
  | import javax.jms.Session;
  | import javax.jms.TextMessage;
  | import javax.naming.Context;
  | import javax.naming.InitialContext;
  | import javax.naming.NamingException;
  | 
  | public class TestMultiConnectionMessageProducer {
  | 
  |   /**
  |    * @param args
  |    */
  |   public static void main(String[] args) {
  |     TestMultiConnectionMessageProducer ml = new 
TestMultiConnectionMessageProducer();
  | 
  |     try {
  |       ml.test();
  |     } catch (JMSException e) {
  |       // TODO Auto-generated catch block
  |       e.printStackTrace();
  |     }
  |   }
  | 
  |   private void test() throws JMSException {
  |     // Setup connection 1
  |     Hashtable properties1 = new Hashtable();
  |     properties1.put(Context.INITIAL_CONTEXT_FACTORY,
  |         "org.jnp.interfaces.NamingContextFactory");
  |     properties1.put(Context.URL_PKG_PREFIXES,
  |         "org.jboss.naming:org.jnp.interfaces");
  |     properties1.put(Context.PROVIDER_URL, "jnp://localhost:1099");
  |     properties1.put(Context.SECURITY_PRINCIPAL, "admin");
  |     properties1.put(Context.SECURITY_CREDENTIALS, "admin");
  | 
  |     ConnectionFactory connectionFactory1 = null;
  | 
  |     try {
  |       Context context1 = new InitialContext(properties1);
  |       connectionFactory1 = (ConnectionFactory) context1
  |           .lookup("ConnectionFactory");
  |     } catch (NamingException ne) {
  |       throw new RuntimeException(ne);
  |     }
  | 
  |     final Connection connection1 = connectionFactory1.createConnection();
  |     ExceptionListener listener1 = new ExceptionListener() {
  |       public void onException(JMSException jmse) {
  |         System.out.println("Fired exception listener on connection 1");
  |       }
  |     };
  |     connection1.setExceptionListener(listener1);
  | 
  |     Session session1 = connection1.createSession(false,
  |         Session.AUTO_ACKNOWLEDGE);
  | 
  |     boolean connection1OK = true;
  | 
  |     // Setup connection 2
  |     Hashtable properties2 = new Hashtable();
  |     properties2.put(Context.INITIAL_CONTEXT_FACTORY,
  |         "org.jnp.interfaces.NamingContextFactory");
  |     properties2.put(Context.URL_PKG_PREFIXES,
  |         "org.jboss.naming:org.jnp.interfaces");
  |     properties2.put(Context.PROVIDER_URL, "jnp://server2:1099");
  |     properties2.put(Context.SECURITY_PRINCIPAL, "admin");
  |     properties2.put(Context.SECURITY_CREDENTIALS, "admin");
  | 
  |     ConnectionFactory connectionFactory2 = null;
  | 
  |     try {
  |       Context context2 = new InitialContext(properties2);
  |       connectionFactory2 = (ConnectionFactory) context2
  |           .lookup("ConnectionFactory");
  |     } catch (NamingException ne) {
  |       throw new RuntimeException(ne);
  |     }
  | 
  |     final Connection connection2 = connectionFactory2.createConnection();
  |     ExceptionListener listener2 = new ExceptionListener() {
  |       public void onException(JMSException jmse) {
  |         System.out.println("Fired exception listener on connection 2");
  |       }
  |     };
  |     connection2.setExceptionListener(listener2);
  | 
  |     Session session2 = connection2.createSession(false,
  |         Session.AUTO_ACKNOWLEDGE);
  | 
  |     boolean connection2OK = true;
  |     boolean finished = false;
  |     while (!finished && (connection1OK || connection2OK)) {
  |       if (connection1OK) {
  |         try {
  |           TextMessage msg1 = session1.createTextMessage("Message");
  |           System.out.println("Creating queue 1");
  |           Queue queue1 = session1.createQueue("publish.request");
  |           System.out.println("Creating producer 1");
  |           MessageProducer producer1 = session1.createProducer(queue1);
  |           System.out.println("Sending message to queue 1");
  |           producer1.send(msg1);
  |           producer1.close();
  |           System.out.println("Connection 1 OK");
  |           System.out.println("==========================");
  |         } catch (Exception e) {
  |           connection1OK = false;
  |           System.out.println("Connection 1 failed:");
  |           e.printStackTrace();
  | //          try {
  | //            System.out.println("Closing session 1");
  | //            session1.close();
  | //          } catch (Exception e1) {
  | //          }
  | //          try {
  | //            System.out.println("Closing connection 1");
  | //            connection1.close();
  | //          } catch (Exception e1) {
  | //          }
  |         }
  |       }
  |       if (!connection1OK && connection2OK) {
  |         try {
  |           System.out.println("Trying server 2");
  |           TextMessage msg2 = session2.createTextMessage("Message");
  |           System.out.println("Creating queue 2");
  |           Queue queue2 = session2.createQueue("publish.request");
  |           System.out.println("Creating producer 2");
  |           MessageProducer producer2 = session2.createProducer(queue2);
  |           System.out.println("Sending message to queue 2");
  |           producer2.send(msg2);
  |           producer2.close();
  |           System.out.println("Connection 2 OK");
  |           System.out.println("==========================");
  |         } catch (Exception e2) {
  |           connection2OK = false;
  |           System.out.println("Connection 2 failed:");
  |           e2.printStackTrace();
  |         }
  |       }
  | 
  |       try {
  |         Thread.currentThread().sleep(1000);
  |       } catch (InterruptedException e) {
  |         finished = true;
  |       }
  |     }
  |   }
  | }
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3984374#3984374

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3984374
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to