I found the problem, well I solved my problem is a better way to put it.
The session bean (stateful) which I was using to send messages from was
creating a session in the ejbCreate() method, then actually used in another.
I was assuming that the container would "do the right thing" in this case,
but perhaps it is not supposed to do here. I updated the bean to create the
session in the method from which it was used and it is much happier now.
I did run into some other problems along the way, like trying to start() or
close() connections. But at this point I have everything working again with
most of the JMS usage going through the JMS RA. There is one bit that needs
to be re-architected into a bean so it can also participate in the TX, but
that can wait.
Thank you for the time you spent with the example below, this was exactly
what I was looking for.
--jason
On Thu, 21 Jun 2001, Peter Antman wrote:
> Hi again Jason,
> I did actually have some time to make a test, and it works fine for me.
> (This will be integreated into the new manual chapter I will be writing
> during the summer).
>
> Here is al my setups, with the remote machine beeing
> linutv1.annons.dn.se (its NOT accessable)
>
> in jboss.jcml:
>
> <!-- This must go into jboss.jcml to get remote version to work -->
> <mbean code="org.jboss.jms.jndi.JMSProviderLoader"
>name=":service=JMSProviderLoader,name=MyRemoteLoader">
> <attribute name="ProviderName">MyRemoteProvider</attribute>
> <attribute name="ProviderUrl">linutv1.annons.dn.se:1099</attribute>
> <attribute
>name="ProviderAdapterClass">org.jboss.jms.jndi.JBossMQProvider</attribute>
> </mbean>
>
> <!-- JMS XA Resource adapter, use this to get transacted JMS in beans -->
> <mbean code="org.jboss.resource.ConnectionFactoryLoader"
> name="JCA:service=ConnectionFactoryLoader,name=RemoteJmsXA">
> <attribute name="FactoryName">RemoteJmsXA</attribute>
> <attribute name="RARDeployerName">JCA:service=RARDeployer</attribute>
> <attribute name="ResourceAdapterName">JMS Adapter</attribute>
> <attribute name="ConnectionManagerFactoryName">MinervaXACMFactory</attribute>
> <!-- See the documentation for the specific connection manager
> implementation you are using for the properties you can set -->
> <attribute name="ConnectionManagerProperties">
> <attribute name="Properties">
> JmsProviderAdapterJNDI=java:MyRemoteProvider
> </attribute>
> # Pool type - uncomment to force, otherwise it is the default
> #PoolConfiguration=per-factory
>
> # Connection pooling properties - see
> # org.opentools.minerva.pool.PoolParameters
> MinSize=0
> MaxSize=10
> Blocking=true
> GCEnabled=false
> IdleTimeoutEnabled=false
> InvalidateOnError=false
> TrackLastUsed=false
> GCIntervalMillis=120000
> GCMinIdleMillis=1200000
> IdleTimeoutMillis=1800000
> MaxIdleTimeoutPercent=1.0
> </attribute>
>
> <!-- Principal mapping configuration -->
> <attribute
>name="PrincipalMappingClass">org.jboss.resource.security.ManyToOnePrincipalMapping</attribute>
> <attribute name="PrincipalMappingProperties">
> </attribute>
> </mbean>
>
>
> In jboss.xml:
> <?xml version="1.0" encoding="Cp1252"?>
>
> <jboss>
> <secure>false</secure>
> <resource-managers>
> <resource-manager>
> <res-name>topicfactoryref</res-name>
> <res-jndi-name>java:/RemoteJmsXA</res-jndi-name>
> </resource-manager>
> <resource-manager>
> <res-name>topicref</res-name>
>
><res-jndi-name>jnp://linutv1.annons.dn.se:1099/topic/testTopic</res-jndi-name>
> </resource-manager>
> </resource-managers>
>
> <enterprise-beans>
> <session>
> <ejb-name>TopicHello</ejb-name>
> <jndi-name>TxTopicHello</jndi-name>
> <configuration-name>Standard Stateless SessionBean</configuration-name>
> <resource-ref>
> <res-ref-name>jms/MyTopicConnection</res-ref-name>
> <resource-name>topicfactoryref</resource-name>
> </resource-ref>
> <resource-ref>
> <res-ref-name>jms/TopicName</res-ref-name>
> <resource-name>topicref</resource-name>
> </resource-ref>
> </session>
> </enterprise-beans>
> </jboss>
>
> Observe the <res-jndi-name> here, not url.
>
> ejb-jar (actually nothing particular)
> <?xml version="1.0" encoding="Cp1252"?>
>
> <ejb-jar>
> <description>Queue Publisher</description>
> <display-name>PublisherBean</display-name>
> <enterprise-beans>
> <session>
> <display-name>TopicHello</display-name>
> <ejb-name>TopicHello</ejb-name>
> <home>org.jboss.docs.jms.ra.interfaces.HelloHome</home>
> <remote>org.jboss.docs.jms.ra.interfaces.Hello</remote>
> <ejb-class>org.jboss.docs.jms.ra.bean.TopicHelloBean</ejb-class>
> <session-type>Stateless</session-type>
> <transaction-type>Container</transaction-type>
> <resource-ref>
> <description>A Topic ConnectionFactory</description>
> <res-ref-name>jms/MyTopicConnection</res-ref-name>
> <res-type>javax.jms.TopicConnectionFactory</res-type>
> <res-auth>Container</res-auth>
> </resource-ref>
> <resource-ref>
> <description>A Topic </description>
> <res-ref-name>jms/TopicName</res-ref-name>
> <res-type>javax.jms.Topic</res-type>
> <res-auth>Container</res-auth>
> </resource-ref>
> </session>
> </enterprise-beans>
> <assembly-descriptor/>
>
> </ejb-jar>
>
> And the bean:
>
> package org.jboss.docs.jms.ra.bean;
>
> import java.rmi.RemoteException;
> import java.util.*;
> import javax.ejb.SessionBean;
> import javax.ejb.SessionContext;
> import javax.ejb.EJBException;
> import javax.naming.*;
> import javax.jms.*;
>
> import org.jboss.docs.jms.ra.interfaces.*;
>
>
> public class TopicHelloBean implements SessionBean {
>
> private static final String CONNECTION_JNDI =
>"java:comp/env/jms/MyTopicConnection";
> private static final String TOPIC_JNDI = "java:comp/env/jms/TopicName";
>
> private SessionContext ctx = null;
> private Topic topic = null;
> private TopicConnection topicConnection = null;
>
> public TopicHelloBean() {
> }
>
> public void setSessionContext(SessionContext ctx) {
> this.ctx = ctx;
> }
>
> public void ejbCreate() {
> try {
> Context context = new InitialContext();
> topic = (Topic)context.lookup(TOPIC_JNDI);
>
> TopicConnectionFactory factory =
>(TopicConnectionFactory)context.lookup(CONNECTION_JNDI);
> topicConnection = factory.createTopicConnection();
>
> } catch (Exception ex) {
> // JMSException or NamingException could be thrown
> ex.printStackTrace();
> throw new EJBException(ex.toString());
> }
> }
>
> /**
> * Send a message with a message nr in property MESSAGE_NR
> */
> public void hello(String msg) {
> sendMessage(msg);
> }
>
>
> public void ejbRemove() throws RemoteException {
> if(topicConnection != null) {
> try {
> topicConnection.close();
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
> }
>
> public void ejbActivate() {}
> public void ejbPassivate() {}
>
> private void sendMessage(String msg) {
> TopicSession topicSession = null;
> try {
> TopicPublisher topicPublisher = null;
> TextMessage message = null;
>
> topicSession =
> topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
> topicPublisher = topicSession.createPublisher(topic);
>
> message = topicSession.createTextMessage();
> message.setText(msg);
> topicPublisher.publish(message);
>
>
> } catch (JMSException ex) {
>
> ex.printStackTrace();
> ctx.setRollbackOnly();
> throw new EJBException(ex.toString());
> } finally {
> if (topicSession != null) {
> try {
> topicSession.close();
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
> }
> }
>
> }
>
>
> This was done with a resonable new checkout from cvs (node) and 2.2.2 as
> a router (to follow your setup).
>
> Hope you will hace success with this setup.
>
> //Peter
>
> On 20 Jun, Jason Dillon wrote:
> > 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
>
>
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-user