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) • wholesaleretail • accounts payable and receivable – Disconnected users (mobile, handheld) • package delivery • maintenance • web phones Messaging • Data exchange requirements between disparate applications – B2B components (and clients) • wholesaleretail • 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 Messaging Asynchronous Tolerates partial failure Transparent support for distributed systems Indirect communication through MOM Applications decoupled RPC Synchronous (Req/Rpy) Partial failure can affect entire application Best for single, possibly n-tiered, system Direct communication between processes Applications coupled Enterprise messaging Application A Messaging API Messaging Clients Application A MOM Messaging API Messaging Clients Tightly coupled RPC n*(n-1)/2 connections App A RPC infrastructure App B RPC infrastructure App C RPC infrastructure App D RPC infrastructure JMS Messaging JMS Client JMS Client JMS Client Router Local "server" Message server JMS Client JMS Client JMS Client JMS Client Hub and spoke JMS Client JMS Client Local "server" 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 Web Container Application Client Container J2EE platform JMS Server JDBC Server JMS Client classes Connection Binds a JMS client to a message server. multiple per client; associated with either pub/sub or PTP Session Context for sending/receiving messages; multiple per Connection Producer sends messages to Destinations Destination identifier for a message Message package sent from a producer to a consumer JMS Components JMS Client JMS Client Connection Connection Session Session Message server Producer Consumer Destination Message Message JMS Components JMS Client JMS Client Producer Consumer Bind to Destination Bind to Destination Message server Destination Send Message Consume Message 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 type Body Message Empty TextMessage Java String ObjectMessage Serializable Java object MapMessage Name/value pairs StreamMessage Stream of Java primitives BytesMessage Uninterpreted 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 Publisher Topic New books HW Subscriber P2P model Sender Que hw9 hw9 Submit Receiver hw9 hw9 hw9 A+ A+ Grade A+ res PARTY! res A+ A+ res res 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 qSession.createTextMessage(); Text Message textMsg 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");