Tag Archives: MQ

How to simulate a MQ server ?

The problem

Our application is retrieving information from a distant server using IBM Websphere Mq messaging system. In production we need to install two MQ servers , one on machine A and another one on machine B:

Creation Fil MQ

We want to avoid installing MQ Server on two machines for the qualification platform. How to simulate machine B ‘s MQ Server ?

The solution

This article will explain several steps taken to simulate the communication between two MQ servers. These are the steps explained :

  • Create a MQ server on machine A
  • Run a Java application on machine B within tomcat which listens to inqueue QueueManager and send back information to Outqueue MQ queue manager
  • Create a MQ server on machine A

    A IBM MQ server is composed of a queue manager, local queues, channels. Channels allow the queues to communicate between each other. Aliases can also be used to give an alias to queues.

    https://wordpress.com/post/julienprog.wordpress.com/1235

    Simulate a MQ server on machine B

    First of all install tomcat on the machine B. The solution is using Java to catch JMS information from our MQ Server on machine A. To simulate the MQ Server these are the steps :

  • Add a listener in web.xml
  • The Java class listener will be launched at tomcat startup.
  • At statup , the listener starts one Thread or multiple ones to listen one or multiples queue managers
  • Let’s assume we have one thread listening to one Queue manager
  • When a Thread is cathing a JMS message, from receiver/in queue of machine A, it will parse the message
  • Based on the parsed message we check a database or filesystem for a DataSet response
  • Finally we send the dataset response to the Out/sender queue of machine A
  • The application in machine A reads the out/sender queue and process it like normal not knowing it is consuming messages from the simulator
  • That’s it : the machine B simulated a MQ Server
  • Add a listener to tomcat web.xml

    <web-app>
    	<display-name>MQ-Sim</display-name>
    
    	<listener>
    		<listener-class>my.com.MQListener</listener-class>
    	</listener>
    
    

    At startup of tomcat the MQlistener will be launched. The thread is started within the listener like this :

    final MqThread mq= new MqThread (mqinfo);
    MqThread .start();
    

    Read MQ configuration detailed from a file

    We need to know to which receiver/in queue we will listen to and which sender/out queue we will send message to.

    Example of properties file containing these information :

    hostname	  = myserver
    port		  = 9999
    queueManager = MYQUEUEMANAGER
    queue.in	  = QUEUE.OUT
    queue.out	  = QUEUE.IN
    

    “queue.in” represents the queue we are lestening to. “queue.out” is the queue we are going to send message to.

    Start a thread listening to a receiver queue

    The MqThread extends Thread class. It contains a run() method which will be executed when the thread is started.

    The MqThread constructor prepares an active connection with the queue manager and the queue receiver and sender in order to communicate with the MQ server .

    
    import javax.jms.QueueConnection;
    ...
    public MqThread (MqInfo mqInfo) throws JMSException {
           
    final MQQueueConnectionFactory queueConnectionFactory = new MQQueueConnectionFactory();
    			queueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
    			queueConnectionFactory.setQueueManager(mqInfo.getQueueManager());
    			queueConnectionFactory.setHostName(mqInfo.getHostname());
    			queueConnectionFactory.setPort(mqInfo.getPort());
    
          queueConnection = queueConnectionFactory.createQueueConnection(mqInfo.user, mqInfo.password);
          queueConnection.start();
          // A QueueConnection object is
          // an active connection to a point-to-point JMS provider.
    
          this.queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
          // A QueueConnection can be used 
          // to create a QueueSession, 
          // from which specialized 
          // queue-related objects can be created
          this.receiver = session.createReceiver(mqInfo.receiverQueue);
          // Creates a QueueReceiver object to receive 
          // messages from the specified queue.
          this.sender = session.createSender(mqInfo.senderQueue);
          // Creates a QueueSender object to send 
          // messages to the specified queue.
    }
    

    More information about QueueConnection
    http://docs.oracle.com/javaee/6/api/javax/jms/QueueConnection.html

    The thread will be listening to MQ receiver queue. When a JMS message is sent to that queue the thread will consume and parse the message.

    public run() {
    
    		this.queueManager = queueManager;
                    while (isThreadTerminated) {
    		    final Message message = receiver.receive(1000);
    		    proccessMessage(message );
                     } 
    }
    

    The run() method is listening to queue receiver to handle messages from this queue.

    Receives the next message that arrives within the specified timeout interval.

    http://docs.oracle.com/javaee/6/api/javax/jms/MessageConsumer.html#receive(long)

    Based on the parsed message we check a database or filesystem for a DataSet response

    Once the message is parsed we can retrieve a DataSet response from a file system. This example is not complet but give an idea what to do :

    
    	private String getDataSetResponse(String inputMessage) {
    
    		final String filename = getFileNameDataSet(inputMessage);
    		return getFile(filename );
    	}
    

    Finally we send the dataset to the Out/sender queue of machine A

    private void sendMessage(String message, String messageId) throws JMSException {
           final TextMessage dataSetMessage = session.createTextMessage(message);
           dataSetMessage.setJMSCorrelationID(messageId);
           dataSetMessage.setJMSMessageID(messageId);
           sender.send(dataSetMessage );
    }
    

    That ‘s it