Messaging in Java

5,747 views

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,747
On SlideShare
0
From Embeds
0
Number of Embeds
170
Actions
Shares
0
Downloads
160
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Messaging in Java

  1. 1. Messaging Approaches in Java (JMS, AMQP) Kirill Afanasjev Jug.lv Riga,Latvia
  2. 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. 3. RPC CORBA, SOAP Web Services, RMI, XML-RPC Synchronous Tight coupling
  4. 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. 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. 6. Disadvantages Extra component in architecture (message transfer agent or message broker) Inter-application communication tend to be synchronous Lack of standarts
  7. 7. Point-to-point
  8. 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. 9. Publish-subscribe
  10. 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. 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. 12. JMS architecture JMS provider (example : ActiveMQ) JMS clients Messages Administered objects (Destinations and connection factories) Native clients
  13. 13. JMS API ConnectionFactory Connection Session Message producer Message producer Destination - Queue - Topic Message
  14. 14. JMS API
  15. 15. JMS message Header Properties (optional) Body (optional)
  16. 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. 17. JMS message headers JMSPriority - (Integer) The priority of the message. JMSMessageId JMSTimestamp - (Long) The time the message was sent. JMSReplyTo JMSType JMSRedelivered
  18. 18. JMS message delivery modes DeliveryMode.NON_PERSISTENT DeliveryMode.PERSISTENT
  19. 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. 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. 21. Spring JMS support Message-driven POJOs MessageConverter, to convert between Java objects and JMS messages JMSTemplate
  22. 22. Sending message with Springpublic 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. 23. Receiving message with Spring public class ExampleListener implements MessageListener { public void onMessage(Message message) { if (message instanceof TextMessage) { System.out.println(((TextMessage) message).getText()); } } }
  24. 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. 25. 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)
  26. 26. Why JMS, not AMQP More implementations Better support in Java world Being an API allows for custom protocol implementations (VM connector)
  27. 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. 28. AMQP protocol Defines how clients and brokers talk Data serialization, heartbeat Hidden inside client libraries
  29. 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. 30. AMQP model P - producer X - exchange C - consumer
  31. 31. AMQP model P/C – producer/consumer Ch – channel Conn – connection X - exchange
  32. 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. 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. 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. 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. 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. 37. 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)
  38. 38. Spring AMQP project Similar to Spring JMS support AMQPTemplate MessageListener Transactions e.t.c
  39. 39. Apache QPID JMS interface for AMQP Message broker implemented in Java Version 0.12 :(
  40. 40. AMQP future ActiveMQ, HornetQ, e.t.c has plans to support AMQP 1.0 version?
  41. 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. 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. 43. Book to read Hohpe, Gregor; Bobby Woolf (2003). Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. ISBN 0-321-20068-3.
  44. 44. Book to read ActiveMQ in Action Bruce Snyder, Dejan Bosanac and Rob Davies ISBN 1933988940
  45. 45. Book to read RabbitMQ in Action Alvaro Videla and Jason J.W. Williams ISBN: 9781935182979
  46. 46. Questions? ?

×