If I want to send a backlog of messages in a queue and I want the consumer to start processing the messages once they are all send, I need to create a transacted session and commit it in the end. This works smoothly with JBoss Messaging but is not possible with MRG in a servlet. Steps to Reproduce: 1. checkout https://svn.devel.redhat.com/repos/jboss-qa/mrg/tests/mdb 2. fix annotation in /mdb-ejb/src/main/java/org/jboss/test/mdb/MRGJCAMessageBean.java to point to your MRG server (this class is not used in the test, but could prevent deployment) 3. compile with mvn -DskipTests clean package 4. copy mdb/mdb-test/target/mdb-test.ear to deploy directory of EAP 5.1.1 (profile production) 5. checkout https://svn.devel.redhat.com/repos/jboss-qa/mrg/qpid-java-jca 6. configure qpid-java-jca/qpid-jca-ds.xml to point to your MRG server 7. copy qpid-java-jca/qpid* to server's deploy directory 7. Start EAP 8. Go to http://localhost:8080/mdb-servlet/mrgbasic and see server log. The exception mentiones JEE specification, but I did not find anything in the specification that forbids this action. The exception is: 15:33:16,031 ERROR [STDERR] javax.jms.TransactionInProgressException: XASession: A direct invocation of the commit operation is probibited! 15:33:16,032 ERROR [STDERR] at org.apache.qpid.client.XASessionImpl.commit(XASessionImpl.java:109) 15:33:16,032 ERROR [STDERR] at org.apache.qpid.ra.QpidRASessionImpl.commit(QpidRASessionImpl.java:425) 15:33:16,032 ERROR [STDERR] at org.jboss.test.mdb.MRGBasicOpServlet.doGet(MRGBasicOpServlet.java:61) 15:33:16,032 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 15:33:16,032 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 15:33:16,032 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) 15:33:16,032 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:599) 15:33:16,032 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:451) 15:33:16,032 ERROR [STDERR] at java.lang.Thread.run(Thread.java:619) 15:33:16,032 ERROR [STDERR] javax.jms.IllegalStateException: This method is not applicable inside the application server. See the J2EE spec, e.g. J2EE1.4 Section 6.6 15:33:16,032 ERROR [STDERR] at org.apache.qpid.ra.QpidRASessionFactoryImpl.stop(QpidRASessionFactoryImpl.java:587) 15:33:16,032 ERROR [STDERR] at org.jboss.test.mdb.MRGBasicOpServlet.doGet(MRGBasicOpServlet.java:110) 15:33:16,032 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 15:33:16,032 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 15:33:16,032 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 15:33:16,032 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 15:33:16,032 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) 15:33:16,032 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:599) 15:33:16,032 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:451) 15:33:16,032 ERROR [STDERR] at java.lang.Thread.run(Thread.java:619)
If your using an XA ConnectionFactory, you will in turn create an XASession. Calling commit() on an XASession is prohibited as per the API: http://java.sun.com/javaee/5/docs/api/javax/jms/XASession.html#commit() For what you want to do, you need to use a notx-connection-factory since you are managing the transactions yourself. Config would look something like: <notx-connection-factory> <jndi-name>QpidJMS</jndi-name> . . . </notx-connection-factory>
Sorry, that should read: <no-tx-connection-factory> <jndi-name>QpidJMS</jndi-name> . . . </no-tx-connection-factory>
See above comments for explanation.