业务流程管理(Business Process Management,BPM)和业务规则管理系统(Business Rules Management System,BRMS)是当今企业中间件产品中的两个热门领域。随着客户需求的增长,BPM 和 BRMS 的集成愈来愈常见,这为客户提供业务流程敏捷性和可扩展性更高的解决方案。WebSphere Process Server V7.0 和 ILOG JRules V7.0.2 分别是 BPM 和 BRMS 的核心产品。本文首先简要介绍 Process Server 和 JRules,而后详细讨论如何经过集成 ILOG JRules 和 Process Server 实现敏捷的业务流程,包括安装和配置、不一样的集成方法(好比 POJO、EJB、Web 服务和 JMS/MQ)以及在 Process Server 中使用 Common Event Infrastructure (CEI) 监视 JRules 服务。html
本文概述 ILOG JRules 和 WebSphere Process Server 的集成。若是须要关于本文提到的集成点的详细指南,请参见 Integrate WebSphere ILOG JRules with WebSphere Process Server 白皮书。java
回页首web
做为企业 IT 基础设施的关键部分,业务流程管理愈来愈重要了。在 BPM 产品套件平台上,能够建模、部署、执行和监视企业的业务流程,业务流程能够包含业务规则。例如,在银行的账户验证过程当中,评估客户资格或肯定价格的业务策略很复杂,并且在快速发展的市场中经常会变更。把这些策略硬编码在过程当中是不合适的,由于很难在运行时管理和维护业务规则。经过把业务规则和业务流程分隔开,单独地执行和管理它们,能够提升整个业务流程的敏捷性和可扩展性。图 1 说明了这种思想。数据库
在 IBM 的 BPM 产品组合中,WebSphere Process Server 是业务流程执行平台,它为企业提供强大、可扩展且符合行业标准的业务流程基础设施。Process Server 基于 WebSphere Application Server 平台,提供 Enterprise Service Bus (ESB) 功能,能够支持企业的面向服务架构 (SOA)。WebSphere Integration Developer(后面简称为 Integration Developer)是业务流程开发和组装工具。在 Integration Developer 中开发的项目能够部署在 Process Server 中,而后直接执行。浏览器
尽管 Integration Developer 和 Process Server 已经嵌入了业务规则编辑器和业务规则引擎,可是只能使用它实现简单的规则或决策表,只能包含有限的业务用户交互。对于大多数用例,嵌入的规则引擎没法知足复杂的业务需求。所以,须要专用的强大的业务规则管理系统,它应该支持业务规则建模、执行和管理的整个生命周期,能够方便地与 BPM 产品集成。安全
ILOG JRules 是先进的业务规则管理系统,提供编写、部署和管理业务规则等业务功能。它支持高效地修改策略和快速部署策略,这正是敏捷的全面集成的企业所须要的。服务器
ILOG JRules 提供一种建模、实现和部署业务规则的系统化方法。它支持以有秩序的高效的方式进行协做。它包含的工具针对不一样用户的技能和知识优化过,所以策略经理、业务分析师和开发人员均可以得到所需的支持,能够尽量发挥 BRMS 的价值。session
图 2 说明 ILOG JRules 的架构。架构
下面简要介绍 ILOG JRules 架构的每一个部分。app
ILOG Rule Studio:用于开发规则应用程序的基于 Eclipse 的开发环境。它容许合做编辑和调试 Java™ 代码和规则。特性包括:
ILOG Rule Team Server:这是一个 Web 环境,分布式业务团队能够经过它协做、建立、管理、验证和部署业务规则。
本文主要讨论 ILOG JRules 和 Process Server 的集成,包括安装和配置、不一样的集成方法(好比使用 POJO、EJB、Web 服务和 JMS/MQ)以及在 Process Server 中使用 CEI 监视 JRules 服务。
由于 Process Server 基于 WebSphere Application Server 平台,而 ILOG JRules 与 J2EE 兼容,因此 ILOG JRules 运行时组件和 Process Server 的集成是标准的 J2EE 应用程序集成过程。图 4 显示部署到 J2EE 环境中以后 JRules Execution Server 的核心组件。
JRules 使用一个数据库存储和管理规则集和规则应用程序。数据源和持久化提供一个访问 JRules 使用的数据库的 JDBC 解决方案。
Execution Unit (XU) 是针对 Java EE Connector Architecture (JCA 1.5) 的资源适配器。XU 处理规则集执行的低层细节,提供对资源的访问。XU 能够独立于管理模型运行。XU 让管理模型能够访问配置和运行时数据,在应用服务器和规则引擎之间实现 JCA 契约。应用服务器或应用程序客户机使用 XU 链接规则引擎。
执行组件受权 XU 执行规则集。Rule Execution Server 执行组件让咱们可以经过编写代码与 Rule Execution Server 模型交互,而不须要依赖于内部实现。
客户机模块须要嵌入 Rule Execution Server 执行组件(jrules-res-session-<appserver>.jar
),使用它引用 XU。
图 5 显示 JRules 与 Process Server 集成的架构。
在 Process Server 中集成 JRules 运行时须要完成如下步骤:
jdbc/resdatasource
,见图 6。不然,JRules 没法正确地链接它的数据库。 JRulesInstallDir\executionserver\applicationservers\WebSphere7\jrules-res-xu-WAS7.rar
找到它。XU J2C 链接工厂的 JNDI 名称必须是 eis/XUConnectionFactory
。其余 JRules 组件可能经过引用这个默认的 JNDI 名称访问 XU(图 7)。 JRulesInstallDir\executionserver\applicationservers\WebSphere7\ jrules-res-management-WAS7.ear
找到执行管理 EAR。 resAdministrators
resDeployers
resMonitors
resAdmin
resDeployer
resMonitor
如今,JRules 运行时的基本组件已经集成在 Process Server 中了。可使用它们开发规则应用程序并部署到 Process Server 上运行的 JRules 中。业务流程能够经过多种绑定做为决策服务节点调用规则集。
图 13 给出 JRules 定义的调用模型。
根据 XOM(在规则应用程序中定义的执行对象模型),客户机能够经过多种方法调用 Rule Execution Server 中部署的规则集,好比 POJO、EJB(远程或本地)、JMS 等等。同时,JRules 还提供一个透明的决策服务,让客户机可使用 SOAP/HTTP 经过 Web 服务访问规则集。在本文中,JRules 的客户机是 Process Server 中部署的业务流程。所以,不一样的调用方法与 Process Server 中不一样的 SCA 组件对应。表 1 总结不一样的 JRules 调用方法。
调用方法 | SCA 组件 | 本地仍是远程 |
---|---|---|
POJO | SCA POJO | 只能是本地的 |
EJB | SCA POJO | 本地和远程 |
JMS | MQ JMS 绑定导入 | 本地和远程 |
Web 服务 | Web 服务绑定导入 | 本地和远程 |
下面几节详细讨论每种调用方法。
SCA POJO 调用的效率很高,由于它不须要对输入和响应参数进行序列化和解序列化。可是,它的限制是只支持本地调用。这意味着 JRules Execution Server 必须在与 Process Server 相同的 JVM(发出调用的业务流程所在的 JVM)中运行。图 14 显示使用 SCA POJO 组件调用规则集的模型。
在这个模型中,SCA POJO 组件调用 jrules-bres-session-WAS7.jar
提供的 API,这会调用 XU 以访问规则集并把结果返回给 SCA POJO 组件。清单 1 显示的 Java 片断使用 POJO 会话调用 JRules。
Map inputParameters = new HashMap(); String strAMERICASPricing = serialize(AMERICASPricingSdo, "http://AMERICAS_Pricing", "AMERICAS_Pricing"); inputParameters.put("AMERICASPricing", strAMERICASPricing); //Get the session factory for a Java rulesession invocation IlrSessionFactory sessionFactory = new IlrPOJOSessionFactory(); IlrSessionRequest request = sessionFactory.createRequest(); request.setRulesetPath(IlrPath.parsePath(rulesetPath)); request.getInputParameters().putAll(inputParameters); //create a stateless rule session IlrStatelessSession ruleSession = sessionFactory.createStatelessSession(); IlrSessionResponse result = ruleSession.execute(request); Map outputParameters = result.getOutputParameters(); String strOutAMERICASPricing = (String) outputParameters.get ("AMERICASPricing"); DataObject response = createResponse("http://com", "AMERICAS_Pricing_RuleProjectExecutionResult"); response.set("AMERICASPricing", deserialize (strOutAMERICASPricing,"AMERICAS_Pricing"));
JRules 在 Integration Developer 中提供一个 Decision Service Wizard,能够用它自动地生成 SCA POJO 组件(图 15)。
能够经过 EJB 调用本地或远程地访问 ILOG JRules 中部署的规则服务。图 16 显示使用 EJB 绑定调用规则集的模型。
图 16 显示客户机应用程序使用规则会话(IlrStatelessRuleSession 或 IlrStatefulRuleSession)调用规则集。在规则会话中,将调用 IlrStatelessRuleSessionEJB 或 IlrStatefulRuleSessionEJB。IlrStatelessRuleSessionEJB 和 IlrStatefulRuleSessionEJB 能够驻留在与客户机不一样的 JVM 中。IlrStatelessRuleSessionEJB 或 IlrStatefulRuleSessionEJB 进而本地地调用在 XU 上运行的规则集。在 ILOG JRules 中,IlrStatelessRuleSession、IlrStatefulRuleSession、IlrStatelessRuleSessionEJB 和 IlrStatefulRuleSessionEJB 都打包在 jrules-res-session-WAS7.jar
中。客户机是 Process Server 中调用规则服务的场景。服务器是 ILOG JRules Execution Server 所在的应用服务器。
清单 2 所示的 Java 代码使用 EJB 会话调用规则服务。
//Sets IN and INOUT parameters. Map inputParameters = new HashMap(); String strCreditpricing = serialize(creditpricingSdo,"http://creditpricing", "CreditPricing"); inputParameters.put("creditpricing", strCreditpricing); Properties properties = new Properties(); properties.put(JAVA_NAMING_FACTORY_INITIAL, INITIAL_CONTEXT_FACTORY); properties.put(JAVA_NAMING_PROVIDER_URL, ENGINE_URL); IlrSessionRequest request = new IlrSessionRequest(rulesetPath); request.getExecutionSettings().getInputParameters().setParameters (inputParameters); //Get the provider for a Remote EJB IlrRuleSessionProvider rsProvider = new IlrRuleSessionProviderFactory.Builder( properties).setJNDINameOfRuleSessionStateless(JNDI_NAME).build(); //create a stateless rule session IlrStatelessRuleSession ruleSession = rsProvider.createStatelessRuleSession(); IlrSessionResponse result = ruleSession.executeRules(request); ilog.rules.bres.session.IlrSessionParameters outputParameters = result .getExecutionResult().getOutputParameters(); String strOutCreditpricing = (String) outputParameters.getObjectValue ("creditpricing"); DataObject response = createResponse("http://com", "PricingrulesExecutionResult"); response.set("creditpricing", deserialize(strOutCreditpricing,"CreditPricing"));
JRules 在 Integration Developer 中提供一个 Decision Service Wizard,能够用它自动地生成调用此代码的 SCA POJO 组件和 EJB(图 17)。
在 Process Server 中,能够经过 Web 服务访问规则服务。ILOG JRules 使用透明决策服务为规则集提供 Web 服务访问。JRules 提供两种透明决策服务:
对于监视的透明决策服务,支持的应用服务器只有 JBoss 和 Tomcat。所以,在与 Process Server 集成时,只能使用驻留的透明决策服务。图 18 说明如何使用驻留的透明决策服务访问 JRules 服务。
要想使用 Web 服务访问规则集,应该把驻留的透明决策服务 (jrules-res-htds-WAS7.ear) 部署到 Rule Execution Server 所在的 Process Server。这能够是与进行调用的业务流程相同的主机,也能够是不一样的主机。
要想使用 Web 服务调用规则集,首先须要从 Rule Execution Server 控制台导出目标规则应用程序的 WSDL(图 20)。
而后,在 Integration Developer 中,把这个 WSDL 文件导入要调用规则服务的 SCA 模块,指定 WSDL 文件中定义的用于 Web 服务绑定导入的接口。
业务流程可使用 Java Message Service (JMS) 消息标准异步地调用在 JRules 上运行的规则集。图 21 显示使用 JMS 调用规则集的模型。
图 21 显示客户机应用程序使用 JMS 消息标准调用 JRules 服务。它把 JMS 消息发送到一个消息目的地,在那里由消息驱动的规则 bean (MDB) 监听到达的消息。这个 MDB(即 JRules MDB)是一个做为消息监听器的企业 bean。在这个 bean 中,IlrRuleExecutionBean
是队列 MDB,IlrRuleExecutionTopicEJB
是主题 MDB(清单 3)。可使用应用服务器资源分配由消息驱动的规则 bean 的目的地。
<message-driven> <ejb-name>IlrRuleExecutionEJB</ejb-name> <ejb-class>ILOG.rules.bres.mdb.ejb.IlrRuleExecutionBean</ejb-class> ... </message-driven> <message-driven> <ejb-name>IlrRuleExecutionTopicEJB</ejb-name> <ejb-class>ILOG.rules.bres.mdb.ejb.IlrRuleExecutionBean</ejb-class> ... </message-driven>
当 JMS 消息到达时,EJB 容器调用 MDB IlrRuleExecutionBean 或 IlrRuleExecutionTopicEJB 的 onMessage 方法。IlrRuleExecutionBean 或 IlrRuleExecutionTopicEJB 能够驻留在客户机应用程序本地,也能够驻留在远程。MDB 进而调用 XU 中运行的规则集。对规则引擎的实际调用委托给一个简单的规则会话。
在规则引擎处理完成以后,MDB 负责发送响应消息(若是有的话)。它把结果发送到由 JMSReplyTo 消息头指定的 JMS 响应目的地。
在 JRules 中,用于 WebSphere Application Server 的 MDB IlrRuleExecutionBean 和 IlrRuleExecutionTopicEJB 实现类打包在 jrules-res-mdb-WAS7.jar 中。
在使用 JMS 调用规则集时,须要把 jrules-res-mdb-WAS7.jar 打包在一个假的 EAR 文件中,把它部署到 XU 所在的 Process Server。在 JRules MDB 端,须要定义如下资源:
jms/BRESQueueConnectionFactory
的队列链接工厂。jms/BRESTopicConnectionFactory
的主题链接工厂。jms/BRESQueueIn
。jms/BRESQueueOut
。jms/BRESQueueIn
队列中有消息时激活 JRules MDB。在客户端,可使用导入和 JMS 绑定把 JMS 消息发送到 JRules MDB,或从 JRules MDB 接收 JMS 消息。JRules MDB 指望 JMS 对象消息的有效载荷是一个 java.util.Map
,而 Process Server 中的客户机 SCA 应用程序须要一个业务对象。须要建立一个定制的 JMS 数据绑定,它把 java.util.Map 映射到 Process Server 中的业务对象表示。清单 4 说明如何使用定制的数据绑定在业务对象和 java.util.HashMap 之间创建映射。
public class CustomerApplicationDataBinding implements JMSDataBinding { public int getMessageType() { return JMSDataBinding.OBJECT_MESSAGE; } public void write(Message message) throws JMSException { try { ObjectMessage requestMessage = (ObjectMessage) message; //Get the data object DataObject customerApplicationSdo = getDataObject(); // Create the java.util.HashMap HashMap inputParameters = new HashMap(); // CustApplicationObj is the custom object defined in the parameters of rule application // convertSDOToCustApplicationObj converts the incoming SDO to CustApplicationObj CustApplicationObj customerApplicationObj =convertSDOToCustApplicationObj(customerApplicationSdo); inputParameters.put("CustomerApplicationObj", customerApplicationObj); // 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; HashMap parameters = (HashMap) responseMessage.getObject(); CustApplicationObj outCustomerApplicationObj = (CustApplicationObj) parameters.get("CustomerApplicationObj")); // convertCustApplicationObjToSDO converts the rule application parameter to SDO DataObject dobject = convertCustApplicationObjToSDO(outCustomerApplicationObj); try { // Set the data object setDataObject(dobject); } catch (DataBindingException e) { throw new JMSException(e.getLocalizedMessage()); } } }
在 Process Server 中,能够监视基于 CEI 的业务流程。全部启用的 Common Base Event (CBE) 事件都发送到 CEI 服务器并存储以供监视使用。可使用 Process Server 附带的 CBE 浏览器检查在业务流程运行时生成的事件。还可使用 WebSphere Business Monitor 监视指定的度量数据,好比业务流程的指标和 KPI。
ILOG JRules 中的规则服务也能够把 CBE 事件发送给 CEI 框架,这提供与 Process Server 一致的监视机制。这些 CBE 事件能够提供详细、综合的 JRules 服务审计跟踪。
JRules 提供发送 CEI 事件的 API。为了简化,JRules 提供用于与 Process Server 集成的 ILOG JRules CEI Event Source 组件。它包含的 CEIEventBOM 模块定义 CEI 事件 BOM 并封装发送 CEI 事件的 API。规则项目能够引用 CEIEventBOM 模块并定义一个 ilog.connector.ibm.runtime.EventContainer 类型的变量,从而把 CEI 事件发送给 Process Server。示例见图 22 和图 23。
而后,能够在须要发送 CEI 事件的地方添加代码,见图 24。
调用规则集以后,可使用 CBE 浏览器检查事件(图 25)。在这里能够看到规则调用的审计跟踪,这提供触发的规则和执行的规则流等有用的信息。
本文概述了如何集成 ILOG JRules 和 WebSphere Process Server。讨论了如何使用不一样的方法从业务流程调用规则服务,包括 POJO、EJB、Web 服务和 JMS/MQ。最后,讨论了在 WebSphere Process Server 中如何经过 CEI 监视 JRules 服务。