Problems JCA JMS inflow issue and tx NotSupported
timfox Jan 13, 2007 6:10 AMWeston - sorry to bug you again.
I'm using the JCA inflow invoker-proxy-binding in JBoss-4.0.5.GA for MDBs, and I'm using JBoss Messaging as the JMS provider.
I have the following trivial MDB:
public class MDBExample implements MessageDrivenBean, MessageListener { public void onMessage(Message m) { System.out.println("got message " + m); } public void ejbCreate() { } public void ejbRemove() { } } <ejb-jar> <enterprise-beans> <message-driven> <ejb-name>MDBExample</ejb-name> <ejb-class>org.jboss.example.jms.mdb.MDBExample</ejb-class> <transaction-type>Container</transaction-type> <message-driven-destination> <destination-type>javax.jms.Queue</destination-type> </message-driven-destination> </message-driven> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>MDBExample</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
I sent a message, and it all works fine, the message gets consumed and acked.
I then change the trans-attribute to "NotSupported", so the onMessage should not be run in a tx context, and send a message again, and I get:
10:59:37,437 ERROR [JmsServerSession] Failed to commit session transaction javax.jms.TransactionInProgressException: Cannot call commit on an XA session at org.jboss.jms.client.container.TransactionAspect.handleCommit(TransactionAspect.java:97) at org.jboss.aop.advice.org.jboss.jms.client.container.TransactionAspect14.invoke(TransactionAspect14.java) at org.jboss.jms.client.delegate.ClientSessionDelegate$commit_8461082169793485964.invokeNext(ClientSessionDelegate$commit_8461082169793485964. 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$commit_8461082169793485964.invokeNext(ClientSessionDelegate$commit_8461082169793485964. java) at org.jboss.jms.client.container.ExceptionInterceptor.invoke(ExceptionInterceptor.java:69) at org.jboss.jms.client.delegate.ClientSessionDelegate$commit_8461082169793485964.invokeNext(ClientSessionDelegate$commit_8461082169793485964. java) at org.jboss.jms.client.container.ClientLogInterceptor.invoke(ClientLogInterceptor.java:107) at org.jboss.jms.client.delegate.ClientSessionDelegate$commit_8461082169793485964.invokeNext(ClientSessionDelegate$commit_8461082169793485964. java) at org.jboss.jms.client.delegate.ClientSessionDelegate.commit(ClientSessionDelegate.java) at org.jboss.jms.client.JBossSession.commit(JBossSession.java:165) at org.jboss.resource.adapter.jms.inflow.JmsServerSession$LocalDemarcationStrategy.end(JmsServerSession.java:341) at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:260) at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204) at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:275) at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743) at java.lang.Thread.run(Thread.java:534)
I.e. it fails.
A couple of things I don't understand:
Why is there a transaction in the first place? The onMessage is supposed to run without a transaction and should be using the ack mode specified on the ejb (either dups_ok or auto_ack)
Why is JCA attempting to call commit() on it? The session that the JCA layer creates is an XASession and calling commit() on an XASession is illegal.
(see http://java.sun.com/j2ee/1.4/docs/api/index.html)
For a "NotSupported" method, I would expect the session used to do the message consumption to be a standard non XA session obtained from a standard non XA JMS connection, and I wouldn't expect commit to be called on it.