-
1. Re: MDB listens to one queue and sends to queue two
adrian.brock Sep 7, 2003 12:18 PM (in response to ah123)You should setup <resource-ref>s for the connection
factories and queues.
Regards,
Adrian -
2. Re: MDB listens to one queue and sends to queue two
hanswurst33 Sep 8, 2003 6:55 AM (in response to ah123)Hi JBoss-Users,
it took me quite a long time to figure this out, so I
want to share my solution with you.
The attached file includes a client sending a message
to a MDB an getting a response on another queue.
To get the right response, a selector is used. Place
the jar File in your JBoss-Home. The zip-file contains
the sources for eclipse and myeclipseide.
Send questions to olaf[at]uni-mannheim.de
Kind regards -
3. Re: MDB listens to one queue and sends to queue two
ah123 Sep 8, 2003 2:58 PM (in response to ah123)I'm fairly new to JMS. Could you please be more specific and post or point me to an example. I'm running JBoss 3.2.1.
Thanks a lot,
A. -
4. Re: MDB listens to one queue and sends to queue two
ah123 Sep 8, 2003 3:01 PM (in response to ah123)I should have specified, my previous reply was to Adrian.
-
5. Re: MDB listens to one queue and sends to queue two
adrian.brock Sep 8, 2003 3:41 PM (in response to ah123)Here is an example from the testsuite:
It constructs the java:comp/env namespace
e.g. lookup("java:/comp/env/jms/MyQueueConnection");
ejb-jar.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd">
<ejb-jar>
Queue Publisher
<display-name>PublisherBean</display-name>
<enterprise-beans>
<ejb-name>JMSSession</ejb-name>
org.jboss.test.jmsra.bean.JMSSessionHome
org.jboss.test.jmsra.bean.JMSSession
<ejb-class>org.jboss.test.jmsra.bean.JMSSessionBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<display-name>Publisher</display-name>
<ejb-name>QueuePublisher</ejb-name>
org.jboss.test.jmsra.bean.PublisherHome
org.jboss.test.jmsra.bean.Publisher
<ejb-class>org.jboss.test.jmsra.bean.PublisherBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
A Queue ConnectionFactory
<res-ref-name>jms/MyQueueConnection</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
A Queue
<res-ref-name>jms/QueueName</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<ejb-ref>
<ejb-ref-name>ejb/PublisherCMP</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
org.jboss.test.jmsra.bean.PublisherCMPHome
org.jboss.test.jmsra.bean.PublisherCMP
<ejb-link>PublisherCMP</ejb-link>
</ejb-ref>
<display-name>TopicPublisher</display-name>
<ejb-name>TopicPublisher</ejb-name>
org.jboss.test.jmsra.bean.PublisherHome
org.jboss.test.jmsra.bean.Publisher
<ejb-class>org.jboss.test.jmsra.bean.TopicPublisherBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
A Topic ConnectionFactory
<res-ref-name>jms/MyTopicConnection</res-ref-name>
<res-type>javax.jms.TopicConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
A Topic
<res-ref-name>jms/TopicName</res-ref-name>
<res-type>javax.jms.Topic</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<ejb-ref>
<ejb-ref-name>ejb/PublisherCMP</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
org.jboss.test.jmsra.bean.PublisherCMPHome
org.jboss.test.jmsra.bean.PublisherCMP
<ejb-link>PublisherCMP</ejb-link>
</ejb-ref>
<display-name>QueueRec</display-name>
<ejb-name>QueueRec</ejb-name>
org.jboss.test.jmsra.bean.QueueRecHome
org.jboss.test.jmsra.bean.QueueRec
<ejb-class>org.jboss.test.jmsra.bean.QueueRecBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
A Queue ConnectionFactory
<res-ref-name>jms/MyQueueConnection</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
A Queue
<res-ref-name>jms/QueueName</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<display-name>Publisher Entity</display-name>
<ejb-name>PublisherCMP</ejb-name>
org.jboss.test.jmsra.bean.PublisherCMPHome
org.jboss.test.jmsra.bean.PublisherCMP
<ejb-class>org.jboss.test.jmsra.bean.PublisherCMPBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
True
<cmp-version>1.x</cmp-version>
<cmp-field>
Nr
<field-name>nr</field-name>
</cmp-field>
<primkey-field>nr</primkey-field>
<message-driven>
<ejb-name>TopicAdapter</ejb-name>
<ejb-class>org.jboss.test.jmsra.bean.TopicAdapter</ejb-class>
<message-selector></message-selector>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Topic</destination-type>
<subscription-durability>NonDurable</subscription-durability>
</message-driven-destination>
<resource-ref>
A Queue ConnectionFactory
<res-ref-name>jms/MyQueueConnection</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
A Queue
<res-ref-name>jms/QueueName</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<ejb-name>TopicAdapter</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
jboss.xml
<?xml version="1.0" encoding="utf-8"?>
false
<resource-managers>
<resource-manager>
<res-name>queuefactoryref</res-name>
<res-jndi-name>java:/JmsXA</res-jndi-name>
</resource-manager>
<resource-manager>
<res-name>queueref</res-name>
<res-jndi-name>queue/testQueue</res-jndi-name>
</resource-manager>
<resource-manager>
<res-name>topicfactoryref</res-name>
<res-jndi-name>java:/JmsXA</res-jndi-name>
</resource-manager>
<resource-manager>
<res-name>topicref</res-name>
<res-jndi-name>topic/testTopic</res-jndi-name>
</resource-manager>
<resource-manager>
<res-name>recqueueref</res-name>
<res-jndi-name>queue/A</res-jndi-name>
</resource-manager>
</resource-managers>
<enterprise-beans>
<ejb-name>QueuePublisher</ejb-name>
<jndi-name>TxPublisher</jndi-name>
<configuration-name>Standard Stateless SessionBean</configuration-name>
<resource-ref>
<res-ref-name>jms/MyQueueConnection</res-ref-name>
<resource-name>queuefactoryref</resource-name>
</resource-ref>
<resource-ref>
<res-ref-name>jms/QueueName</res-ref-name>
<resource-name>queueref</resource-name>
</resource-ref>
<ejb-ref>
<ejb-ref-name>ejb/PublisherCMP</ejb-ref-name>
<jndi-name></jndi-name>
</ejb-ref>
<ejb-name>TopicPublisher</ejb-name>
<jndi-name>TxTopicPublisher</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>
<ejb-ref>
<ejb-ref-name>ejb/PublisherCMP</ejb-ref-name>
<jndi-name></jndi-name>
</ejb-ref>
<ejb-name>QueueRec</ejb-name>
<jndi-name>QueueRec</jndi-name>
<configuration-name>Standard Stateless SessionBean</configuration-name>
<resource-ref>
<res-ref-name>jms/MyQueueConnection</res-ref-name>
<resource-name>queuefactoryref</resource-name>
</resource-ref>
<resource-ref>
<res-ref-name>jms/QueueName</res-ref-name>
<resource-name>recqueueref</resource-name>
</resource-ref>
<ejb-name>PublisherCMP</ejb-name>
<jndi-name>PublisherCMP</jndi-name>
<message-driven>
<ejb-name>TopicAdapter</ejb-name>
<configuration-name>Standard Message Driven Bean</configuration-name>
<destination-jndi-name>topic/testTopic</destination-jndi-name>
<resource-ref>
<res-ref-name>jms/MyQueueConnection</res-ref-name>
<resource-name>queuefactoryref</resource-name>
</resource-ref>
<resource-ref>
<res-ref-name>jms/QueueName</res-ref-name>
<resource-name>queueref</resource-name>
</resource-ref>
</message-driven>
</enterprise-beans>
Regards,
Adrian -
6. Re: MDB listens to one queue and sends to queue two
ah123 Sep 10, 2003 10:28 AM (in response to ah123)Thanks a lot for your suggestions. They both worked even though they have different solutions. However, I'm still not sure about a few things.
Olaf,
Why xBase-queue-service.xml necessary? Is that part of the J2EE spec, or it is used instead of assigning resource-ref?
Adrain,
I've also tried your solution, where the client uses testQueue to send a message. My MDB listens to it (via onMessage() method) and uses jms/secondQueue to send a message to a different listening client. The problem is that when send one message from the client, onMessage on the MDB is called many times (about 20 times) and I'm not sure how to stop it. The other problem that I face is with the othe client. I want it to listen to the jms/secondQueue but I'm getting an exception saying:
javax.naming.NameNotFoundException: comp not bound
here are my files
ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar >
No Description.
<display-name>Generated by XDoclet</display-name>
<enterprise-beans>
<message-driven >
<![CDATA[Session Bean Template]]>
<display-name>Test MDB</display-name>
<ejb-name>test/mdb</ejb-name>
<ejb-class>test.mdb.TestMDBBean</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
<subscription-durability>Durable</subscription-durability>
</message-driven-destination>
<security-identity>
Use a role that is not assigned to any users to
access restricted server side functionallity
<run-as>
<role-name>Server</role-name>
</run-as>
</security-identity>
<resource-ref>
A Queue
<res-ref-name>jms/secondQueue</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</message-driven>
</enterprise-beans>
<assembly-descriptor >
<security-role>
The role used to prevent access to the PrivateEntity
bean from external users.
<role-name>Server</role-name>
</security-role>
<container-transaction>
<ejb-name>test/mdb</ejb-name>
<method-name>*</method-name>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
jboss.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS//EN" "http://www.jboss.org/j2ee/dtd/jboss.dtd">
false
<resource-managers>
<resource-manager>
<res-name>queueref</res-name>
<res-jndi-name>queue/testQueue</res-jndi-name>
</resource-manager>
</resource-managers>
<enterprise-beans>
<message-driven>
<ejb-name>test/mdb</ejb-name>
<destination-jndi-name>queue/testQueue</destination-jndi-name>
<resource-ref>
<res-ref-name>jms/secondQueue</res-ref-name>
<resource-name>queueref</resource-name>
</resource-ref>
</message-driven>
</enterprise-beans> -
7. Re: MDB listens to one queue and sends to queue two
adrian.brock Sep 10, 2003 10:35 AM (in response to ah123)You are sending the message back to the same queue
that the MDB is listening to. You have written a fork bomb.
The java:comp/env namespace is only available to the MDB.
You should lookup the global jndi-name i.e. test/testQueue
or whatever queue you use for the reply.
Regards,
Adrian -
8. Re: MDB listens to one queue and sends to queue two
ah123 Sep 11, 2003 5:46 PM (in response to ah123)I've modified that to point to the same queue. The MDB gets the message once and replies to it. But still the client doesn't get a response back from the MDB. It gets a null message back.
session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
QueueReceiver receiver = session.createReceiver(queue);
TextMessage tm = (TextMessage) receiver.receive(5000); -
9. Re: MDB listens to one queue and sends to queue two
hanswurst33 Sep 17, 2003 3:44 AM (in response to ah123)Hi,
the -service.xml is for establishing the return
queue on the start up of jboss. The queues
for MDBs are created automatically, but as
I am using a return queue it doesn't work.
Take a look at the excellent workbook at
oreilly and if you have time, buy the commercial
docs. 10 Euros is nothing compared to bea
or websphere.
Olaf