This post describes usage of Jboss JMS Feature using a Message Driven Bean (MDB) consumer.
Note: In this article , we would be using the default JMS queue ‘/queue/DLQ’.
1. Create a Message Driven Bean with bean class TestMDB.java
import java.io.PrintStream; import javax.ejb.MessageDrivenBean; import javax.jms.*; import weblogic.ejb.GenericMessageDrivenBean; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.ejb.EJBException; import javax.jms.MessageListener; import javax.jms.Message; public class TestMDB implements MessageDrivenBean, MessageListener { private MessageDrivenContext ctx = null; public TestMDB() { } //--- MessageDrivenBean public void setMessageDrivenContext(MessageDrivenContext ctx) throws EJBException { this.ctx = ctx; } public void ejbCreate() {} public void ejbRemove() {ctx=null;} //--- MessageListener public void onMessage(Message msg) { try { System.out.println("****** Inside onMessage() *********"); String msgText; if(msg instanceof TextMessage) msgText = ((TextMessage)msg).getText(); else msgText = msg.toString(); System.out.println((new StringBuilder("Message Received: ")).append(msgText).toString()); } catch(JMSException jmse) { jmse.printStackTrace(); } } }
2. Generate the ejb-jar.xml as below.
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1"> <enterprise-beans> <message-driven> <ejb-name>TestMDB</ejb-name> <ejb-class>TestMDB</ejb-class> <transaction-type>Container</transaction-type> <activation-config> <activation-config-property> <activation-config-property-name>destinationType</activation-config-property-name> <activation-config-property-value>javax.jms.Queue</activation-config-property-value> </activation-config-property> </activation-config> </message-driven> </enterprise-beans> </ejb-jar>
Note: Specify the ejb bean class name in the attribute <ejb-class> of the element <message-driven>.
3. Generate the jboss.xml to specify the name of the Jboss Queue, which the MDB bean would be listening to.
<?xml version="1.0" encoding="Cp1252"?> <jboss> <enterprise-beans> <message-driven> <ejb-name>TestMDB</ejb-name> <configuration-name>Standard Message Driven Bean</configuration-name> <destination-jndi-name>/queue/DLQ</destination-jndi-name> </message-driven> </enterprise-beans> </jboss>
4. Create a jar file as below.
jar -cvf TestMDB.jar .
5. Copy the jar file and paste it under Deploy folder of any server profiles.
$JBOSS_HOMEserverdefaultdeploy
The deployment is automatically picked up by the server and you would see the relevant messages in the server logs and the console.
****************************************************************************
21:09:18,968 INFO [EjbDeployer] installing bean: ejb/#TestMDB,uid6458583
21:09:18,968 INFO [EjbDeployer] with dependencies:
21:09:18,968 INFO [EjbDeployer] and supplies:
21:09:18,968 INFO [EjbDeployer] jndi:null
21:09:19,046 INFO [EjbModule] Deploying TestMDB
****************************************************************************
6. Open a command prompt and set the class path to the jbossall-client.jar file.
set classpath=%classpath%;G:jboss-5.1.0.GAclientjbossall-client.jar
7. Compile and execute the below QueueSend.java program
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Hashtable; import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.Properties; public class QueueSend { public final static String JNDI_FACTORY="org.jboss.naming.HttpNamingContextFactory"; public final static String JMS_FACTORY="ConnectionFactory"; public final static String QUEUE="/queue/DLQ"; private QueueConnectionFactory qconFactory; private QueueConnection qcon; private QueueSession qsession; private QueueSender qsender; private Queue queue; private TextMessage msg; public void init(Context ctx, String queueName) throws NamingException, JMSException { qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); qcon = qconFactory.createQueueConnection(); qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queue = (Queue) ctx.lookup(queueName); qsender = qsession.createSender(queue); msg = qsession.createTextMessage(); qcon.start(); } public void send(String message) throws JMSException { msg.setText(message); qsender.send(msg); } public void close() throws JMSException { qsender.close(); qsession.close(); qcon.close(); } public static void main(String[] args) throws Exception { if (args.length != 1) { System.out.println("Usage: java examples.jms.queue.QueueSend JBossURL"); return; } InitialContext ic = getInitialContext(args[0]); QueueSend qs = new QueueSend(); qs.init(ic, QUEUE); readAndSend(qs); qs.close(); } private static void readAndSend(QueueSend qs) throws IOException, JMSException { BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in)); String line=null; boolean quitNow = false; do { System.out.print("Enter message ("quit" to quit): n"); line = msgStream.readLine(); if (line != null && line.trim().length() != 0) { qs.send(line); System.out.println("JMS Message Sent: "+line+"n"); quitNow = line.equalsIgnoreCase("quit"); } } while (! quitNow); } private static InitialContext getInitialContext(String url) throws NamingException { Properties env = new Properties(); env.setProperty(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env.setProperty(Context.PROVIDER_URL,url); return new InitialContext(env); } }
****************************************************************************
java QueueSend http://127.0.0.1:8080/invoker/JNDIFactory
The deployed MDB will consume the messages from the Jboss Queue as shown below.
For reference I have uploaded the sample TestMDB.jar to the below link.
http://www.4shared.com/file/TjO6i_DR/TestMDB.html
Best Regards,
Wonders