Showing posts with label JMS. Show all posts
Showing posts with label JMS. Show all posts

Sunday, June 26, 2016

[IBM MQ] Create a topic using IBM MQ

Hi all,

I am configuring integration scenario of IBM MQ with WSO2 ESB. In particular scenario, used IBM MQ 8.0.0.2 and ESB 5.0.0 in the windows environment (Oracle JDK 1.8).

If you need to understand the installation mechanism from the first step, you can follow this blog post. 

Assumption: You have configured ESB with IBM MQ for Queues.

Let's begin creating a topic in IBM MQ.

1. Open IBM MQ UI (Websphere Installation1 window) through administrative mode.

How to do that ?
  • Go to window start button and search for Websphere
  • Right click on icon and  click on "Run as Administrator"
2. Create a Topic under Queue Manger





3. Add Destination




Note: Give the "Topic string" (Which was defined when creating the Topic) as the Topic in next window. (Refer next screen shot)


4. Create Topic Connection Factory if you don't specify previous connection factories as Topic Connection Factory/ Connection Factory (General term for both topics and queues)






You are done with Topic Configuration. When you are going to subscribe to Topic from external clients (Ex: ESB) you can see those subscriptions through "Subscription panel"



Happy Coding ... :)

Saturday, June 25, 2016

[WSO2][ESB Cluster] HornetQ host configuration when connecting to a cluster

When we are going to use HornetQ with  cluster environment (Ex: ESB Cluster), have to configure HorentQ hosts. If not HornetQ will not identify exact configuration.

In HornetQ run.sh script ($HorenetQ_Home/bin/) update as follows:

# Use the following line to run with different ports
#export CLUSTER_PROPS="-Djnp.port=1099 -Djnp.rmiPort=1098 -Djnp.host=localhost -Dhornetq.remoting.netty.host=localhost -Dhornetq.remoting.netty.port=5445"

Uncomment above line and update relevant parameters.

# Use the following line to run with different ports
export CLUSTER_PROPS="-Djnp.port=1099 -Djnp.rmiPort=1098 -Djnp.host=10.100.7.120 -Dhornetq.remoting.netty.host=localhost -Dhornetq.remoting.netty.port=5445"

** Update -Djnp.port and -Djnp.host with relevant values. -Djnp.host should be the IP/host_name of an instance which HornetQ installed.


ActiveMQ Tips

How to change the default port of Active MQ ?

1. Go to activemq.xml ($ActiveMQ_Home/conf/)

2. Edit openwire port

<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

By default, 61616 is port of Active MQ. You can give whatever the port you want.


Login to Active MQ dashboard 

In Active MQ, there is a web dashboard which will display every detail of topics/queues created within active mq broker. You can access to that using following url (using any browser)
  • http://<ip>: 8161
          Ex: http://localhost:8161/


Default username and password for Active MQ
  • When accessing active MQ you may not need any password unless you add it through the installation process.
  • When you login to web console (even though you did not add any password/ username), you will have to provide username and password. 
  • Use username: admin and password: admin

General JMS parameter values for Active MQ
  • java.naming.factory.initial : org.apache.activemq.jndi.ActiveMQInitialContextFactory
  • java.naming.provider.url : tcp://localhost:61616  (Note: if you are calling remote active mq broker, you should add relevant ip/host name instead of "localhost")

 Integration with WS02 ESB

  •  If you are going to configure Active MQ with WSO2 ESB, you can refer WSO2 documentations.
  • But you have to remember about the version of client jars you are going to put into ESB. Even though you are using active MQ which has higher version than 5.8, you have to put Active MQ 5.8 client jars
Client Libraries:
  • activemq-broker-5.8.0.jar
  • activemq-client-5.8.0.jar
  • geronimo-jms_1.1_spec-1.1.1.jar
  • geronimo-j2ee-management_1.1_spec-1.0.1.jar

Welcome all value additions regarding Active MQ :) 



[IBM MQ] How to make a remote connection through WSO2 ESB


Hi all,

This blog post about creating a remote connection to the IBM MQ which is located in a remote server. To do that, you have to have IBM MQ installed in remote server. For IBM MQ installation you can refer this blog post.

Let's remotely connect to IBM MQ ...

Environment : IBM MQ Version 8.0.0.2 installed in Windows 2012 R2 server
                        Client is WSO2 ESB 5.0.0 installed in ubuntu 15.10

Steps to connect:
  • First, you have to take .bindings file you used (Which is in jndiDirectory)
  • Add .bindings file in to a local file directory (Ex: /home/dilshani/Dev/jndiDirectory)
  • Edit .bindings file 
** Open .bindings file using text editor and replace all places having "localhost" with relevant IP of the server which is installed IBM MQ.
  • Add client jars into [ESB_HOME]/repository/components/lib folder   
* com.ibm.mq.allclient 
* fscontext
* jms
* providerutil

** You can find these jars inside the java folder in IBM MQ installation file directory (Ex: C:/)
  •  Remove following line from $ESB_HOME/repository/conf/etc/launch.ini. 
                            javax.jms,\
  • Add WSO2 ESB axis2.xml configs related to JMS transport (You may find axis2.xml file in [ESB_HOME]/repository/conf/axis2/)
Sample Configs:

 <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">  
   <parameter name="default" locked="false">  
   <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>  
   <parameter name="java.naming.provider.url" locked="false">file:///home/centos/esb/jndiDirectory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">myTopicConnectionFactory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>  
   <parameter name="transport.jms.Destination" locked="false">testTopic</parameter>  
   <parameter name="transport.jms.DestinationType" locked="false">topic</parameter>  
   <parameter name="transport.jms.UserName" locked="false">administrator</parameter>  
   <parameter name="transport.jms.Password" locked="false">wso2321#qa</parameter>  
  </parameter>  
  <parameter name="myQueueConnectionFactory1" locked="false">  
   <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>  
   <parameter name="java.naming.provider.url" locked="false">file:///home/centos/esb/jndiDirectory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">myQueueConnectionFactory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>  
   <parameter name="transport.jms.UserName" locked="false">administrator</parameter>  
   <parameter name="transport.jms.Password" locked="false">wso2321#qa</parameter>  
   <parameter name="transport.jms.Destination">LocalQueue1</parameter>  
  </parameter>  
  <parameter name="myTopicConnectionFactory1" locked="false">  
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>  
   <parameter name="java.naming.provider.url" locked="false">file:///home/centos/esb/jndiDirectory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">myTopicConnectionFactory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>  
   <parameter name="transport.jms.DestinationType" locked="false">topic</parameter>  
   <parameter name="transport.jms.UserName" locked="false">administrator</parameter>  
   <parameter name="transport.jms.Destination">testTopic</parameter>  
   <parameter name="transport.jms.Password" locked="false">wso2321#qa</parameter>  
  </parameter>  
 </transportReceiver>  

And also you have to add transport sender configurations too.

 <transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">  
   <parameter name="default" locked="false">  
   <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>  
   <parameter name="java.naming.provider.url" locked="false">file:///home/centos/esb/jndiDirectory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">myTopicConnectionFactory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>  
   <parameter name="transport.jms.Destination" locked="false">testTopic</parameter>  
   <parameter name="transport.jms.DestinationType" locked="false">topic</parameter>  
   <parameter name="transport.jms.UserName" locked="false">administrator</parameter>  
   <parameter name="transport.jms.Password" locked="false">wso2321#qa</parameter>  
  </parameter>  
  <parameter name="myQueueConnectionFactory1" locked="false">  
   <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>  
   <parameter name="java.naming.provider.url" locked="false">file:///home/centos/esb/jndiDirectory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">myQueueConnectionFactory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>  
   <parameter name="transport.jms.UserName" locked="false">administrator</parameter>  
   <parameter name="transport.jms.Password" locked="false">wso2321#qa</parameter>  
   <parameter name="transport.jms.Destination">LocalQueue1</parameter>  
  </parameter>  
  <parameter name="myTopicConnectionFactory1" locked="false">  
   <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>  
   <parameter name="java.naming.provider.url" locked="false">file:///home/centos/esb/jndiDirectory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">myTopicConnectionFactory</parameter>  
   <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>  
   <parameter name="transport.jms.DestinationType" locked="false">topic</parameter>  
   <parameter name="transport.jms.UserName" locked="false">administrator</parameter>  
   <parameter name="transport.jms.Destination">testTopic</parameter>  
   <parameter name="transport.jms.Password" locked="false">wso2321#qa</parameter>  
  </parameter>  
 </transportSender>  
  • Start ESB server and it will create JMS connection.

** Note: If you get any error, please take following steps to solve the issue.
  •  Ping the server and see whether it can be reach
Ex:
       ping <serever ip>
  • Telenet the port and see whether it open to connect
Ex:
       telnet <server-ip> <port>
  • Restart the IBM MQ 
** Check whether "channel" is inactive and .bindings file connected. (You can do it via IBM MQ UI)

Thursday, June 9, 2016

[WSO2][ESB][JMS] Local Transactionality Sample

Hi all,

Let's consider about JMS Transport parameter [1] "jms.transport.transactionality" sample. In here I use local transactionality.

When it's comes to transactionality, it helps to establish reliability message transformation. We can use tranactions and roll back them when having any issue/error. Within WSO2 ESB, it supports main two type of transactios through JMS Transport. Those are local and jta.

Local transactions use basically for locally used wso2 ESB instances while jta using for distributed systems. JTA transactions may engage with distributed system having clusters of esb which adding data to database etc.

Lets take a simple example of local tranactions which will roll back transaction in a failure. Lets' begin...

Rrerequisite:

1. Message broker should be up and running (Ex: wso2 MB)

2. ESB should be configured with relevant message broker. Add "transport.Transactionality" parameter and "transport.jms.SessionTransacted" parameter.

Sample axis2.xml Configuration:

 <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">   
  <parameter name="myTopicConnectionFactory" locked="false">   
     <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>   
     <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>    
     <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
     <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>  
     <parameter name="transport.jms.Transactionality" locked="true">local</parameter>   
     <parameter name="transport.jms.SessionTransacted" locked="true">true</parameter>  
     <parameter>   

    <parameter name="myQueueConnectionFactory" locked="false">   
     <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>   
     <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>   
     <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>   
     <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>   
     <parameter name="transport.jms.Transactionality" locked="true">local</parameter>   
     <parameter name="transport.jms.SessionTransacted" locked="true">true</parameter>   
    </parameter>       

    <parameter name="default" locked="false">   
     <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>   
     <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>   
     <<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>   
     <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>   
     <parameter name="transport.jms.Transactionality" locked="true">local</parameter>   
     <parameter name="transport.jms.SessionTransacted" locked="true">true</parameter>   
    </parameter>   
   </transportReceiver>   


3. ESB should be up and running.

4. Axis2 server should be started in port 9000

Sample:

Create a proxy with following configuration: (For proxy insequence and fault sequence, I created two seperate sequences )

 <proxy name="ErrorProxy" startOnLoad="true" transports="https http jms">  
     <target faultSequence="fault" inSequence="ErrorInSequence"/>  
     <parameter name="transport.jms.ContentType">  
       <rules>  
         <jmsProperty>contentType</jmsProperty>  
         <default>text/xml</default>  
       </rules>  
     </parameter>  
     <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>  
     <parameter name="transport.jms.DestinationType">queue</parameter>  
     <parameter name="transport.jms.SessionTransacted">true</parameter>  
     <parameter name="transport.jms.Destination">errorQueue</parameter>  
   </proxy>  

Error Sequence Configuration:

  <sequence name="fault">  
     <log level="full"/>  
     <property name="SET_ROLLBACK_ONLY" scope="axis2" value="true"/>  
   </sequence>  

Insequence Configuration:

   <sequence name="ErrorInSequence">  
     <call blocking="true">  
       <endpoint>  
         <address uri="http://localhost:9000/services/SimpleStockQuoteService"/>  
       </endpoint>  
     </call>  
     <description/>  
   </sequence>  

Running Sample:

* Publish messages to queue (errorQueue) in Message Broker. I used external jms message publisher.

External JMS Publisher Java Class:

 import javax.jms.*;  
 import javax.naming.Context;  
 import javax.naming.InitialContext;  
 import javax.naming.NamingException;  
 import java.util.Properties;  
 /**  
  * Created by dilshani on 5/11/16.  
  * This class will publish messages to MB Queue  
  */  
 public class QueuePublisher {  
   public static final String QPID_ICF = "org.wso2.andes.jndi.PropertiesFileInitialContextFactory";  
   private static final String CF_NAME_PREFIX = "connectionfactory.";  
   private static final String QUEUE_NAME_PREFIX = "queue.";  
   private static final String CF_NAME = "qpidConnectionfactory";  
   String userName = "admin";  
   String password = "admin";  
   private static String CARBON_CLIENT_ID = "carbon";  
   private static String CARBON_VIRTUAL_HOST_NAME = "carbon";  
   private static String CARBON_DEFAULT_HOSTNAME = "localhost";  
   private static String CARBON_DEFAULT_PORT = "5672";  
   String queueName = "QueueProxy";  
   int publishMsgCount=1;  
   public static void main(String[] args) throws NamingException, JMSException {  
     QueuePublisher queueSender = new QueuePublisher();  
     queueSender.sendMessages();  
   }  
   public void sendMessages() throws NamingException, JMSException {  
     Properties properties = new Properties();  
     properties.put(Context.INITIAL_CONTEXT_FACTORY, QPID_ICF);  
     properties.put(CF_NAME_PREFIX + CF_NAME, getTCPConnectionURL(userName, password));  
     properties.put(QUEUE_NAME_PREFIX + queueName, queueName);  
     Properties properties2 = new Properties();  
     properties2.put(Context.INITIAL_CONTEXT_FACTORY, QPID_ICF);  
     properties2.put(CF_NAME_PREFIX + CF_NAME, getTCPConnectionURL(userName, password));  
     System.out.println("getTCPConnectionURL(userName,password) = " + getTCPConnectionURL(userName, password));  
     InitialContext ctx = new InitialContext(properties);  
     // Lookup connection factory  
     QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup(CF_NAME);  
     QueueConnection queueConnection = connFactory.createQueueConnection();  
     queueConnection.start();  
     QueueSession queueSession = queueConnection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE );//  
     Queue queue = (Queue)ctx.lookup(queueName);  
     javax.jms.QueueSender queueSender = queueSession.createSender(queue);  
     //sending 5 messages to the above created queue here  
     for(Integer i=1;i<=publishMsgCount;i=i+1){  
       TextMessage textMessage = queueSession.createTextMessage("::::Test Message:::: "+i+":::Publish to queue:::"+queueName+":::From IP:::"+CARBON_DEFAULT_HOSTNAME);  
       textMessage.setStringProperty("msgID", i.toString());  
       queueSender.send(textMessage);  
       System.out.println("Publishing Test Message "+i+"::Published From IP::"+CARBON_DEFAULT_HOSTNAME);  
     }  
     queueSender.close();  
     queueSession.close();  
     queueConnection.close();  
   }  
   public String getTCPConnectionURL(String username, String password) {  
     // amqp://{username}:{password}@carbon/carbon?brokerlist='tcp://{hostname}:{port}'  
     return new StringBuffer()  
         .append("amqp://").append(username).append(":").append(password)  
         .append("@").append(CARBON_CLIENT_ID)  
         .append("/").append(CARBON_VIRTUAL_HOST_NAME)  
         .append("?brokerlist='tcp://").append(CARBON_DEFAULT_HOSTNAME).append(":").append(CARBON_DEFAULT_PORT).append("'")  
         .toString();  
   }  
 }  

* You may see response from backend (Axis2 server on port 9000)

* Shut down axis 2 server and Publish messages to jms queue.

* Check ESB server terminal. It may print error sequence log several times. (Which is trying to rollback the transaction)

Note : As its' rollback transaction, message will be send to jms queue. But again it will be taken from proxy as it listen to that and will try to send. Then again move to fault sequence and it will be working like a round. (Untill time out)

Now you have a working sample of ESB local transactionality.


Tuesday, May 24, 2016

HornetQ JMS Subscriber

Hi all,

HornetQ is a JMS broker which is support JMS 2.0 specification. Here you can find a JMS subscriber written for queue within HornetQ.

 import javax.jms.*;  
 import javax.naming.Context;  
 import javax.naming.InitialContext;  
 import java.util.Properties;  
 /**  
  * This is a hornetq subscriber java class for a queue  
  */  
 public class HornetQSubscriber {  
   private static final String DEFAULT_CONNECTION_FACTORY = "QueueConnectionFactory";  //TopicConnectionFactory when using for topics
   private static final String DEFAULT_DESTINATION = "queue/mySampleQueue";  //Can change when it is a topic
   private static final String INITIAL_CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory";  
   private static final String PROVIDER_URL = "jnp://localhost:1099";  
   public static void main(final String[] args) {  
     try {  
       runExample();  
     } catch (Exception e) {  
       e.printStackTrace();  
     }  
   }  
   public static void runExample() throws Exception {  
     Connection connection = null;  
     Context initialContext = null;  
     try {  
       // /Step 1. Create an initial context to perform the JNDI lookup.  
       final Properties env = new Properties();  
       env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);  
       env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, PROVIDER_URL));  
       initialContext = new InitialContext(env);  
       // Step 2. perform a lookup on the Queue  
       Queue queue = (Queue) initialContext.lookup(DEFAULT_DESTINATION);  
       // Step 3. perform a lookup on the Connection Factory  
       ConnectionFactory cf =  
           (ConnectionFactory) initialContext.lookup(DEFAULT_CONNECTION_FACTORY);  
       // Step 4. Create a JMS Connection  
       connection = cf.createConnection();  
       // Step 5. Create a JMS Session  
       Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);  
       // Step 6. Create a JMS Message Consumer  
       MessageConsumer messageConsumer =  
           session.createConsumer(queue);  
       // Step 7. Start the Connection  
       connection.start();  
       System.out.println("Message consumer started on Queue: " + DEFAULT_DESTINATION +  
           "\n");  
       // Step 8. Receive the message  
       int message_count=0;  
       while (messageConsumer.receive()!=null) {  
         message_count++;  
         System.out.println("Received a message ------------"+message_count);  
       }  
     } finally {  
       // Step 9. Close JMS resources  
       if (connection != null) {  
         connection.close();  
       }  
       // Also the initialContext  
       if (initialContext != null) {  
         initialContext.close();  
       }  
     }  
   }  
 }  

* Note : you can modify class when you are going to publish JMS messages to topics. Relevant places are highlighted within the class.

Wednesday, May 11, 2016

How to write a JMS publisher for queue in WSO2 MB ?

Hello all,

We are gonna write a JMS publisher for queue WSO2 MB. Let's begin ...

Prerequisites:
  • WSO2 MB pack should be downloaded.
  • MB should be up and running (You can follow WSO2 MB documentation, if you are not familiar with MB) 
  • Java should be installed (As we implement JMS publisher as a Java Class)
Environment used:
  • Oracle jdk 1.8
  • MB 3.1.0
  • IDEA as 
JMS Publisher class:

 import javax.jms.*;  
 import javax.naming.Context;  
 import javax.naming.InitialContext;  
 import javax.naming.NamingException;  
 import java.util.Properties;  
 /**  
  * This class will publish messages to MB Queue  
  */  
 public class QueuePublisher {  
   public static final String QPID_ICF = "org.wso2.andes.jndi.PropertiesFileInitialContextFactory";  
   private static final String CF_NAME_PREFIX = "connectionfactory.";  
   private static final String QUEUE_NAME_PREFIX = "queue.";  
   private static final String CF_NAME = "qpidConnectionfactory";  
   String userName = "admin";  
   String password = "admin";  
   private static String CARBON_CLIENT_ID = "carbon";  
   private static String CARBON_VIRTUAL_HOST_NAME = "carbon";  
   private static String CARBON_DEFAULT_HOSTNAME = "localhost";  
   private static String CARBON_DEFAULT_PORT = "5672";  
   String queueName = "JMSProxy";  //Change this with relevant queue name
   int publishMsgCount=5;  
   public static void main(String[] args) throws NamingException, JMSException {  
     QueuePublisher queueSender = new QueuePublisher();  
     queueSender.sendMessages();  
   }  
   public void sendMessages() throws NamingException, JMSException {  
     Properties properties = new Properties();  
     properties.put(Context.INITIAL_CONTEXT_FACTORY, QPID_ICF);  
     properties.put(CF_NAME_PREFIX + CF_NAME, getTCPConnectionURL(userName, password));  
     properties.put(QUEUE_NAME_PREFIX + queueName, queueName);  
     Properties properties2 = new Properties();  
     properties2.put(Context.INITIAL_CONTEXT_FACTORY, QPID_ICF);  
     properties2.put(CF_NAME_PREFIX + CF_NAME, getTCPConnectionURL(userName, password));  
     System.out.println("getTCPConnectionURL(userName,password) = " + getTCPConnectionURL(userName, password));  
     InitialContext ctx = new InitialContext(properties);  
     // Lookup connection factory  
     QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup(CF_NAME);  
     QueueConnection queueConnection = connFactory.createQueueConnection();  
     queueConnection.start();  
     QueueSession queueSession = queueConnection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE );//  
     Queue queue = (Queue)ctx.lookup(queueName);  
     javax.jms.QueueSender queueSender = queueSession.createSender(queue);  
     //sending 5 messages to the above created queue here  
     for(Integer i=1;i<=publishMsgCount;i=i+1){  
       TextMessage textMessage = queueSession.createTextMessage("::::Test Message:::: "+i+":::Publish to queue:::"+queueName+":::From IP:::"+CARBON_DEFAULT_HOSTNAME);  
       textMessage.setStringProperty("msgID", i.toString());  
       queueSender.send(textMessage);  
       System.out.println("Publishing Test Message "+i+"::Published From IP::"+CARBON_DEFAULT_HOSTNAME);  
     }  
     queueSender.close();  
     queueSession.close();  
     queueConnection.close();  
   }  
   public String getTCPConnectionURL(String username, String password) {  
     // amqp://{username}:{password}@carbon/carbon?brokerlist='tcp://{hostname}:{port}'  
     return new StringBuffer()  
         .append("amqp://").append(username).append(":").append(password)  
         .append("@").append(CARBON_CLIENT_ID)  
         .append("/").append(CARBON_VIRTUAL_HOST_NAME)  
         .append("?brokerlist='tcp://").append(CARBON_DEFAULT_HOSTNAME).append(":").append(CARBON_DEFAULT_PORT).append("'")  
         .toString();  
   }  
 }  


** For this java class you have to add client libraries as dependencies. You can find relevant jars from $MB_HOME/client-lib/

Add all these jars as dependencies.
  • andes-client-3.1.1.jar
  • geronimo-jms_1.1_spec-1.1.0.wso2v1.jar
  • log4j-1.2.13.jar
  • org.wso2.carbon.logging-4.4.1.jar
  • org.wso2.securevault-1.0.0-wso2v2.jar
  • slf4j-1.5.10.wso2v1.jar
You are successfully done with JMS publisher. Add a queue in MB which you want to publish messages and add that name in the JMS publisher class.

(Note: In here I used "JMSProxy" queue to publish messages.)

Saturday, March 26, 2016

Adding JMS Message Store with HornetQ Broker

1) Download HornetQ Broker : http://hornetq.jboss.org/downloads.html

2) Configure HornetQ:

  • Go to HornetQ_Home/config/stand-alone/non-clustered/
  • You will find hornetq_jms.xml
  • Change it as follows:

Note: This will create queue connection factory, topic connection factory and a queue. Queue will be used as storing place for JMS message store.

 <connection-factory name="QueueConnectionFactory">  
    <xa>false</xa>  
    <connectors>  
      <connector-ref connector-name="netty"/>  
    </connectors>  
    <entries>  
      <entry name="/QueueConnectionFactory"/>  
    </entries>  
 </connection-factory>  
 <connection-factory name="TopicConnectionFactory">  
    <xa>false</xa>  
    <connectors>  
      <connector-ref connector-name="netty"/>  
    </connectors>  
    <entries>  
      <entry name="/TopicConnectionFactory"/>  
    </entries>  
 </connection-factory>  
 <queue name="wso2">  
    <entry name="/queue/mySampleQueue"/>  
 </queue>  


3) Configure ESB: 

  • Go to ESB_Home/repository/components/lib/
  • Add hornetq-all.jar: https://docs.google.com/a/wso2.com/file/d/0B_g60lAUxtLhd2RmZXJWUVkwWXM/edit
  • Go to ESB_Home/repository/conf/axis2/
  • You will find axis2.xml
  • Change it as follows:

Uncomment follow line:

 <transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>  

Add these lines:

 <transportReceiver name="jms"  
  class="org.apache.axis2.transport.jms.JMSListener">  
  <parameter name="myTopicConnectionFactory" locked="false">  
  <parameter name="java.naming.factory.initial" locked="false">org.jnp.interfaces.NamingContextFactory</parameter>  
  <parameter name="java.naming.factory.url.pkgs" locked="false">org.jboss.naming:org.jnp.interfaces</parameter>  
  <parameter name="java.naming.provider.url" locked="false">jnp://localhost:1099</parameter>  
  <parameter name="transport.jms.ConnectionFactoryJNDIName"  
   locked="false">TopicConnectionFactory</parameter>  
  <parameter name="transport.jms.ConnectionFactoryType"  
   locked="false">topic</parameter>  
  </parameter>  
  <parameter name="myQueueConnectionFactory" locked="false">  
  <parameter name="java.naming.factory.initial" locked="false">org.jnp.interfaces.NamingContextFactory</parameter>  
  <parameter name="java.naming.factory.url.pkgs" locked="false">org.jboss.naming:org.jnp.interfaces</parameter>  
  <parameter name="java.naming.provider.url" locked="false">jnp://localhost:1099</parameter>  
  <parameter name="transport.jms.ConnectionFactoryJNDIName"  
   locked="false">QueueConnectionFactory</parameter>  
  <parameter name="transport.jms.ConnectionFactoryType"  
   locked="false">queue</parameter>  
  </parameter>  
  <parameter name="default" locked="false">  
  <parameter name="java.naming.factory.initial" locked="false">org.jnp.interfaces.NamingContextFactory</parameter>  
  <parameter name="java.naming.factory.url.pkgs" locked="false">org.jboss.naming:org.jnp.interfaces</parameter>  
  <parameter name="java.naming.provider.url" locked="false">jnp://localhost:1099</parameter>  
  <parameter name="transport.jms.ConnectionFactoryJNDIName"  
   locked="false">QueueConnectionFactory</parameter>  
  <parameter name="transport.jms.ConnectionFactoryType"  
   locked="false">queue</parameter>  
  </parameter>  
 </transportReceiver>  

  • You have to change JNDI properties of ESB
  • Go to ESB_HOME/repository/conf
  • And you will find jndi.properties file. Open and edit it. Add following line:
 connectionfactory.QueueConnectionFactory = jnp://localhost:1099  

Note: if you need you can also add queues and topics here.

4) Start HornetQ (HornetQ_home/bin)

 sudo ./run.sh  

5) Start ESB server (ESB_Home/bin)

 sh wso2server.sh  

6) Go to management console (https://<IP>:9443/carbon/admin/login.jsp)

7) Go to message stores (Home > Manage > Service Bus > Message Stores)

8) Add JMS message store (Add message stores > Add JMS message store)

9) Give relevant details to add message store

  • Name: As you want
  • Initial Context Factory: org.jnp.interfaces.NamingContextFactory
  • Provider URL: jnp://localhost:1099
  • JNDI Queue Name: queue/mySampleQueue
    Add other details accordingly. 

Note: Remember to remove user name and password. If you are using them, you have to configure HornetQ with that username and password.

10) Click "Save". Then your JMS message store will be created.

Yea, You may feel like "Tadaaa". But for me, it took long time to figure this out ;) 

Happy coding :)