通过异步消息整合 ILOG JRules 和 WebSphere Process Server4

7. 单击 References 标签,配置 IlrRuleExecutionEJB 的资源引用。将 ResourceRef eis/XUConnectionFactory 的 JNDI 名字设为 eis/XUConnectionFactoryResourceRef jms/BRESQueueConnectionFactory 的 JNDI 名字为 jms/BRESQueueConnectionFactory

图 23. 配置 JRules MDB 的资源引用

8. 然后输出 EAR。

图 24. 输出 ear

9. 将 EAR 文件部署到安装 JRules 执行服务器的应用程序服务器。完成 EAR 部署之后,在管理控制台启用它。

现在 JRules 服务就准备好被调用了。

客户机开发

客户机应用程序可以直接使用 JMS APIs 或者 JMS/MQ JMS 绑定来调用部署在服务器端的 JRules MDB。它向服务集成总线或者JRules MDB 正在监听的 WebSphere MQ 的请求队列发送 JMS 消息,然后从响应队列中获取结果。

在 POJO 中使用 JMS APIs 调用 JRules MDB

您可以直接使用 POJO 组件中的 JMS APIs 来调用 JRules MDB。这个界面可以使单向的或者请求-响应。

1. 使客户能够定位连接工厂和队列:

清单 2. 定位连接工厂和队列

 

//Locate the connection factory and queues

InitialContext ctx = new InitialContext();

QueueConnectionFactory queueConnectionFactory =

(QueueConnectionFactory) ctx.lookup(“jms/BRESQueueConnectionFactory”);

Queue queueIn = (Queue) ctx.lookup( “jms/BRESQueueIn”);

Queue queueOut = (Queue) ctx.lookup(“jms/BRESQueueOut”);

 

//Get the client to create the queue connection and session

QueueConnection queueConnection =

queueConnectionFactory.createQueueConnection(“”,””);

QueueSession queueSessionJMSTx = queueConnection.createQueueSession(true, 0);

 

2. 让客户创建一个发送端,然后就向 JRules MDB 正在监听的队列发送请求消息。JMS 的消息体是一个 javax.jms.ObjectMessage 中的 java.util.Map。为了参数化调用,这个消息必须包括 ILOG_rules_bres_mdb_rulesetPathILOG_rules_bres_mdb_status JMS 属性。请求消息的 JMSReplyTo 头文件指定 JMS 响应目的地。

清单 3. 创建并发送请求消息

 

//Create a sender

QueueSender queueSender = queueSessionJMSTx.createSender(queueIn);

 

//Create the request message and initialization

ObjectMessage requestMessage = queueSessionJMSTx.createObjectMessage();

 

//Create the parameters

HashMap inputParameters = new HashMap();

inputParameters.put(“CustomerApplication”, customerApplication);

 

//Set the parameters

requestMessage.setObject(inputParameters);

 

//Set the JMS message header properties

requestMessage.setStringProperty(“ILOG_rules_bres_mdb_rulesetPath”,rulesetPath);

requestMessage.setStringProperty(“ILOG_rules_bres_mdb_status”,”request”);

 

//Set the destination of the response message

requestMessage.setJMSReplyTo(queueOut);

 

//Send the message

queueSender.send(requestMessage);

System.out.println(“>>> Sent JMS message to MDB queue”);

queueSender.close();

 

//Get the request message ID

requestMsgID=requestMessage.getJMSMessageID();

 

3. 如果界面是请求-响应型,让客户在另一个事务创建一个接收端,然后从响应队列接收响应消息。使用请求消息 ID 和响应相关 ID 获取匹配的响应消息。

清单 4. 获取响应消息

 

//Create a receiver

StringBuffer selectorBuffer = new StringBuffer(“JMSCorrelationID”);

selectorBuffer.append(” = ‘”);

selectorBuffer.append(requestMsgID);

selectorBuffer.append(“‘”);

QueueReceiver queueReceiver =

queueSessionJMSTx.createReceiver(queueOut, selectorBuffer.toString());

 

//Begin to receive message

Message messageOut = queueReceiver.receive();

queueReceiver.close();

 

//Get the response message

ObjectMessage responseMessage = (ObjectMessage) messageOut;

HashMap parameters = (HashMap) responseMessage.getObject();

CustBO outCustomerBO = (CustBO) (parameters.get(“CustomerBO”));

 

使用 JMS 绑定/MQ JMS 绑定调用 JRules MDB

JRules MDB 期待 java.util.Map 作为一个 JMS 对象消息的负载,而 WPS 的客户机应用程序期待一个业务对象。因为 WPS 提供的默认 JMS 数据绑定不能适当处理格式转换,我们需要创建一个在 WPS 中可以映射到 java.util.Map 和业务对象的自定义 JMS 数据绑定

1. 实现一个自定义 JMS 数据绑定。自定义数据绑定实现必须实现 com.ibm.websphere.sca.jms.data.JMSDataBinding。这一类的框架如下所示:

清单 5. 自定义 JMS 数据绑定类的框架

 

import javax.jms.JMSException;

import javax.jms.Message;

import com.ibm.websphere.sca.jms.data.JMSDataBinding;

import commonj.connector.runtime.DataBindingException;

import commonj.sdo.DataObject;

 

public class CustomerApplicationDataBinding implements JMSDataBinding {

public int getMessageType() {return 0;}

public void read(Message arg0) throws JMSException {}

public void write(Message arg0) throws JMSException {}

public boolean isBusinessException() {return false;}

public void setBusinessException(boolean arg0) {}

public DataObject getDataObject() throws DataBindingException {return null;}

public void setDataObject(DataObject arg0) throws DataBindingException {}

}

 

2. getMessageType() 的以下实现示例,read(Message arg0) 和 write(Message arg0) 可以用于在 CustBO 业务对象和 java.util.HashMap 之间进行映射。

清单 6. 自定义 JMS 数据绑定实现的示例

 

public int getMessageType() {

return JMSDataBinding.OBJECT_MESSAGE;

}

 

public void write(Message message) throws JMSException {

try {

ObjectMessage requestMessage = (ObjectMessage) message;

 

//Get the data object

DataObject customerBO = getDataObject();

 

//Create the java.util.HashMap

HashMap inputParameters = new HashMap();

inputParameters.put(“CustomerBO”, customerBO);

 

//Set the payload of the JMS Object Message

requestMessage.setObject(inputParameters);

String rulesetPath = “/” + RULEAPP_NAME + “/” + RULESET_NAME_EMEARULE;

 

//Set the JMS message header properties

requestMessage.setStringProperty(“ILOG_rules_bres_mdb_rulesetPath”,

rulesetPath);

requestMessage.setStringProperty(“ILOG_rules_bres_mdb_status”, “request”);

} catch (DataBindingException e) {

throw new JMSException(e.getLocalizedMessage());

}

}

 

public void read(Message message) throws JMSException {

//Get the payload of the JMS Object message

ObjectMessage responseMessage = (ObjectMessage) message;

 

//Get the business object

HashMap parameters = (HashMap) responseMessage.getObject();

DataObject dobject = (CustBO) (parameters.get(“CustomerBO”));

try {

// Set the data object

setDataObject(dobject);

} catch (DataBindingException e) {

throw new JMSException(e.getLocalizedMessage());

}

}

 

3. 当 WAS 中的默认消息提供者被用作 JMS 消息提供者时,可以用一个 JMS 绑定导入调用 JRules MDB:

图 25. 生成 JMS 绑定

以下文章点击率最高

Loading…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营