This document provides an overview of messaging approaches in Java, specifically focusing on JMS and AMQP. It discusses the motivations for messaging, common messaging patterns like point-to-point and publish-subscribe, and compares RPC approaches. The document then dives into details of the JMS API and architecture, common implementations like ActiveMQ, and how Spring supports JMS. It also covers the AMQP protocol and model, implementations like RabbitMQ, and how Spring supports AMQP. Key books on these topics are recommended.
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
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
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 - ?
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
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 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");
}
});
}
}
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. 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, 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. Why JMS, not AMQP
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 Java world
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