0 Replies Latest reply on Feb 15, 2012 10:55 AM by harshildesai

    JBoss with Websphere MQ connection issue: DetailedIllegalStateException

    harshildesai

      Hi

       

      We connect to WebspehereMQ for sending and receiving the JMS messages in our JBoss EAP 4.2 app server - this was all working fine. Now there has been an upgrade of the WMQ series from version 5.2 to 7. We have been provided with the new libraries and new hostName for making this change at our end.

       

      I have made the following changes:

      - updated the hostName in custom datasource file ful-jms-ds.xml  which looks like this:

       

      <connection-factories>
      
        <tx-connection-factory> 
          <jndi-name>MyTestQueueConnectionFactory</jndi-name>
          <xa-transaction />
          <rar-name>wmq.jmsra.rar</rar-name>
          <connection-definition>javax.jms.ConnectionFactory</connection-definition>
          <config-property name="channel" type="java.lang.String">JAVA.CHANNEL</config-property>
          <config-property name="hostName" type="java.lang.String">myserver</config-property>
          <config-property name="port" type="java.lang.String">myport</config-property>
          <config-property name="queueManager" type="java.lang.String">MYTEST.MW</config-property>
          <config-property name="transportType" type="java.lang.String">CLIENT</config-property>
          <security-domain-and-application>JmsXARealm</security-domain-and-application>
        </tx-connection-factory>
      
        <!-- admin object definition Queue Setting -->
             <mbean code="org.jboss.resource.deployment.AdminObject" name="jca.wmq:name=myTestQueue">
               <attribute name="JNDIName">TestQueue</attribute>
               <depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='wmq.jmsra.rar'</depends>
               <attribute name="Type">javax.jms.Queue</attribute> 
               <attribute name="Properties">
                 baseQueueManagerName=MYTEST.MW
                 baseQueueName=MYTESTSQL.ECOMMERCEORDERS
               </attribute>
       </mbean>
      </connection-factories>
      

       

      - Replaced the deployer file wmq.jmsra.rar with the new one at JBOSS_HOME/server/server_name/deploy/ directory

       

      The JNDI lookup and connection creation is done from the Java class in the ear. There are no WMQ specific classes used in the java class hence no libraries need to be changed in the ear. Here is the method

       

      public void sendMessage(String textMessage, String jndiQueueConnFactory , String jndiQueue) throws JMSException , SystemException
          {
              Connection tempConnection = null;
              private ConnectionFactory queueConnectionFactory_OFS;
      
              try 
              {
                  Context  ctx = new InitialContext();
                  if(null == queueConnectionFactory_OFS)
                  {
                      queueConnectionFactory_OFS = (ConnectionFactory)ctx.lookup(jndiQueueConnFactory);                
                  }
                  
                  if(null == queue_OFS)
                      queue_OFS = (Queue) ctx.lookup(jndiQueue);    
                  
                  tempConnection = queueConnectionFactory_OFS.createConnection();
                  tempConnection.start();
                  Session session = tempConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                  MessageProducer producer = session.createProducer(queue_OFS);
                  TextMessage message = session.createTextMessage();
                  message.setText(textMessage);
                  producer.send(message);
                              
                  if(null != tempConnection)
                  {
                      tempConnection.stop();
                      tempConnection.close();
                  }
              } 
              catch (JMSException e) 
              {
                  throw new SystemException("JMSException while connecting to Queue");
              }
              catch(NamingException ne)        
              {
                      throw new SystemException("NamingException while connecting to Queue"); 
              }
          }
      

       

       

      When i send the JMS messages, the message do reach the new queues, however, there are exception in the logs which i suspect is coming while closing the connection:

       

      2012-02-13 07:47:35,302 ERROR [STDERR] com.ibm.msg.client.jms.DetailedIllegalStateException: MQJCA1031: The method can only be called in the application client container. 
      The application was not running in the application client container when this method was called.  Ensure that the application runs in the application client container, 
      or modify the application to avoid this method call.
      2012-02-13 07:47:35,303 ERROR [STDERR]  at com.ibm.mq.connector.services.JCAExceptionBuilder.buildException(JCAExceptionBuilder.java:149)
      2012-02-13 07:47:35,303 ERROR [STDERR]  at com.ibm.mq.connector.services.JCAExceptionBuilder.buildException(JCAExceptionBuilder.java:86)
      2012-02-13 07:47:35,303 ERROR [STDERR]  at com.ibm.mq.connector.outbound.ConnectionWrapper.stop(ConnectionWrapper.java:221)
      

       

       

      Can you please help me. Let me know if you need any other information.