7. 单击 References 标签,配置 IlrRuleExecutionEJB 的资源引用。将 ResourceRef eis/XUConnectionFactory 的 JNDI 名字设为 eis/XUConnectionFactory,ResourceRef jms/BRESQueueConnectionFactory 的 JNDI 名字为 jms/BRESQueueConnectionFactory。
8. 然后输出 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. 使客户能够定位连接工厂和队列:
//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_rulesetPath 和 ILOG_rules_bres_mdb_status JMS 属性。请求消息的 JMSReplyTo 头文件指定 JMS 响应目的地。
//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 获取匹配的响应消息。
//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。这一类的框架如下所示:
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 之间进行映射。
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:
以下文章点击率最高
Loading…