Hi,
My question is about the JMS/JCA wrapper in JBoss ( I am using 3.2.0rc2
) and support for local transactions. I have to use a JMS provider other
than JBossMQ as my customers already use it, and I need to be able to
use local transactions as well as XA ones because this provider does not
support XA on all platforms.
Can I use JMS via the JCA wrapper with local transactions? If so, what
do I have to do? If not, how can I get around this while getting pooling
and transactional support with standards based code?
I have written a test program using JBossMQ with local transactions.
Using the connection factory suggested in the samples ( which translates
to the class org.jboss.mq.SpyConnectionFactory), this seems to work.
However, using the JCA wrapper ( which translates to the class
org.jboss.resource.adapter.jms.JmsConnectionFactoryImpl ) only works in
XA. With local transactions I get the following trace:
2003-03-26 09:27:45,477 DEBUG
[org.jboss.resource.connectionmanager.IdleRemover] internalRegisterPool:
registering pool with interval 900000 old interval: 450000
2003-03-26 09:27:45,487 DEBUG [org.jboss.jms.jndi.JBossMQProvider] no
provider url; connecting to local JNDI
2003-03-26 09:27:45,487 DEBUG [org.jboss.jms.jndi.JBossMQProvider]
created context: [EMAIL PROTECTED]
2003-03-26 09:27:45,497 DEBUG [org.jboss.jms.ConnectionFactoryHelper]
using connection factory: [EMAIL PROTECTED]
2003-03-26 09:27:45,497 DEBUG [org.jboss.jms.ConnectionFactoryHelper]
using username/password: guest/guest
2003-03-26 09:27:45,577 DEBUG [org.jboss.mq.Connection] Setting the
clockDaemon's thread factory
2003-03-26 09:27:45,627 DEBUG [org.jboss.mq.GenericConnectionFactory]
Handing out ClientIL: org.jboss.mq.il.jvm.JVMClientILService
2003-03-26 09:27:45,637 DEBUG [org.jboss.jms.ConnectionFactoryHelper]
created QueueConnection: [EMAIL PROTECTED]
2003-03-26 09:27:45,637 DEBUG
[org.jboss.resource.adapter.jms.JmsManagedConnection] created
connection: [EMAIL PROTECTED]
2003-03-26 09:27:45,677 DEBUG
[org.jboss.resource.adapter.jms.JmsManagedConnection] Using a non-XA
QueueConnection. It will not be able to participate in a Global UOW
2003-03-26 09:27:45,677 DEBUG
[org.jboss.resource.adapter.jms.JmsManagedConnection]
xaQueueSession=null, [EMAIL PROTECTED]
2003-03-26 09:27:45,697 DEBUG
[org.jboss.resource.adapter.jms.JmsManagedConnection] transacted=true,
ack=1
2003-03-26 09:27:45,697 DEBUG
[org.jboss.resource.adapter.jms.JmsManagedConnection] ConnectionEvent
listener added:
org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEve
[EMAIL PROTECTED]
2003-03-26 09:27:45,697 DEBUG
[org.jboss.resource.adapter.jms.JmsManagedConnection] Sending connection
event: 2
2003-03-26 09:27:45,697 INFO
[org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResourc
e] Throwable trying to start local transaction!
java.lang.IllegalStateException: Attempt to start local transaction
while xa transaction is active!
at
org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEve
ntListener.localTransactionStarted(TxConnectionManager.java:586)
at
org.jboss.resource.adapter.jms.JmsManagedConnection.sendEvent(JmsManaged
Connection.java:463)
at
org.jboss.resource.adapter.jms.JmsLocalTransaction.begin(JmsLocalTransac
tion.java:40)
at
org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource
.start(TxConnectionManager.java:730)
at
org.jboss.tm.TransactionImpl.startResource(TransactionImpl.java:1137)
at
org.jboss.tm.TransactionImpl.enlistResource(TransactionImpl.java:624)
at
org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEve
ntListener.enlist(TxConnectionManager.java:461)
at
org.jboss.resource.connectionmanager.TxConnectionManager.managedConnecti
onReconnected(TxConnectionManager.java:359)
at
org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConn
ection(BaseConnectionManager2.java:546)
at
org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionMa
nagerProxy.allocateConnection(BaseConnectionManager2.java:837)
at
org.jboss.resource.adapter.jms.JmsSessionFactoryImpl.createQueueSession(
JmsSessionFactoryImpl.java:119)
at transactiontester.tester.doTest(tester.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at
org.jboss.mx.capability.ReflectedMBeanDispatcher.invoke(ReflectedMBeanDi
spatcher.java:284)
at
org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:549)
at
org.jboss.jmx.adaptor.control.Server.invokeOpByName(Server.java:240)
at
org.jboss.jmx.adaptor.control.Server.invokeOp(Server.java:209)
at
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.invokeOp(HtmlAdaptorServle
t.java:172)
at
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.processRequest(HtmlAdaptor
Servlet.java:78)
at
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.doPost(HtmlAdaptorServlet.
java:60)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:360)
at
org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationH
andler.java:280)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:558)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1717)
at
org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationCon
text.java:549)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1667)
at org.mortbay.http.HttpServer.service(HttpServer.java:863)
at org.jboss.jetty.Jetty.service(Jetty.java:460)
at
org.mortbay.http.HttpConnection.service(HttpConnection.java:773)
at
org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:937)
at
org.mortbay.http.HttpConnection.handle(HttpConnection.java:790)
at
org.mortbay.http.SocketListener.handleConnection(SocketListener.java:201
)
at
org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:289)
at
org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:455)
2003-03-26 09:27:45,717 DEBUG [org.jboss.util.NestedThrowable]
org.jboss.util.NestedThrowable.parentTraceEnabled=true
2003-03-26 09:27:45,717 DEBUG [org.jboss.util.NestedThrowable]
org.jboss.util.NestedThrowable.nestedTraceEnabled=false
2003-03-26 09:27:45,717 DEBUG [org.jboss.util.NestedThrowable]
org.jboss.util.NestedThrowable.detectDuplicateNesting=true
2003-03-26 09:27:45,707 WARN [org.jboss.tm.TransactionImpl]
XAException: tx=TransactionImpl:XidImpl [FormatId=257,
GlobalId=MACHINE1//8, BranchQual=] errorCode=XA_UNKNOWN(0)
org.jboss.resource.connectionmanager.JBossLocalXAException: Throwable
trying to start local transaction!; - nested throwable:
(java.lang.IllegalStateException: Attempt to start local transaction
while xa transaction is active!)
at
org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource
.start(TxConnectionManager.java:739)
at
org.jboss.tm.TransactionImpl.startResource(TransactionImpl.java:1137)
at
org.jboss.tm.TransactionImpl.enlistResource(TransactionImpl.java:624)
at
org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEve
ntListener.enlist(TxConnectionManager.java:461)
at
org.jboss.resource.connectionmanager.TxConnectionManager.managedConnecti
onReconnected(TxConnectionManager.java:359)
at
org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConn
ection(BaseConnectionManager2.java:546)
at
org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionMa
nagerProxy.allocateConnection(BaseConnectionManager2.java:837)
at
org.jboss.resource.adapter.jms.JmsSessionFactoryImpl.createQueueSession(
JmsSessionFactoryImpl.java:119)
at transactiontester.tester.doTest(tester.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at
org.jboss.mx.capability.ReflectedMBeanDispatcher.invoke(ReflectedMBeanDi
spatcher.java:284)
at
org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:549)
at
org.jboss.jmx.adaptor.control.Server.invokeOpByName(Server.java:240)
at
org.jboss.jmx.adaptor.control.Server.invokeOp(Server.java:209)
at
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.invokeOp(HtmlAdaptorServle
t.java:172)
at
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.processRequest(HtmlAdaptor
Servlet.java:78)
at
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.doPost(HtmlAdaptorServlet.
java:60)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:360)
at
org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationH
andler.java:280)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:558)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1717)
at
org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationCon
text.java:549)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1667)
at org.mortbay.http.HttpServer.service(HttpServer.java:863)
at org.jboss.jetty.Jetty.service(Jetty.java:460)
at
org.mortbay.http.HttpConnection.service(HttpConnection.java:773)
at
org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:937)
at
org.mortbay.http.HttpConnection.handle(HttpConnection.java:790)
at
org.mortbay.http.SocketListener.handleConnection(SocketListener.java:201
)
at
org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:289)
at
org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:455)
Caused by: java.lang.IllegalStateException: Attempt to start local
transaction while xa transaction is active!
at
org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEve
ntListener.localTransactionStarted(TxConnectionManager.java:586)
at
org.jboss.resource.adapter.jms.JmsManagedConnection.sendEvent(JmsManaged
Connection.java:463)
at
org.jboss.resource.adapter.jms.JmsLocalTransaction.begin(JmsLocalTransac
tion.java:40)
at
org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource
.start(TxConnectionManager.java:730)
... 35 more
Here is the test code that I used:
package transactiontester;
import javax.jms.*;
import javax.naming.*;
import javax.transaction.UserTransaction;
public class tester
implements testerMBean
{
public void doTest()
{
// get user transaction from jndi
UserTransaction ut = null;
InitialContext ctx = null;
try
{
ctx = new InitialContext();
System.out.println("Got InitialContext");
ut = (UserTransaction)ctx.lookup("UserTransaction");
System.out.println("Got user transaction");
ut.begin();
System.out.println("Begun transaction");
String qConnectionFactory = "java:/connector.StevesMQ";
String qName = "queue/testQueue";
QueueConnectionFactory factory =
(QueueConnectionFactory)ctx.lookup(qConnectionFactory);
System.out.println("Got queue connection factory");
// create connection and start it
QueueConnection connection;
connection = factory.createQueueConnection();
System.out.println("Got connection");
Queue queue;
queue = (Queue)ctx.lookup(qName);
System.out.println("Got queue");
// put message
String msg = "blah blah blah";
QueueSession session = connection.createQueueSession(true,
Session.AUTO_ACKNOWLEDGE);
System.out.println("Got queue");
QueueSender sender = session.createSender(queue);
System.out.println("Got sender");
sender.send(session.createTextMessage(msg));
System.out.println("Sent message");
ut.commit();
System.out.println("Committed transaction");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
( it has a simple MBean interface containing the doTest method.)
Here is the jms-service.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<server>
<!--
==================================================================== -->
<!-- JMS Stuff
-->
<!--
==================================================================== -->
<!-- The JMS provider loader -->
<mbean code="org.jboss.jms.jndi.JMSProviderLoader"
name="test:service=JMSProviderLoader,connector=StevesMQ,serverName=examp
le1">
<attribute name="ProviderName">DefaultJMSProvider</attribute>
<attribute name="ProviderAdapterClass">
org.jboss.jms.jndi.JBossMQProvider
</attribute>
<attribute
name="QueueFactoryRef">connector.StevesMQ.QueueFactory</attribute>
<attribute
name="TopicFactoryRef">connector.StevesMQ.TopicFactory</attribute>
</mbean>
<!-- The server session pool for Message Driven Beans -->
<mbean code="org.jboss.jms.asf.ServerSessionPoolLoader"
name="test:service=ServerSessionPoolMBean,connector=StevesMQ,serverName=
example1">
<!-- sw. <depends
optional-attribute-name="XidFactory">jboss:service=XidFactory</depends>
sw -->
<attribute name="PoolName">StdJMSPool</attribute>
<attribute name="PoolFactoryClass">
org.jboss.jms.asf.StdServerSessionPoolFactory
</attribute>
</mbean>
<!-- JMS XA Resource adapter, use this to get transacted JMS in beans
-->
<!--new configuration for new ConnectionManager-->
<mbean
code="org.jboss.resource.connectionmanager.LocalTxConnectionManager"
name="jboss.jca:service=LocalTxCM,name=jmsra">
<!--make the rar deploy!-->
<depends>jboss.jca:service=RARDeployer</depends>
<attribute name="JndiName">connector.StevesMQ</attribute>
<!-- JBossMQ requires sessions tracked by transaction. Commit from
suspended is not supported -->
<attribute name="TrackConnectionByTx">false</attribute>
<depends optional-attribute-name="ManagedConnectionFactoryName">
<mbean code="org.jboss.resource.connectionmanager.RARDeployment"
name="test:service=LocalTxDS,connector=StevesMQ,serverName=example1">
<!--hack till better deployment system-->
<depends
optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployme
nt,name=JMS Adapter</depends>
<!--real attributes-->
<attribute name="ManagedConnectionFactoryProperties">
<properties>
<config-property>
<config-property-name>SessionDefaultType</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>javax.jms.Topic</config-property-value>
</config-property>
</properties>
</attribute>
</mbean>
</depends>
<depends optional-attribute-name="ManagedConnectionPool">
<mbean
code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
name="test:service=LocalTxPool,connector=StevesMQ,serverName=example1">
<attribute name="MinSize">0</attribute>
<attribute name="MaxSize">50</attribute>
<attribute name="BlockingTimeoutMillis">5000</attribute>
<attribute name="IdleTimeoutMinutes">15</attribute>
<!--criteria indicates if Subject (from security domain) or app
supplied
parameters (such as from getConnection(user, pw)) are used
to distinguish
connections in the pool. Choices are
ByContainerAndApplication (use both),
ByContainer (use Subject),
ByApplication (use app supplied params only),
ByNothing (all connections are equivalent, usually if
adapter supports
reauthentication)-->
<attribute name="Criteria">ByContainer</attribute>
</mbean>
</depends>
<depends
optional-attribute-name="CachedConnectionManager">jboss.jca:service=Cach
edConnectionManager</depends>
<!-- <attribute
name="SecurityDomainJndiName">java:/jaas/JmsXARealm</attribute>
<depends
optional-attribute-name="JaasSecurityManagerService">jboss.security:serv
ice=JaasSecurityManager</depends>
-->
<attribute
name="TransactionManager">java:/TransactionManager</attribute>
</mbean>
</server>
rgds,
Steve
-------------------------------------------------------
This SF.net email is sponsored by:
The Definitive IT and Networking Event. Be There!
NetWorld+Interop Las Vegas 2003 -- Register today!
http://ads.sourceforge.net/cgi-bin/redirect.pl?keyn0001en
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user