2 Replies Latest reply on Dec 24, 2008 10:35 PM by Ron Sigal

    Problem with closing connection on client side

    Amar Trnka Newbie

      Hi,

      I have two applications and they are published on two different JBoss servers.
      The first server (client):
      - Default server configuration - jboss-4.2.2.GA

      Second server (server):
      - Messaging server configuration - jboss-4.2.2.GA - with jboss-messaging-1.4.0.SP3 on it.

      Client sends messages to the server and application on messaging server puts all messages into the queue.

      Application code for connecting from client to server is:


      private JndiTemplate jndiTemplate;
      private JndiObjectFactoryBean jmsQueueConnectionFactory;
      private JndiObjectFactoryBean queueDestination;
      private SingleConnectionFactory connectionFactory;
      private JmsTemplate jmsIngestionTemplate;
      ...
      
      Properties props = new Properties();
      ...
      
      jndiTemplate = new JndiTemplate();
      jndiTemplate.setEnvironment(props);
      
      jmsQueueConnectionFactory = new JndiObjectFactoryBean();
      jmsQueueConnectionFactory.setJndiTemplate(jndiTemplate);
      jmsQueueConnectionFactory.setJndiName("ConnectionFactory");
      jmsQueueConnectionFactory.afterPropertiesSet();
      
      queueDestination = new JndiObjectFactoryBean();
      queueDestination.setLookupOnStartup(true);
      queueDestination.setJndiTemplate(jndiTemplate);
      queueDestination.setJndiName(...);
      queueDestination.afterPropertiesSet();
      
      connectionFactory = new SingleConnectionFactory();
      connectionFactory.setTargetConnectionFactory((ConnectionFactory)jmsQueueConnectionFactory.getObject());
      connectionFactory.initConnection();
      
      jmsIngestionTemplate = new JmsTemplate();
      jmsIngestionTemplate.setConnectionFactory((ConnectionFactory)connectionFactory);
      jmsIngestionTemplate.setDefaultDestination((Destination)queueDestination.getObject());
      jmsIngestionTemplate.setReceiveTimeout(30000);
      
      messageDispatcher.setJmsTemplate(jmsIngestionTemplate);
      ...
      


      Becouse I'm using SingleConnectionFactory I have next problem:
      when both servers are up and running, and second messaging server shuts down, application on the default server throws exception:

      ERROR [Timer-4] socket.SocketClientInvoker (SocketClientInvoker.java:109) - Got marshalling exception, exiting
      java.io.IOException: Connection reset by peer: socket write error
       at java.net.SocketOutputStream.socketWrite0(Native Method)
       at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
       at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
       at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
       at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
       at java.io.DataOutputStream.flush(DataOutputStream.java:106)
       at org.jboss.jms.wireformat.SerializedPacket.write(SerializedPacket.java:81)
       at org.jboss.jms.wireformat.JMSWireFormat.write(JMSWireFormat.java:237)
       at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedWrite(MicroSocketClientInvoker.java:983)
       at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:559)
       at org.jboss.remoting.transport.bisocket.BisocketClientInvoker.transport(BisocketClientInvoker.java:413)
       at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122)
       at org.jboss.remoting.ConnectionValidator.doCheckConnection(ConnectionValidator.java:133)
       at org.jboss.remoting.ConnectionValidator.run(ConnectionValidator.java:308)
       at java.util.TimerThread.mainLoop(Timer.java:512)
       at java.util.TimerThread.run(Timer.java:462)
      


      and LeasePinger starts its pingging...

      2008-12-12 17:08:37,295 WARN [Timer-3] remoting.LeasePinger (LeasePinger.java:290) - LeasePinger[SocketClientInvoker[104d3c8, bisocket://172.20.12.37:4457](4skc11-j1ifh9-fon18jfd-1-fon19dxv-a)] failed to ping to server: Can not get connection to server. Problem establishing socket connection for InvokerLocator [bisocket://172.20.12.37:4457/?JBM_clientMaxPoolSize=200&clientLeasePeriod=10000&clientSocketClass=org.jboss.jms.client.remoting.ClientSocketWrapper&dataType=jms&marshaller=org.jboss.jms.wireformat.JMSWireFormat&numberOfCallRetries=1&numberOfRetries=10&pingFrequency=214748364&pingWindowFactor=10&socket.check_connection=false&timeout=0&unmarshaller=org.jboss.jms.wireformat.JMSWireFormat]
      



      If I use ConnectionFactory instead of SingleConnectionFactory evertything works perfectly, but for performance reasons I must use SingleConnectionFactory.
      Reason for this exceptions and pingging is that connection on client side (default server) is not destroyed when server shuts down.
      If I start Messaging server again and connection is re-established when I send message exception is thrown:

      org.jboss.jms.exception.MessagingJMSException: Failed to invoke; nested exception is java.lang.IllegalStateException: Cannot find object in dispatcher with id h-n2e91nof-1-8fe81nof-gdf8gm-11cks4
      ...
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
       at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
       at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
       at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
       at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
       at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
       at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
       at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
       at java.lang.Thread.run(Thread.java:595)
      
      
      Reason: client is still having old connection instance.
      
      Finaly my question: is there any way to inform client from server to close it's connection while Messaging JBoss is shutting down.
      
      ps. I'm new in JBoss and JBoss Messaging. Maybe I've done this wrong. Any help I will gladly accept. I'm sorry if I forgot to write down some more information.
      
      Amar