Examples of Handling Responses from External Systems

In Message Property Correlation, the following steps describe how responses from external systems are handled.

  1. The plug-in populates the message content.

  2. The plug-in sets a property on the outbound JMS message, with name of the value set for correlationproperty in the automationMap.xml file, and a value decided by the business logic. For example, you could use this to correlate on a reference number.

  3. If the value of the correlationproperty in the automationMap.xml file is set to the value JMSCorrelationID, the plug-in is not required to set the property on the outbound message (as described in Step 2). The automation framework does this automatically.

  4. The automation framework saves the message properties set for each message with the event information.

  5. The automation framework sets the replyTo property on the JMS message.

  6. The external system copies the properties on the request message to the response message.

  7. The external system sends the message to the reply queue specified in the automationMap.xml file.

  8. The automation framework uses the configuration in the automationMap.xml file to map messages from external systems to plug-ins. The plug-ins are automators written by system integrators. Configuration of an automator for receiving messages from an external system are defined within Design Studio and saved to the automationMap.xml file.

  9. The automation framework uses the message properties of the response, plus the correlation information saved in step four above, to reload a Context for the response message.

  10. The run method of the external system automator is called and is passed the Context created in step 9.

  11. The automator performs business logic, such as completing the task.

The following example shows a custom automation plug-in that handles and processes response messages from an external system.

 package com.mslv.oms.sample.atm_frame;

 import com.mslv.oms.automation.plugin.*;
 import com.mslv.oms.automation.*;
 import java.rmi.*;

 public class UIMResponseHandler extends AbstractAutomator {

 public void run( String inputXML, AutomationContext task)
 throws AutomationException {

 try {
 TaskContext tctx = (TaskContext)task;

 tctx.completeTaskOnExit( "success" );

 } catch(RemoteException ex){
 throw new AutomationException( ex );
 } catch(AutomationException x ) {
 throw x;
 }
 }
}

This automation plug-in does not need to send JMS messages to any system, so it extends AbstractAutomator and is intended to process Task automation responses, so it casts the Context to a TaskContext then completes the task.

The following example shows what the external system is expected to do for the message property correlation to work.

 public void sendMessage(Message originalMessage) {
 try {
 //
 // Set up the JMS connections
 //
 QueueConnectionFactory connectionFactory = (QueueConnectionFactory)jndiCtx.lookup(connectionFactoryName); 
 QueueConnection queueConnection = connectionFactory.createQueueConnection();
 QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
 Queue replyQueue = (Queue)originalMessage.getJMSReplyTo();
 QueueSender queueSender = queueSession.createSender(replyQueue);

 //
 // Create the message
 //
 TextMessage textMessage = queueSession.createTextMessage(((TextMessage)originalMessage).getText());
 textMessage.setStringProperty("MESSAGE_NAME","ActivationResponse");
 textMessage.setJMSCorrelationID(originalMessage.getJMSCorrelationID());

 //
 // Send the message
 //
 queueSender.send(textMessage, javax.jms.DeliveryMode.PERSISTENT, javax.jms.Message.DEFAULT_PRIORITY, 1800000);

 } catch(javax.jms.JMSException ex){
 ex.printStackTrace();
 } catch(javax.naming.NamingException ex){
 ex.printStackTrace();
 }
 }

The following code snippets from this example show:

  • how the external system chooses which JMS destination to send the reply to.

    Queue replyQueue = (Queue)originalMessage.getJMSReplyTo();
    QueueSender queueSender = queueSession.createSender(replyQueue);
    
  • the external system setting a property that identifies the nature of the JMS message. This implies that the automation was defined with a message property selector select statement that matches these parameters.

    textMessage.setStringProperty("MESSAGE_NAME","ActivationResponse");
    
  • the external system echoing the correlation information onto the reply message. This implies that the automation was defined to correlate based on JMSCorrelationID.

    textMessage.setJMSCorrelationID(originalMessage.getJMSCorrelationID());