Hey, I have been trying to figure this out for a few days now and I keep
running into walls.  I have a distributed system that uses JMS for
communication, using a centralized router (all running on JBoss with
JBossMQ).

I was able to get everything working using an ExternalContext, to map in the
namespace of the remote router, but that is less than perfect.  I started to
change over to the JmsXA adapter, but I am running into some odd problems.

An overly simplified view of the system looks like this, showing three
seperate pyshical machines: web server, manager node and router.  The
current architecture assumes a hub-spoke model for using JMS resources, so
that all machines that actually make use of the JMS resources are remote,
there are not MDB's running on the router.

                      RMI
  [ web server ] +-----------+ [ manager node ]
                                   |       |
                         (SessionBean)   (MDB)
                           |               |
                   JMS Queue Resource      |
                                 \        /
                                   \    /
                                 [ router ]
                                     ||
                                (real queues)

I installed the resource adapter, which seems to like to be deployed rather
than having a mbean entry added in jboss.jcml, which I basically copied from
the main branch conf/default files.

The manager has a JMSProviderLoader installed which is using a remote
<hostname>:<port> url to the router, and has the default session pool stuff.
I think that the MDB bits work fine.  I do not *think* that I had to change
anything to get that to work, the problem I am running into is with JMS
resources.

Per your change note, I changed the res-jndi-name to from the external
context path to java:JmsXA.  But I also had to use url's to get the
destinations to work.  So I ended up with something like this:

 <resource-managers>
    <resource-manager>
      <res-name>QueueConnectionFactory</res-name>
      <res-jndi-name>java:/JmsXA</res-jndi-name>
    </resource-manager>

    <resource-manager>
      <res-name>WorkRequestQueue</res-name>
       <res-url>jnp://router:5001/queue/WorkRequestQueue</res-url>
    </resource-manager>

    <resource-manager>
      <res-name>WorkResponseQueue</res-name>
      <res-url>jnp://router:5001/queue/WorkResponseQueue</res-url>
    </resource-manager>
  </resource-managers>

I started up the application again, and got:

<snip>
javax.jms.JMSException: Invalid transaction id.
        at
org.jbossmq.SpyXAResourceManager.addMessage(SpyXAResourceManager.java:80)
        at org.jbossmq.SpySession.sendMessage(SpySession.java:381)
        at org.jbossmq.SpyQueueSender.send(SpyQueueSender.java:103)
        at org.jbossmq.SpyQueueSender.send(SpyQueueSender.java:62)
        at
com.boldfish.does.job.workflow.internal.RequestSpoolerEJB.send(RequestSpoolerEJB.java:217)
        at
com.boldfish.does.job.workflow.internal.RequestSpoolerEJB.sendNextRequest(RequestSpoolerEJB.java:249)
        at
com.boldfish.does.job.workflow.internal.RequestSpoolerEJB.spool(RequestSpoolerEJB.java:273)
        at java.lang.reflect.Method.invoke(Native Method)
        at
org.jboss.ejb.StatefulSessionContainer$ContainerInterceptor.invoke(StatefulSessionContainer.java:650)
        at
org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:127)
        at
org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor.invoke(StatefulSessionInstanceInterceptor.java:209)
        at
org.jboss.ejb.plugins.TxInterceptorCMT.invokeNext(TxInterceptorCMT.java:159)
        at
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:280)
        at
org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:107)
        at
org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:195)
        at
org.jboss.ejb.StatefulSessionContainer.invoke(StatefulSessionContainer.java:341)
        at
org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invoke(JRMPContainerInvoker.java:480)
        at
org.jboss.ejb.plugins.jrmp.interfaces.GenericProxy.invokeContainer(GenericProxy.java:339)
        at
org.jboss.ejb.plugins.jrmp.interfaces.StatefulSessionProxy.invoke(StatefulSessionProxy.java:136)
        at $Proxy25.spool(Unknown Source)
        at
com.boldfish.does.job.service.JobController$Runner.run(JobController.java:216)
        at java.lang.Thread.run(Thread.java:484)
</snip>

So I thought that I should try a distributed TX manager, since that is what
i really want.  I changed over to Tyrex on all nodes and I still got the
same results.  I then tried to use a jnp:// url for the res-jndi-name, which
looks like it got a little further, but throw a different TX related
excepetion laiter.

I have session beans that use JMS resources and I have MDB, all of which
work off of a remote provider.  What is the supported deployment descriptor
syntax for JMS resources (both factories and desitations) and what needs to
be done to make the distributed TX work.

A while back someone (could be you) said that using res-url was a hack
around the lack of support for JMS resources, is that still true?  If not
what is the correct way to reference a remote connection and destination
inside of the descriptor?

If you need more detail I can provide that for you, or really anyone who
might have a clue as to why this is not working correctly.

Thanks,

--jason


_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to