Messaging Approaches in Java
        (JMS, AMQP)

         Kirill Afanasjev




              Jug.lv
           Riga,Latvia
Why Messaging?

   1. Start sending binary data with TCP
   2. Add queueing
   3. Add networking abstraction
   4. Add authentification and ACL
   5. Add virtual connections
   6. Add high avalaibility
   7. Add publish/subscribe
   8. Result would be very similar :)
RPC

   CORBA, SOAP Web Services, RMI, XML-RPC
   Synchronous
   Tight coupling
Message oriented middleware

   Sender and receiver know nothing about each
    other, only destination and message format
   Email is for people what messaging is for
    applications
Advantages

   Asynchronous
    A client does not have to request messages in
    order to receive them
    Sender can fire and forget the message to the
    broker
   Reliable
    It is possible to guarantee message is delivered
    safely once and only once
Disadvantages

   Extra component in architecture (message
    transfer agent or message broker)
   Inter-application communication tend to be
    synchronous
   Lack of standarts
Point-to-point
Point-to-point

   Message queues, senders and receivers
   Message is sent to a queue
   Each message has only one consumer
   Queue may be configured to persist messages
   May be used for load balancing
Publish-subscribe
Publish-subscribe

   Publishers, subscribers, topics
   Message may have multiple consumers, or no
    consumer at all
   Each message is delivered to every client
    subscribed to a topic
JMS

   Java Message Oriented Middleware API
   Part of the Java EE
   Defined in specification developed under JSR
    914
   RFC 6167 defines a jms: URI scheme
   JMS 1.0.2b (June 25, 2001)
   JMS 1.1 (March 18, 2002)
   JMS 2 - ?
JMS architecture

   JMS provider (example : ActiveMQ)
   JMS clients
   Messages
   Administered objects (Destinations and
    connection factories)
   Native clients
JMS API

   ConnectionFactory
   Connection
   Session
   Message producer
   Message producer
   Destination
    - Queue
    - Topic
   Message
JMS API
JMS message

   Header
   Properties (optional)
   Body (optional)
JMS message headers
   JMSCorrelationId - (String) This header is set
    by the application for use by other applications.
   JMSDestination
   JMSDeliveryMode - (Integer) This header is set
    by the JMS provider and denotes the delivery
    mode.
   JMSExpiration
JMS message headers

   JMSPriority - (Integer) The priority of the
    message.
   JMSMessageId
   JMSTimestamp - (Long) The time the message
    was sent.
   JMSReplyTo
   JMSType
   JMSRedelivered
JMS message delivery modes

   DeliveryMode.NON_PERSISTENT
   DeliveryMode.PERSISTENT
JMS message selector

   Message consumer receives only messages
    whose headers and properties match the
    selector
   A message selector cannot select messages
    on the basis of content of the message body
JMS provider implementations
   Apache ActiveMQ
   Apache Qpid, using AMQP
   EMS from TIBCO
   OpenJMS, from The OpenJMS Group
   JBoss Messaging and HornetQ from JBoss
   Open Message Queue, from Sun Microsystems
   BEA Weblogic and Oracle AQ from Oracle
   RabbitMQ, using AMQP
   Solace JMS from Solace Systems
   SonicMQ from Progress Software
   StormMQ, using AMQP
   WebSphere MQ (formerly MQSeries) from IBM
Spring JMS support

   Message-driven POJOs
   MessageConverter, to convert between Java
    objects and JMS messages
   JMSTemplate
Sending message with Spring
public class JmsQueueSender {
    private JmsTemplate jmsTemplate;
    private Queue queue;
    public void simpleSend() {
        this.jmsTemplate.send(this.queue, new MessageCreator(){
              public Message createMessage(Session session) {
                  return session.createTextMessage("hello queue world");
              }
        });
    }
}
Receiving message with Spring

 public class ExampleListener implements MessageListener {
     public void onMessage(Message message) {
         if (message instanceof TextMessage) {
             System.out.println(((TextMessage) message).getText());
         }
     }
 }
Apache ActiveMQ

   Open source JMS 1.1 message broker
   Clustering
   Multiple message stores
   TCP, UDP, NIO, SSL, VM connectivity
   OpenWire API for high performance
   Stomp API for easier implementation
   REST API
   Can be used as in-memory JMS provider
Why AMQP, not JMS?

   Bound to Java
   Other protocols (STOMP, e.t.c) do not offer all
    the functionality of the broker
   Single standart for interoperability of brokers
    (AMQP is Protocol, not API)
Why JMS, not AMQP

   More implementations
   Better support in Java world
   Being an API allows for custom protocol
    implementations (VM connector)
AMQP

   Open standart protocol
   Support in all major languages
   Binary wire protocol (JMS defines API only)
   1.0 version of protocol published 07 Oct 2011
AMQP protocol

   Defines how clients and brokers talk
   Data serialization, heartbeat
   Hidden inside client libraries
AMQP model

   Message broker - server
   User
   Connection – physical connection
   Channel – logical connection
   Exchanges – named entities, to which
    messages are sent (may be durable or not)
   Queues – names entities, that store received
    messages (may be exclusive)
AMQP model




   P - producer
   X - exchange
   C - consumer
AMQP model




   P/C – producer/consumer
   Ch – channel
   Conn – connection
   X - exchange
AMQP message

   Header + content body
   Immediate – message will be handled as
    unroutable if there is no client waiting for it
   Expiration
   Priority
   Delivery mode
AMQP bindings

   Relationship between one queue and one
    exchange
   Unconditional
   Conditional on fixed string
   Conditional on pattern match
   Conditional on content inspection
   Conditional on algorithmic comparison
Fanout exchange
   1:N message delivery pattern
   Bind a queue to the exchange and messages
    sent to that exchange get delivered to all the
    bound queues
Direct exchange

   Queue binds to exchange
    with string key
   Publisher sends message
    with key




   Message is passed to the
    queue only if keys are equal
AMQP working group
   Bank of America, N.A.
   Barclays Bank PLC
   Cisco Systems, Inc.
   Credit Suisse
   Goldman Sachs
   JPMorgan Chase Bank & Co.
   Microsoft Corporation
   Novell
   Progress Software
   Red Hat, Inc.
   Software AG
   VMware, Inc.
AMQP in Java world
   Grails plug in
   Java client
   Scala / Lift support
   Spring AMQP project 1.0.0.RELEASE
    (http://www.springsource.org/spring-amqp)
Spring AMQP project

   Similar to Spring JMS support
   AMQPTemplate
   MessageListener
   Transactions
   e.t.c
Apache QPID

   JMS interface for AMQP
   Message broker implemented in Java
   Version 0.12 :(
AMQP future

   ActiveMQ, HornetQ, e.t.c has plans to support
    AMQP
   1.0 version?
RabbitMQ

   Leading implementation of AMQP
   Developed by SpringSource division of Vmware
   Full range of commercial support services
   Implemented in Erlang
   Clustering built-in
RabbitMQ performance

   We use it for login data processing
   Each user login in game = 1 message to the
    queue
   Performance depends on
    persistence/transactions enabled
   At 20k 1-kilobyte persistent messages per
    second with sub-millisecond latency RabbitMQ
    was far from being a bottleneck
Book to read

   Hohpe, Gregor; Bobby
    Woolf (2003).
    Enterprise Integration
    Patterns: Designing,
    Building, and Deploying
    Messaging Solutions.
    ISBN 0-321-20068-3.
Book to read

   ActiveMQ in Action
    Bruce Snyder, Dejan
    Bosanac and Rob
    Davies
    ISBN 1933988940
Book to read

   RabbitMQ in Action
    Alvaro Videla and
    Jason J.W. Williams
    ISBN:
    9781935182979
Questions?

   ?

Messaging in Java

  • 1.
    Messaging Approaches inJava (JMS, AMQP) Kirill Afanasjev Jug.lv Riga,Latvia
  • 2.
    Why Messaging?  1. Start sending binary data with TCP  2. Add queueing  3. Add networking abstraction  4. Add authentification and ACL  5. Add virtual connections  6. Add high avalaibility  7. Add publish/subscribe  8. Result would be very similar :)
  • 3.
    RPC  CORBA, SOAP Web Services, RMI, XML-RPC  Synchronous  Tight coupling
  • 4.
    Message oriented middleware  Sender and receiver know nothing about each other, only destination and message format  Email is for people what messaging is for applications
  • 5.
    Advantages  Asynchronous A client does not have to request messages in order to receive them Sender can fire and forget the message to the broker  Reliable It is possible to guarantee message is delivered safely once and only once
  • 6.
    Disadvantages  Extra component in architecture (message transfer agent or message broker)  Inter-application communication tend to be synchronous  Lack of standarts
  • 7.
  • 8.
    Point-to-point  Message queues, senders and receivers  Message is sent to a queue  Each message has only one consumer  Queue may be configured to persist messages  May be used for load balancing
  • 9.
  • 10.
    Publish-subscribe  Publishers, subscribers, topics  Message may have multiple consumers, or no consumer at all  Each message is delivered to every client subscribed to a topic
  • 11.
    JMS  Java Message Oriented Middleware API  Part of the Java EE  Defined in specification developed under JSR 914  RFC 6167 defines a jms: URI scheme  JMS 1.0.2b (June 25, 2001)  JMS 1.1 (March 18, 2002)  JMS 2 - ?
  • 12.
    JMS architecture  JMS provider (example : ActiveMQ)  JMS clients  Messages  Administered objects (Destinations and connection factories)  Native clients
  • 13.
    JMS API  ConnectionFactory  Connection  Session  Message producer  Message producer  Destination - Queue - Topic  Message
  • 14.
  • 15.
    JMS message  Header  Properties (optional)  Body (optional)
  • 16.
    JMS message headers  JMSCorrelationId - (String) This header is set by the application for use by other applications.  JMSDestination  JMSDeliveryMode - (Integer) This header is set by the JMS provider and denotes the delivery mode.  JMSExpiration
  • 17.
    JMS message headers  JMSPriority - (Integer) The priority of the message.  JMSMessageId  JMSTimestamp - (Long) The time the message was sent.  JMSReplyTo  JMSType  JMSRedelivered
  • 18.
    JMS message deliverymodes  DeliveryMode.NON_PERSISTENT  DeliveryMode.PERSISTENT
  • 19.
    JMS message selector  Message consumer receives only messages whose headers and properties match the selector  A message selector cannot select messages on the basis of content of the message body
  • 20.
    JMS provider implementations  Apache ActiveMQ  Apache Qpid, using AMQP  EMS from TIBCO  OpenJMS, from The OpenJMS Group  JBoss Messaging and HornetQ from JBoss  Open Message Queue, from Sun Microsystems  BEA Weblogic and Oracle AQ from Oracle  RabbitMQ, using AMQP  Solace JMS from Solace Systems  SonicMQ from Progress Software  StormMQ, using AMQP  WebSphere MQ (formerly MQSeries) from IBM
  • 21.
    Spring JMS support  Message-driven POJOs  MessageConverter, to convert between Java objects and JMS messages  JMSTemplate
  • 22.
    Sending message withSpring public class JmsQueueSender { private JmsTemplate jmsTemplate; private Queue queue; public void simpleSend() { this.jmsTemplate.send(this.queue, new MessageCreator(){ public Message createMessage(Session session) { return session.createTextMessage("hello queue world"); } }); } }
  • 23.
    Receiving message withSpring public class ExampleListener implements MessageListener { public void onMessage(Message message) { if (message instanceof TextMessage) { System.out.println(((TextMessage) message).getText()); } } }
  • 24.
    Apache ActiveMQ  Open source JMS 1.1 message broker  Clustering  Multiple message stores  TCP, UDP, NIO, SSL, VM connectivity  OpenWire API for high performance  Stomp API for easier implementation  REST API  Can be used as in-memory JMS provider
  • 25.
    Why AMQP, notJMS?  Bound to Java  Other protocols (STOMP, e.t.c) do not offer all the functionality of the broker  Single standart for interoperability of brokers (AMQP is Protocol, not API)
  • 26.
    Why JMS, notAMQP  More implementations  Better support in Java world  Being an API allows for custom protocol implementations (VM connector)
  • 27.
    AMQP  Open standart protocol  Support in all major languages  Binary wire protocol (JMS defines API only)  1.0 version of protocol published 07 Oct 2011
  • 28.
    AMQP protocol  Defines how clients and brokers talk  Data serialization, heartbeat  Hidden inside client libraries
  • 29.
    AMQP model  Message broker - server  User  Connection – physical connection  Channel – logical connection  Exchanges – named entities, to which messages are sent (may be durable or not)  Queues – names entities, that store received messages (may be exclusive)
  • 30.
    AMQP model  P - producer  X - exchange  C - consumer
  • 31.
    AMQP model  P/C – producer/consumer  Ch – channel  Conn – connection  X - exchange
  • 32.
    AMQP message  Header + content body  Immediate – message will be handled as unroutable if there is no client waiting for it  Expiration  Priority  Delivery mode
  • 33.
    AMQP bindings  Relationship between one queue and one exchange  Unconditional  Conditional on fixed string  Conditional on pattern match  Conditional on content inspection  Conditional on algorithmic comparison
  • 34.
    Fanout exchange  1:N message delivery pattern  Bind a queue to the exchange and messages sent to that exchange get delivered to all the bound queues
  • 35.
    Direct exchange  Queue binds to exchange with string key  Publisher sends message with key  Message is passed to the queue only if keys are equal
  • 36.
    AMQP working group  Bank of America, N.A.  Barclays Bank PLC  Cisco Systems, Inc.  Credit Suisse  Goldman Sachs  JPMorgan Chase Bank & Co.  Microsoft Corporation  Novell  Progress Software  Red Hat, Inc.  Software AG  VMware, Inc.
  • 37.
    AMQP in Javaworld  Grails plug in  Java client  Scala / Lift support  Spring AMQP project 1.0.0.RELEASE (http://www.springsource.org/spring-amqp)
  • 38.
    Spring AMQP project  Similar to Spring JMS support  AMQPTemplate  MessageListener  Transactions  e.t.c
  • 39.
    Apache QPID  JMS interface for AMQP  Message broker implemented in Java  Version 0.12 :(
  • 40.
    AMQP future  ActiveMQ, HornetQ, e.t.c has plans to support AMQP  1.0 version?
  • 41.
    RabbitMQ  Leading implementation of AMQP  Developed by SpringSource division of Vmware  Full range of commercial support services  Implemented in Erlang  Clustering built-in
  • 42.
    RabbitMQ performance  We use it for login data processing  Each user login in game = 1 message to the queue  Performance depends on persistence/transactions enabled  At 20k 1-kilobyte persistent messages per second with sub-millisecond latency RabbitMQ was far from being a bottleneck
  • 43.
    Book to read  Hohpe, Gregor; Bobby Woolf (2003). Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. ISBN 0-321-20068-3.
  • 44.
    Book to read  ActiveMQ in Action Bruce Snyder, Dejan Bosanac and Rob Davies ISBN 1933988940
  • 45.
    Book to read  RabbitMQ in Action Alvaro Videla and Jason J.W. Williams ISBN: 9781935182979
  • 46.