Messaging in Java

Post on 12-May-2015

5,030 views 1 download

Tags:

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?

?