JMS
java messaging
    service

       bolkimen@yahoo.com
General concepts
Producer/Publisher                                     Consumer/Subscriber




                             QueueTopic


                 Message >      JMS        Message >
                              provider

                                 ...
                                 ...
Queues

 Producer           Consumer




            Queue
Topics

  Producer   Topic   Consumer
Message types

JMS specification provides standard implementations of javax.jms.Message:

1.   javax.jms.BytesMessage - array of bytes

2.   javax.jms.MapMessage - key-value pairs

3.   javax.jms.ObjectMessage - serialized Java object

4.   javax.jms.StreamMessage - stream of Java primitive values

5.   javax.jms.TextMessage - Java String object (used for XML)
The working algorithm with JMS
1.   Obtain a javax.jms.ConnectionFactory using a JNDI lookup. (The default ConnectionFactory
     names are different depending on the JMS provider.)

2.   Obtain a javax.jms.Connection from the ConnectionFactory.

3.   Obtain a javax.jms.Session from the Connection.

4.   Create a javax.jms.MessageProducer or javax.jms.MessageConsumer from the Session.

5.   For a MessageProducer, send the message, or for a MessageConsumer, receive the message
     (synchronous) or set the message listener (asynchronous).

6.   Start the Connection to start message delivery.

7.   Ultimately close the Connection.
Synchronous messaging



while(true) {
      Message message = consumer.receive();
      ....
}
Asynchronous messaging
(listener class)


class AsyncConsumerMessageListener implements MessageListener {
      public void onMessage(Message message) {
      TextMessage msg = (TextMessage) message;
      ....
      }
}
Asynchronous messaging
(listener class usage)



AsyncConsumerMessageListener asyncConsumer = new AsyncConsumerMessageListener();

MessageConsumer consumer = session.createConsumer(destination);

consumer.setMessageListener(asyncConsumer);
Spring
amqConnectionFactory


<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

      <property name="brokerURL" value="${jms.url}" />

</bean>



1) jms.url=tcp://localhost:61616

2) jms.url=vm://localhost
Spring
jmsQueueConnectionFactory


<bean id="jmsQueueConnectionFactory"
   class="org.springframework.jms.connection.SingleConnectionFactory">

          <property name="targetConnectionFactory" ref="amqConnectionFactory" />


</bean>
Spring
listener-container

<jms:listener-container
      connection-factory="jmsQueueConnectionFactory"
      destination-type="queue" container-type="default">

           <jms:listener
                 destination="TESTQUEUE"
                 ref="webConsumer"
                  method="onMessage" />

</jms:listener-container>
Spring
jmsTemplate



<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">

          <constructor-arg ref="jmsQueueConnectionFactory" />

</bean>
Spring
message listener



@Component
public class WebConsumer implements MessageListener
{
  public void onMessage( final Message message ) {…}
}
Spring
producer
@Component
public class WebProducer
{
      @Autowired
      private JmsTemplate jmsTemplate;

     public void send(String message) throws JMSException
     {
           jmsTemplate.convertAndSend("TESTQUEUE", message);
     }
}
Sources & useful links


1.   Official JMS tutorial book

2.   http://www.thirdeyeconsulting.com/indyjug/jms/jms.html

3.   http://www2.sys-con.com/itsg/virtualcd/Java/archives/0604/chappell/index.html

Jms слайды