Java Messaging Service Notes prepared from GBC Professional Development Seminar :Understanding the Java Messaging Service David Chappell & Rick Kuzyk, Sonic Software.
Messaging Data exchange requirements between disparate applications –B2C components (and clients) catalogs order payment fulfillment support
Messaging Data exchange requirements between disparate applications –B2B components (and clients) wholesale retail accounts payable and receivable –Disconnected users (mobile, handheld) package delivery maintenance web phones
Messaging Data exchange requirements between disparate applications –B2B components (and clients) wholesale retail accounts payable and receivable –Disconnected users (mobile, handheld) package delivery maintenance web phones
Enterprise Messaging (MOM) Message oriented middleware (MOM) –Asynchronous messaging; sender need not wait for reply –decoupled sender and receiver—no direct communication –no persistent connection between parties, including MOM
Enterprise Message vs RPC Enterprise MessagingRPC AsynchronousSynchronous (Req/Rpy) Tolerates partial failurePartial failure can affect entire application Transparent support for distributed systems Best for single, possibly n-tiered, system Indirect communication through MOM Direct communication between processes Applications decoupledApplications coupled
Enterprise messaging Application A Messaging API Messaging Clients Application A Messaging API Messaging Clients MOM
App CApp A RPC infrastructure Tightly coupled RPC RPC infrastructure App D RPC infrastructure App B RPC infrastructure n*(n-1)/2 connections
JMS Messaging Message server JMS Client Hub and spoke JMS Client Local "server" Router Local "server" Decentralized (IP multicast)
JMS JMS Messaging client –Uses the JMS API to create, send, receive messages –Interfaces and classes or the API = client runtime JMS Message server –handles deliver of messages sent by clients to other messaging clients who register an interest JMS provider = JMS client runtime + message server. –supports the JMS API and reliable delivery J2EE provides glue that lets certain objects to run as a JMS messaging client
JMS and J2EE These objects can function as JMS messaging clients via J2EE –enterprise beans (EJB) –servlets –JSP pages –J2EE application client message-driven bean: an EJB that can consume JSP messages
J2EE Client application EJB Container Application Client Container Web Container J2EE platform JMS Server JDBC Server
JMS Client classes ConnectionBinds a JMS client to a message server. multiple per client; associated with either pub/sub or PTP SessionContext for sending/receiving messages; multiple per Connection Producersends messages to Destinations Destinationidentifier for a message Messagepackage sent from a producer to a consumer
JMS Client Consumer Connection Session JMS Components JMS Client Producer Connection Session Message server Destination Message
JMS Client Consumer JMS Components JMS Client Producer Message server Destination Send Message Consume Message Bind to Destination
JMS Client objects Producer –Binds to a destination to send messages –Determines message TTL, priority, persistence Consumer –Binds to a destination to receive messages –Receives messages asynchronously through a message listener or synchronously by polling
JMS Client objects Messages –Headers –Property list (some predefined); Consumers can select on properties –Body
JMS Message types Message typeBody MessageEmpty TextMessageJava String ObjectMessageSerializable Java object MapMessageName/value pairs StreamMessageStream of Java primitives BytesMessageUninterpreted bytes
Messaging Domains Publish and subscribe (pub/sub) –Many consumers per message –Messages have a topic that identifies the relation of publisher to subscriber Point-to-point (PTP, p2p) –One consumer per message –Messages queued. Consumers can browse queue without consuming
Pub/Sub model PublisherTopicSubscriber New books HW
P2P model SenderQueReceiver Submit Grade hw9 A+ PARTY! res hw9A+res
Connections and sessions jndi = new InitialCOntext(env); tFactory = (TopicConnectionFactory)jndi.lookup("TopicConnectionFactory"); qFactory = QueueConnectionFactory)jndi.lookup("QueueConnectionFactory"); tConnect = tFactory.createTopicConnection(unsername, password); qConnect = qFactory.createQueueConnection(unsername, password); tSession = tConnect.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); qSession = qConnect.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); tConnect.start(); qConnect.start();
Destinations Pub/sub topics –May be predetermined by server –May be created on a server by a JMS client Topic hw9Topic = tSession.createTopic("hw9"); –May be looked up in a db via Java Naming and Directory Interface (JNDI) Topic hw9Topic (Topic)jndi.lookup("hw9");
Destinations P2P queues –Queue must exist in server Queue hwQ = tSession.createQueue("HW"); // or Queue hwQ = (Queue) jndi.lookup("HW");
Creating and populating a message Queue Session qSession Text Message textMsg qSession.createTextMessage(); String thisHW="hw9"; textMsg.createContent("GreatJob on" + thisHW);
JMS message headers Assigned by system –JMSDestination –JMSDeliveryMode –JMSMessageID –JMSTimestamp –JMSExpiration –JMS Priority Assigned by developer –JMSReplyTo –JMSCorrelationID –JMSType
Message properties Name/value pairs assigned by application Values must be Java primitives Setting: message.setStringProperty("studentName", "Nemo"); //prop message.setJMSReplyTo(hw9Q); //header Can filter on props or headers javax.jms.QueueReceiver rcvr = qSession.createReceiver(hw9Q, "JMSPriority > 10");