How to get JMS local transaction with JBOSS AS 7.2.0
chintan.modha Aug 26, 2013 5:26 PMHi All,
I'm trying to obtain JMS local transaction with JBOSS AS 7.2.0, but unfortunately I'm unable to get one. The issue over here is that when I use
session = conn.createQueueSession(true,QueueSession.AUTO_ACKNOWLEDGE);
the session that I'm getting is not transacted, even when I pass "true" to the createQueueSession(boolean transacted, int acknowledgeMode) method. I'm not sure what am I doing wrong over here . Also, I'm using IBM WMQ 6 as a JMS provider for this example.
Here's my JMS code, which I'm invoking through a servlet.
package com.example.test; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueReceiver; import javax.jms.QueueSession; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class QueueConnectionTest implements MessageListener{ private String jndiConnectionFactoryName = null; private String jndiQueueName = null; private QueueConnectionFactory factory = null; private QueueConnection conn = null; private QueueReceiver receiver = null; private QueueSession session = null; private Queue testQueue = null; public QueueConnectionTest(String jndiConnectionFactoryName, String jndiQueueName){ this.jndiConnectionFactoryName = jndiConnectionFactoryName; this.jndiQueueName = jndiQueueName; } public void initilize(){ if(this.jndiConnectionFactoryName!=null && this.jndiQueueName!=null){ try{ Context context = new InitialContext(); factory = (QueueConnectionFactory) context.lookup(this.jndiConnectionFactoryName); if(factory!=null){ testQueue = (Queue) context.lookup(this.jndiQueueName); if(factory!=null && testQueue!=null){ conn = factory.createQueueConnection(); session = conn.createQueueSession(true,QueueSession.AUTO_ACKNOWLEDGE); receiver = session.createReceiver(testQueue); receiver.setMessageListener(this); conn.start(); System.out.println(":::: Receiver STARTED for accepting messages ::::"); } } }catch(NamingException nx){ nx.printStackTrace(); }catch(JMSException ex){ ex.printStackTrace(); } } } public void onMessage(Message msg) { // TODO Auto-generated method stub if(msg!=null && msg instanceof TextMessage){ TextMessage txtMsg = (TextMessage)msg; try { System.out.println("Got Message : "+txtMsg.getText()); System.out.println("Is session transacted...."+session.getTransacted()); } catch (JMSException e) { e.printStackTrace(); } } } }
Here's my servlet code which initializes and starts the inbound message receiver.
package com.scholastic.test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ConnectionServlet */ @WebServlet("/ConnectionServlet") public class ConnectionServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ConnectionServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doPost(request,response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub QueueConnectionTest qConn = new QueueConnectionTest("jboss/jms/BPJMSQueueConnectionFactory","jboss/jms/BPJMSInboundQueue"); qConn.initilize(); } }
I'm also attaching the WMQ resource adapter configuration, which I have used for standalone-full.xml
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"> <resource-adapters> <resource-adapter> <archive>wmq.jmsra.rar</archive> <transaction-support>LocalTransaction</transaction-support> <config-property name="traceEnabled">true</config-property> <config-property name="traceLevel">3</config-property> <connection-definitions> <connection-definition class-name="com.ibm.mq.connector.outbound.ManagedQueueConnectionFactoryImpl" jndi-name="java:jboss/jms/BPJMSQueueConnectionFactory" enabled="true" use-java-context="true" pool-name="BPJMSQueueConnectionFactoryPool"> <config-property name="port">1417</config-property> <config-property name="hostName">xx.xx.xx.xxx</config-property> <config-property name="channel">MQ.CLIENT</config-property> <config-property name="transportType">CLIENT</config-property> <config-property name="queueManager">MYQGMR</config-property> <pool> <min-pool-size>1</min-pool-size> <max-pool-size>10</max-pool-size> </pool> </connection-definition> </connection-definitions> <admin-objects> <admin-object class-name="com.ibm.mq.connector.outbound.MQQueueProxy" jndi-name="java:jboss/jms/BPJMSInboundQueue" enabled="true" use-java-context="true" pool-name="BPJMSInboundQueuePool"> <config-property name="baseQueueName">INBOUND.QUEUE.TESTING</config-property> <config-property name="baseQueueManagerName">MYQGMR</config-property> <config-property name="targetClient">JMS</config-property> </admin-object> </admin-objects> </resource-adapter> </resource-adapters> </subsystem>
so whenever I run my test, I always get the below message in the logs
13:45:56,735 INFO [stdout] (http-localhost/192.168.245.128:8080-1) Got Message : Hello
13:45:56,735 INFO [stdout] (http-localhost/192.168.245.128:8080-1) Is session transacted....false
Can someone please help me out in how to obtain transacted session ? I appreciate any insights on this is particular issue.
Regard,
Chintan