Pages

Point to Point Messaging using JMS

Java Messaging Service (JMS)  is a Message Oriented Middleware (MOM) API for sending messages between two or more clients.

JMS API supports two models:
1.Point to Point
2.Publish and Subscribe
Here we are going to look p2p example.



Requirement
Application server : JBoss Server 5.0 GA
Java : jdk 1.5 and above
IDE(optional) : Eclipse Indigo/ Juno


Step 1:Make sure the queue as created with name(here queue name is DLQ) in the path c:/dummypath/jboss 5.1 GA/server/default/deploy/messaging and file is destinations-service.xml

 <mbean code="org.jboss.jms.server.destination.QueueService"
      name="jboss.messaging.destination:service=Queue,name=DLQ"
      xmbean-dd="xmdesc/Queue-xmbean.xml">
      <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      <depends>jboss.messaging:service=PostOffice</depends>
   </mbean>

Step 2:Create a Producer to put a message in queue.
Producer
package com.bhuvan;

import java.io.*;
import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueProducer {
 
 public final static String JNDI_FACTORY="org.jnp.interfaces.NamingContextFactory";
 //*************** Connection Factory JNDI name *************************
 public final static String JMS_FACTORY="/ConnectionFactory";
 //*************** Queue JNDI name *************************
 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 static void main(String[] args) throws Exception
 {
  InitialContext ic = getInitialContext();
  QueueProducer qs = new QueueProducer();
  qs.init(ic);
  qs.readAndSend(qs);
  qs.close();
 }
 
 private static InitialContext getInitialContext() throws NamingException
 {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, "localhost:1099");
  return new InitialContext(env);
 }
 
 public void init(Context ctx)throws NamingException, JMSException
 {
  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
  qcon = qconFactory.createQueueConnection();
  qcon.start();
  
  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  queue = (Queue) ctx.lookup(QUEUE);
  
  qsender = qsession.createSender(queue);
  msg = qsession.createTextMessage();  
 }
 
 private void readAndSend(QueueProducer qs) throws IOException, JMSException
 {
  msg.setText("Hello World !!!");
  qsender.send(msg);
 }

 public void close() throws JMSException
 {
  qsender.close();
  qsession.close();
  qcon.close();
 }
}
Step 3:Create a Consumer to receive message.
Consumer
package com.bhuvan;

import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueConsumer {
 public final static String JNDI_FACTORY="org.jnp.interfaces.NamingContextFactory";
 //*************** Connection Factory JNDI name *************************
 public final static String JMS_FACTORY="/ConnectionFactory";
 //*************** Queue JNDI name *************************
 public final static String QUEUE="queue/DLQ";
 
 private QueueConnectionFactory qconFactory;
 private QueueConnection qcon;
 private QueueSession qsession;
 private QueueReceiver qreceiver;
 private Queue queue;
 private TextMessage msg;
 
       public static void main(String[] args)throws NamingException, JMSException
       { 
   QueueConsumer qc=new QueueConsumer();
   try {
  Context ic=getInitialContext();
  qc.getMessage(ic);
  qc.close();
  
   } catch (NamingException e) { 
  e.printStackTrace();
   } 
        }
 
 private static InitialContext getInitialContext() throws NamingException
 {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, "localhost:1099");
  return new InitialContext(env);
 }
 
 public void getMessage(Context ctx)throws NamingException, JMSException
 {
  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
  qcon = qconFactory.createQueueConnection();
  qcon.start();
  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  queue = (Queue) ctx.lookup(QUEUE);
  qreceiver = qsession.createReceiver(queue);
  
  TextMessage message = (TextMessage)qreceiver.receive();
                System.err.println("Received message: " + message.getText());
 }
 public void close() throws JMSException
 {
  qreceiver.close();
  qsession.close();
  qcon.close();
 }
}

Step 4:Run the producer class first and then run the consumer.

Output(Client Console):
Hello World !!!