Configuring JMS providers in JBoss:-
********************************
The below example demonstrates a JMS example using Queue Destination (Point – To – Point messaging feature) using the JBoss default Queue.
JBoss defines default JMS queue and Topic Destination defined in $JBOSS_HOME/server/<server-profile>/deploy/messaging/ destinations-service.xml.
You can add/remove destinations to this file, or deploy another *-service.xml descriptor with the destination configurations.
Below are the steps to setup JMS Queues in JBoss:-
1:- Start the JBoss server, select the server type which provides messaging features like all or default
Run.bat –c all
2:- Set the classpath to jbossall-client.jar which is located in the client folder.
set classpath=%CLASSPATH%;F:jboss-5.1.0.GAclientjbossall-client.jar
3:- Compile 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); } }
4:- Run the QueueSend.java program as below.
java QueueSend http://127.0.0.1:8080/invoker/JNDIFactory
output:-
*********
Enter message (“quit” to quit):
test
JMS Message Sent: test
5: Compile and execute the below QueueRecieve.java program similar to QueueSend.java.
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 QueueReceive implements MessageListener { 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 QueueReceiver qreceiver; private Queue queue; private boolean quit = false; public void onMessage(Message msg) { try { String msgText; if (msg instanceof TextMessage) { msgText = ((TextMessage)msg).getText(); } else { msgText = msg.toString(); } System.out.println("Message Received: "+ msgText ); if (msgText.equalsIgnoreCase("quit")) { synchronized(this) { quit = true; this.notifyAll(); // Notify main thread to quit } } } catch (JMSException jmse) { System.err.println("An exception occurred: "+jmse.getMessage()); } } 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); qreceiver = qsession.createReceiver(queue); qreceiver.setMessageListener(this); qcon.start(); } public void close()throws JMSException { qreceiver.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.QueueReceive JBossURL"); return; } InitialContext ic = getInitialContext(args[0]); QueueReceive qr = new QueueReceive(); qr.init(ic, QUEUE); System.out.println("JMS Ready To Receive Messages (To quit, send a "quit" message)."); synchronized(qr) { while (! qr.quit) { try { qr.wait(); } catch (InterruptedException ie) {} } } qr.close(); } 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); } }
6. Run the QueueRecieve.java as below.
java QueueReceive http://127.0.0.1:8080/invoker/JNDIFactory
JMS Ready To Receive Messages (To quit, send a “quit” message).
Message Received: test
References:-
http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/JMS_Examples-A_Point_To_Point_Example.html
NOTE: Most common errors while looking up to JBoss JNDI.
*************************************************
Exception in thread “main” javax.naming.NoInitialContextException:
Cannot instantiate class: org.jboss.naming.HttpNamingContextFactory
[Root exception is java.lang.ClassNotFoundException: org.jboss.naming.HttpNamingContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.(InitialContext.java:197)
at QueueSend.getInitialContext(QueueSend.java:122)
at QueueSend.main(QueueSend.java:90)
Caused by: java.lang.ClassNotFoundException: org.jboss.naming.HttpNamingContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
Solution:-
The problem is with the classpath setting and the classloader is not able to load the class “org.jboss.naming.HttpNamingContextFactory” class.
Set the classpath to point to jbossall-client.jar which would be under $JBOSS_HOMEclientjbossall-client.jar
set classpath=%classpath%;$JBOSS_HOMEclientjbossall-client.jar;
Else, you can run your java applications like
java -cp “$JBOSS_HOMEclientjbossall-client.jar” QueueReceive
Cheers,
Wonders Team. 🙂
i get “javax.naming.NamingException :Failed to retrieve Naming interface” exception while running JMS examples in Jboss 4.3 ..Please help
Thank you very much! It really works.
thanks Harish! 🙂