| type=page |
| status=published |
| title=Using the Java Message Service |
| next=mail.html |
| prev=jndi.html |
| ~~~~~~ |
| Using the Java Message Service |
| ============================== |
| |
| [[GSDVG00020]][[beaob]] |
| |
| |
| [[using-the-java-message-service]] |
| 17 Using the Java Message Service |
| --------------------------------- |
| |
| This chapter describes how to use the Java Message Service (JMS) API. |
| The Oracle GlassFish Server has a fully integrated JMS provider: the |
| Open Message Queue software. |
| |
| |
| [NOTE] |
| ======================================================================= |
| |
| JMS resources are supported only in the full GlassFish Server, not in |
| the Web Profile. |
| |
| ======================================================================= |
| |
| |
| For information about the JMS, see |
| "https://javaee.github.io/tutorial/partmessaging.html[Messaging]" in The |
| Java EE 8 Tutorial. |
| |
| For detailed information about JMS concepts and JMS support in the |
| GlassFish Server, see "link:../administration-guide/jms.html#GSADG00020[Administering the Java Message |
| Service (JMS)]" in GlassFish Server Open Source Edition Administration |
| Guide. |
| |
| The following topics are addressed here: |
| |
| * link:#gkpcz[Using Application-Scoped JMS Resources] |
| * link:#beaop[Load-Balanced Message Inflow] |
| * link:#beaor[Authentication With `ConnectionFactory`] |
| * link:#beaot[Delivering SOAP Messages Using the JMS API] |
| |
| [[gkpcz]][[GSDVG00196]][[using-application-scoped-jms-resources]] |
| |
| Using Application-Scoped JMS Resources |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| You can define an application-scoped JMS or other resource for an |
| enterprise application, web module, EJB module, connector module, or |
| application client module by supplying a `glassfish-resources.xml` |
| deployment descriptor file. For details, see |
| "link:../application-deployment-guide/deploying-applications.html#GSDPG00075[Application-Scoped Resources]" in GlassFish Server |
| Open Source Edition Application Deployment Guide. |
| |
| [[beaop]][[GSDVG00197]][[load-balanced-message-inflow]] |
| |
| Load-Balanced Message Inflow |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| You can configure `ActivationSpec` properties of the `jmsra` resource |
| adapter in the `glassfish-ejb-jar.xml` file for a message-driven bean |
| using `activation-config-property` elements. Whenever a message-driven |
| bean (`EndPointFactory`) is deployed, the connector runtime engine finds |
| these properties and configures them accordingly in the resource |
| adapter. See "link:../application-deployment-guide/dd-elements.html#GSDPG00086[activation-config-property]" in GlassFish |
| Server Open Source Edition Application Deployment Guide. |
| |
| The GlassFish Server transparently enables messages to be delivered in |
| random fashion to message-driven beans having same `ClientID`. The |
| `ClientID` is required for durable subscribers. |
| |
| For nondurable subscribers in which the `ClientID` is not configured, |
| all instances of a specific message-driven bean that subscribe to same |
| topic are considered equal. When a message-driven bean is deployed to |
| multiple instances of the GlassFish Server, only one of the |
| message-driven beans receives the message. If multiple distinct |
| message-driven beans subscribe to same topic, one instance of each |
| message-driven bean receives a copy of the message. |
| |
| To support multiple consumers using the same queue, set the |
| `maxNumActiveConsumers` property of the physical destination to a large |
| value. If this property is set, the Oracle Message Queue software allows |
| multiple message-driven beans to consume messages from same queue. The |
| message is delivered randomly to the message-driven beans. If |
| `maxNumActiveConsumers` is set to `-1`, there is no limit to the number |
| of consumers. |
| |
| To ensure that local delivery is preferred, set `addresslist-behavior` |
| to `priority`. This setting specifies that the first broker in the |
| `AddressList` is selected first. This first broker is the local |
| colocated Message Queue instance. If this broker is unavailable, |
| connection attempts are made to brokers in the order in which they are |
| listed in the `AddressList`. This setting is the default for GlassFish |
| Server instances that belong to a cluster. |
| |
| [[beaor]][[GSDVG00198]][[authentication-with-connectionfactory]] |
| |
| Authentication With `ConnectionFactory` |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| If your web, EJB, or client module has `res-auth` set to `Container`, |
| but you use the `ConnectionFactory.createConnection("user","password")` |
| method to get a connection, the GlassFish Server searches the container |
| for authentication information before using the supplied user and |
| password. Version 7 of the GlassFish Server threw an exception in this |
| situation. |
| |
| [[beaot]][[GSDVG00199]][[delivering-soap-messages-using-the-jms-api]] |
| |
| Delivering SOAP Messages Using the JMS API |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Web service clients use the Simple Object Access Protocol (SOAP) to |
| communicate with web services. SOAP uses a combination of XML-based data |
| structuring and Hyper Text Transfer Protocol (HTTP) to define a |
| standardized way of invoking methods in objects distributed in diverse |
| operating environments across the Internet. |
| |
| For more information about SOAP, see the Apache SOAP web site at |
| `http://xml.apache.org/soap/index.html`. |
| |
| You can take advantage of the JMS provider's reliable messaging when |
| delivering SOAP messages. You can convert a SOAP message into a JMS |
| message, send the JMS message, then convert the JMS message back into a |
| SOAP message. |
| |
| The following topics are addressed here: |
| |
| * link:#beaou[To Send SOAP Messages Using the JMS API] |
| * link:#beaov[To Receive SOAP Messages Using the JMS API] |
| |
| [[beaou]][[GSDVG00077]][[to-send-soap-messages-using-the-jms-api]] |
| |
| To Send SOAP Messages Using the JMS API |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| 1. Import the `MessageTransformer` library. + |
| [source,oac_no_warn] |
| ---- |
| import com.sun.messaging.xml.MessageTransformer; |
| ---- |
| This is the utility whose methods you use to convert SOAP messages to |
| JMS messages and the reverse. You can then send a JMS message containing |
| a SOAP payload as if it were a normal JMS message. |
| 2. Initialize the `TopicConnectionFactory`, `TopicConnection`, |
| `TopicSession`, and publisher. + |
| [source,oac_no_warn] |
| ---- |
| tcf = new TopicConnectionFactory(); |
| tc = tcf.createTopicConnection(); |
| session = tc.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); |
| topic = session.createTopic(topicName); |
| publisher = session.createPublisher(topic); |
| ---- |
| 3. Construct a SOAP message using the SOAP with Attachments API for |
| Java (SAAJ). + |
| [source,oac_no_warn] |
| ---- |
| /*construct a default soap MessageFactory */ |
| MessageFactory mf = MessageFactory.newInstance(); |
| * Create a SOAP message object.*/ |
| SOAPMessage soapMessage = mf.createMessage(); |
| /** Get SOAP part.*/ |
| SOAPPart soapPart = soapMessage.getSOAPPart(); |
| /* Get SOAP envelope. */ |
| SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); |
| /* Get SOAP body.*/ |
| SOAPBody soapBody = soapEnvelope.getBody(); |
| /* Create a name object. with name space */ |
| /* http://www.sun.com/imq. */ |
| Name name = soapEnvelope.createName("HelloWorld", "hw", |
| "http://www.sun.com/imq"); |
| * Add child element with the above name. */ |
| SOAPElement element = soapBody.addChildElement(name) |
| /* Add another child element.*/ |
| element.addTextNode( "Welcome to GlassFish Web Services." ); |
| /* Create an atachment with activation API.*/ |
| URL url = new URL ("http://java.sun.com/webservices/"); |
| DataHandler dh = new DataHandler (url); |
| AttachmentPart ap = soapMessage.createAttachmentPart(dh); |
| /*set content type/ID. */ |
| ap.setContentType("text/html"); |
| ap.setContentId("cid-001"); |
| /** add the attachment to the SOAP message.*/ |
| soapMessage.addAttachmentPart(ap); |
| soapMessage.saveChanges(); |
| ---- |
| 4. Convert the SOAP message to a JMS message by calling the |
| `MessageTransformer.SOAPMessageintoJMSMessage()` method. + |
| [source,oac_no_warn] |
| ---- |
| Message m = MessageTransformer.SOAPMessageIntoJMSMessage (soapMessage, |
| session ); |
| ---- |
| 5. Publish the JMS message. + |
| [source,oac_no_warn] |
| ---- |
| publisher.publish(m); |
| ---- |
| 6. Close the JMS connection. + |
| [source,oac_no_warn] |
| ---- |
| tc.close(); |
| ---- |
| |
| [[beaov]][[GSDVG00078]][[to-receive-soap-messages-using-the-jms-api]] |
| |
| To Receive SOAP Messages Using the JMS API |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| 1. Import the `MessageTransformer` library. + |
| [source,oac_no_warn] |
| ---- |
| import com.sun.messaging.xml.MessageTransformer; |
| ---- |
| This is the utility whose methods you use to convert SOAP messages to |
| JMS messages and the reverse. The JMS message containing the SOAP |
| payload is received as if it were a normal JMS message. |
| 2. Initialize the `TopicConnectionFactory`, `TopicConnection`, |
| `TopicSession`, `TopicSubscriber`, and Topic. + |
| [source,oac_no_warn] |
| ---- |
| messageFactory = MessageFactory.newInstance(); |
| tcf = new com.sun.messaging.TopicConnectionFactory(); |
| tc = tcf.createTopicConnection(); |
| session = tc.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); |
| topic = session.createTopic(topicName); |
| subscriber = session.createSubscriber(topic); |
| subscriber.setMessageListener(this); |
| tc.start(); |
| ---- |
| 3. Use the `OnMessage` method to receive the message. Use the |
| `SOAPMessageFromJMSMessage` method to convert the JMS message to a SOAP |
| message. + |
| [source,oac_no_warn] |
| ---- |
| public void onMessage (Message message) { |
| SOAPMessage soapMessage = |
| MessageTransformer.SOAPMessageFromJMSMessage( message, |
| messageFactory ); } |
| ---- |
| 4. Retrieve the content of the SOAP message. |
| |
| |