JMS supports two models for messaging as follows:
...
There are many business use cases that can be implemented using the publisher-subscriber pattern. For example, consider a blog with subscribed readers. The blog author posts a blog entry, which the subscribers of that blog can view. In other words, the blog author publishes a message (the blog post content) and the list of subscribers (the blog readers) receive that message. Popular publisher/subscriber patterns like these can be implemented using JMS topics, as described in the following sections.
...
In this sample scenario, we create a JMS Topic in a broker server such as ActiveMQ or the WSO2 Message Broker (MB) and then add a subscriber and a publisher as proxy services that act as the publisher and subscribers in WSO2 ESB. The diagram below depicts the sample scenario with WSO2 MB.
This example assumes you have already downloaded and installed WSO2 ESB (see Getting Started).
Configuring the broker server
...
Configuring WSO2 ESB as a subscriber
Follow these steps to configure WSO2 ESB as a JMS topic subscriber.
...
For this example, we will use ActiveMQ as our broker server. Follow the instructions in Configure with ActiveMQ to set up ActiveMQ for use with WSO2 ESB.
Configuring the publisher
Open the
<ESB_HOME>/repository/conf/JNDI.properties
file and point to the running broker server. This file specifies specify the JNDI designation of the topic that the proxy service will be subscribed to. A topic with the name SimpleStockQuoteService will be used in the scenario(in this example,SimpleStockQuoteService
). For example:Code Block # register some connection factories # connectionfactory.[jndiname] = [ConnectionURL] connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5673' connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5673' # register some queues in JNDI using the form # queue.[jndiName] = [physicalName] queue.MyQueue = example.MyQueue # register some topics in JNDI using the form # topic.[jndiName] = [physicalName] topic.MyTopic = example.MyTopic topic.SimpleStockQuoteService = SimpleStockQuoteService
Add the proxy service to the ESB to configure it as a subscriber Next, add a proxy service named
StockQuoteProxy
and configure it to publish to the topicSimpleStockQuoteService
.
You can add the proxy service to the ESB in using the management console by choosing , either by building the proxy service in the design view or by copying the XML configuration in into the source view. Alternatively, you can add an XML file named SimpleStockQuoteServiceStockQuoteProxy.xml
to<ESB_HOME>/repository/deployment/server/synapse-configs/default/proxy-services
. A sample XML code segment that defines the proxy service is given below. . Notice that the address URI specifies properties for configuring the JMS transport.Code Block language html/xml <proxy<definitions xmlns="http://ws.apache.org/ns/synapse"> <proxy name="StockQuoteProxy" transports="http" startOnLoad="true" trace="disable"> <target> <endpoint> <address uri="jms:/SimpleStockQuoteService?transport.jms.ConnectionFactoryJNDIName=TopicConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=topic"/> </endpoint> <inSequence> <property name="OUT_ONLY" value="true"/> </inSequence> <outSequence> <send/> </outSequence> </target> </proxy> </definitions>
Info If you are using the source view in the management console, you must use '&' instead of '&' in endpoint URLs, as shown in the example above. If you are saving this proxy service configuration as an XML file in the
proxy-services
directory, use '&' instead.
Configuring the subscribers
Next, you configure two proxy services that subscribe to the JMS topic SimpleStockQuoteService
, so that whenever this topic receives a message, it is sent to these subscribing proxy services. Following is the sample configuration for these proxy services.
Code Block | ||
---|---|---|
| ||
<definitions xmlns="http://ws.apache.org/ns/synapse"> <proxy name="SimpleStockQuoteService1" transports="jms" startOnLoad="true" trace="disable"> <description/> <target> <inSequence> <property name="OUT_ONLY" value="true"/> <log level |
...
="custom"> <property name="Subscriber1" value="I am Subscriber1"/> </log> <drop/> </inSequence> <outSequence> <send/> </outSequence> </target> <parameter name="transport.jms.ContentType"> <rules> <jmsProperty>contentType</jmsProperty> <default>application/xml</default> </rules> </parameter> <parameter name="transport.jms.ConnectionFactory">myTopicConnectionFactory</parameter> <parameter name="transport.jms.DestinationType">topic</parameter> <parameter name="transport.jms.Destination">SimpleStockQuoteService</parameter> </proxy> |
...
Whenever the topic SimpleStockQuoteService receives a message, it is delivered to this proxy service, since the proxy is subscribed to that topic. This proxy service simply logs the message and drops it.
...
Start the ESB with one of the following commands:
<ESB_HOME>/bin/wso2server.sh
(on Linux)<MB_HOME>/bin/wso2server.bat
(on Windows)
A log message similar to the following will be printed on successful subscription.
Code Block |
---|
INFO {org.wso2.andes.server.store.CassandraMessageStore} - Created Topic : SimpleStockQuoteService INFO {org.wso2.andes.server.store.CassandraMessageStore} - Registered Subscription tmp_127_0_0_1_44759_1 for Topic SimpleStockQuoteService |
Now you have a JMS topic in the broker server and a subscriber service in the ESB. To complete the scenario, you need to configure a topic publisher.
Configuring WSO2 ESB as a publisher
To create another proxy service as a topic publisher, add the following proxy service configuration to the ESB.
Code Block | ||
---|---|---|
| ||
<proxy xmlns="http://ws.apache.org/ns/synapse" name="StockQuoteProxy" transports="http" statistics="disable" trace="disable" startOnLoad="true"> <target> <proxy name="SimpleStockQuoteService2" transports="jms" startOnLoad="true" trace="disable"> <description/> <target> <inSequence> <property name="OUT_ONLY" value="true"/> <log level="custom"> <inSequence> <property name="OUT_ONLYSubscriber2" value="true"/I am Subscriber2"/> </log> <drop/> </inSequence> <outSequence> <send/> </outSequence> <endpoint> </target> <parameter <address uriname="jms:/SimpleStockQuoteService?transport.jms.ConnectionFactoryJNDIName=TopicConnectionFactory&java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&java.naming.provider.url=repository/conf/jndi.properties&ContentType"> <rules> <jmsProperty>contentType</jmsProperty> <default>application/xml</default> </rules> </parameter> <parameter name="transport.jms.ConnectionFactory">myTopicConnectionFactory</parameter> <parameter name="transport.jms.DestinationType=topic">topic</>parameter> </endpoint> <parameter </target>name="transport.jms.Destination">SimpleStockQuoteService</parameter> <description><</description>proxy> </proxy> |
Info | ||
---|---|---|
| ||
If you are using the source view in the management console, replace the '&' character of the above JMS endpoint URL with '&' |
...
definitions> |
Publishing to the topic
Start the ESB with one of the following commands:
<ESB_HOME>/bin/wso2server.sh
(on Linux)<MB_HOME>/bin/wso2server.bat
(on Windows)
A log message similar to the following will appear:
Code Block INFO {org.wso2.andes.server.store.CassandraMessageStore} - Created Topic : SimpleStockQuoteService INFO {org.wso2.andes.server.store.CassandraMessageStore} - Registered Subscription tmp_127_0_0_1_44759_1 for Topic SimpleStockQuoteService
To invoke the publisher,
...
use the
...
sample
stockquote
client service by navigating to<ESB_HOME>/samples/axis2Client
and
...
running the following command:
...
Code Block ant stockquote -Daddurl=http://localhost:8280/services/StockQuoteProxy -Dmode=placeorder -Dsymbol=MSFT
The message flow is executed as follows:
...
When the
stockquote
client sends the message to the StockQuoteProxy service, the publisher
will get is invoked and
send sends the message to the JMS topic.
- The topic
then - delivers the message to all the subscribers of that topic. In this case, the
subscriber is another - subscribers are ESB proxy
service- services.
Info |
---|
This sample uses only the ESB as the publisher and subscriber, although there There can be many types of publishers and subscribers for a given JMS topic. The following article in the WSO2 library provides more information on different types of publishers and subscribers: http://wso2.org/library/articles/2011/12/wso2-esb-example-pubsub-soa. |