Here is a complete and short example of asynchronous development using JMS and a Message-Driven Bean (MDB).
First the procedure to configure inside Weblogic Server a JMS server in order to create a queue, then the code for the producer/sender of a message to the queue and then the code for a consumer (MDB).
1) Weblogic configuration
a) Create the JMS server
c) Create a destination (queue or topic)
d) Create a connection factory
2) Create a producer
For the producer, I got strongly inspired by the code found in this blog. This is a clean example of a producer/sender so no need to reinvent the wheel here.
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.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class JMSProducer { private static InitialContext initialContext = null; private static QueueConnectionFactory queueConnectionFactory = null; private static QueueConnection queueConnection = null; private static QueueSession queueSession = null; private static Queue queue = null; private static QueueSender queueSender = null; private static TextMessage textMessage = null; private static final String CONNECTIONFACTORY_NAME = "ConnectionFactory-Test"; private static final String QUEUE_NAME = "jms/QueueTest"; public JMSProducer() { super(); } public static void sendMessageToDestination(String messageText) { // create InitialContext Hashtable properties = new Hashtable(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); properties.put(Context.PROVIDER_URL, "t3://localhost:7001"); properties.put(Context.SECURITY_PRINCIPAL, "weblogic"); properties.put(Context.SECURITY_CREDENTIALS, "weblogic1"); try { initialContext = new InitialContext(properties); } catch (NamingException ne) { ne.printStackTrace(System.err); } System.out.println("InitialContext : " + initialContext.toString()); // create QueueConnectionFactory try { queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup(CONNECTIONFACTORY_NAME); } catch (NamingException ne) { ne.printStackTrace(System.err); } System.out.println("QueueConnectionFactory : " + queueConnectionFactory.toString()); // create QueueConnection try { queueConnection = queueConnectionFactory.createQueueConnection(); } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("QueueConnection : " + queueConnection.toString()); // create QueueSession try { queueSession = queueConnection.createQueueSession(false, 0); } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("QueueSession : " + queueSession.toString()); // lookup Queue try { queue = (Queue) initialContext.lookup(QUEUE_NAME); } catch (NamingException ne) { ne.printStackTrace(System.err); } System.out.println("Queue : " + queue.toString()); // create QueueSender try { queueSender = queueSession.createSender(queue); } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("QueueSender : " + queueSender.toString()); // create TextMessage try { textMessage = queueSession.createTextMessage(); } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("TextMessage : " + textMessage.toString()); try { textMessage.setText(messageText); } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("TextMessage : " + textMessage.toString()); // send message try { queueSender.send(textMessage); } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("Message sent."); // clean up try { textMessage = null; queueSender.close(); queueSender = null; queue = null; queueSession.close(); queueSession = null; queueConnection.close(); queueConnection = null; queueConnectionFactory = null; initialContext = null; } catch (JMSException jmse) { jmse.printStackTrace(System.err); } System.out.println("Cleaned up done."); } public static void main(String args[]) { sendMessageToDestination("test"); } }
3) Create a consumer
This MDB consumer just prints out something in the log when it consumes the message in the queue.
The lifecycle methods are empty but they could be used to clean up resources for instance.
import javax.ejb.ActivationConfigProperty; import javax.ejb.EJBException; import javax.ejb.MessageDriven; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @MessageDriven(mappedName = "jms/QueueTest", activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") }) public class TestJMSSABean implements MessageDrivenBean, MessageListener { /** The Constant LOGGER. */ protected static final Logger LOGGER = LoggerFactory.getLogger(TestJMSSABean.class); public TestJMSSABean() { } @Override public void onMessage(Message message) { try { if (message instanceof TextMessage) { System.out.println(((TextMessage) message).getText()); LOGGER.trace("***************** : " + ((TextMessage) message).getText()); } else { System.out.println(message.getJMSMessageID()); LOGGER.trace("***************** : " + message.getJMSMessageID()); } } catch (JMSException ex) { LOGGER.trace("***************** ERROR : " + ex.getMessage()); } } @Override public void ejbRemove() throws EJBException { // TODO Auto-generated method stub } @Override public void setMessageDrivenContext(MessageDrivenContext arg0) throws EJBException { // TODO Auto-generated method stub } }