messaging in java
TRANSCRIPT
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?
?