JSR94规则引擎标准学习收藏

1、规则引擎

       一个规则引擎可以被简单的视为一个IF/THEN表达式的解释机制。向规则引擎输入一个规则序列和一些数据对象,它就会输出被修改的输入数据对象或者新的一些对象,以及产生一些副作用,比如发电子邮件之类的操作。

 

       即使遵循JSR94的不同的规则引擎,其也是存在差别的。JSR94基本上只是规范了客户端调用规则引擎的接口,对规则引擎实现相关技术没有进行规范。如下实现技术不是规范中的内容:

       *规则以及规则执行序列(rule execution sets)的二进制表示

       *规则以及规则执行序列的文件格式结构

       *规则以及规则执行序列的解释语义

       *规则以及规则执行序列的转换机制

 

       典型的规则引擎具有如下特性:

       *提供具体商业和应用逻辑基础上的声明式编程

           *包含一种文件格式或者工具,来定义规则和规则执行序列

       *根据输入的对象来生产输出对象。输入对象可以看作是事实,其表示应用域的某种状态;而输出对象可以看作是结论或者推论

       *规则引擎可以直接执行活动,对应用域、输入对象、执行周期、规则或者引擎本身产生影响

       *规则引擎可以只产生输出对象,并将其交给调用者去处理。

 

       最常见的规则引擎类型是Forward-chaining规则引擎,其特点是一个规则的执行结论可能是其他规则触发的条件,这样一直下去。Forward -chaining规则引擎适合于处理给出一些简单的事实而推论出更高层次的结果。JSR94标准主要是针对Forward-chaining规则引擎 的。

 

2、规则

       一个规则由两部分组成:一个条件和一个活动。JSR94没有规范规则的结构,各种不同的规则引擎差别很大。

 

3、规则执行序列(rule execution set

       一个规则执行序列是一些规则的集合。JSR94没有规范其结构

 

4、规则会话(rule session)

       客户端与规则引擎的一个运行时连接。一个规则会话与唯一一个规则执行序列相关联。规则会话必须显示的释放。

 

5、有状态的规则会话

       输入对象可逐渐增加到会话中,结果对象可以重复查询

 

6、无状态的规则会话

       高性能,API简单。输入为对象列表(List

 

       **介绍**

       规则引擎处理周期包括:规则解析、增加对象到引擎、命中规则、从引擎获取结果。规则引擎的主要输入是被称为规则执行序列的规则集合。JSR94中没有对规则描述语言以及规则引擎执行周期进行约定。JSR94中只定义了规则引擎的操作接口。

        

       **构架**

       规则引擎的接口和类定义在javax.rulesjavax.rules.admin包中。其中javax.rules包中的接口和类提供给规则引擎的客户端使用,提供为注册的规则执行序列获取一个规则会话和与会话交互的功能。管理API提供从URI,InputStream,XML,Reader等外部资源装入一个规则执行序列;同时也提供注册规则执行序列和撤销注册的功能。只有注册的序列是可以被客户端访问的。

       运行时API

       也就是在javax.rules包中的类和接口。运行时API主要包括以下功能:

       -通过RuleServiceProviderManager类获取一个实现RuleServiceProvider接口的规则引擎实例

       -通过RuleServiceProvider获取一个RuleRuntime接口实例

       -通过RuleRuntime创建一个RuleSession会话

       -获取被注册URI的列表(java.util.List

       -通过RuleExecutionSetMetadata接口为会话(RuleSession)获取原数据

       -通过一个ObjectFilter接口来过滤执行RuleExecutionSet的结果

       -通过Handle实例访问放置于StatefulRuleSession中的对象。

        

       RuleServiceProviderManager

       RuleServiceProviderManager用于从发行商发布的规则引擎产品中获取一个RuleServiceProvider接口的实现。这一点很类似于JDBCDriverManagerDriver的关系。使用类似JDBCURL,客户端可以通过RuleServiceProviderManager类获取一个实现了RuleServiceProvider接口的类,我们并不需要知道这个类具体是什么。

       例如:

       Class.forName(“org.jcp.jsr94.ri.RuleServiceProvider”);

       RuleServiceProvider rsp = RuleServiceProviderManager

       .getRuleServiceProvider(“org.jcp.jsr94.ri.RuleServiceProvider”);

1:演示如何使用RuleAdministrator从外部资源创建一个RuleExecutionSet,如何为RuleExecutionSet创建RuleSession,以及如何使用RuleSession处理输入对象得到输出对象。

 

       //装入RuleServiceProvider

       Class.forName(“org.jcp.jsr94.ri.RuleServiceProvider”);

       RuleServiceProvider serviceProvider = RuleServiceProviderManager

                      .getRuleServiceProvider(RULE_SERVICE_PROVIDER);

 

       //创建一个无状态的RuleSession

       RuleRuntime ruleRuntime = serviceProvider.getRuleRuntime();

       StatelessRuleSession srs = (StatelessRuleSession) ruleRuntime

       .createRuleSession(bindUri, null, RuleRuntime.STATELESS_SESSION_TYPE);

 

       //执行所有的规则

       List inputList = new LinkedList();

       inputList.add(new String(“Hi”));

       inputList.add(new String(“hoo”));

       inputList.add(new Integer(5));

       List resultList = srs.executeRules(inputList);

 

       //释放会话资源

       srs.release();

 

 

2:规则管理,演示了如何从外部资源创建RuleExecutionSet,然后注册。

 

       String RULE_SERVICE_PROVIDER = “org.jcp.jsr94.jess”;

       // 装入JSR94参考实现的规则服务提供者(RuleServiceProvider

       Class.forName(“org.jcp.jsr94.jess.RuleServiceProviderImpl”);

       // 通过RuleServiceProviderManager获取RuleServiceProvider

       RuleServiceProvider serviceProvider = RuleServiceProviderManager.getRuleServiceProvider(

                                 RULE_SERVICE_PROVIDER);

       //获取RuleAdministrator

       RuleAdministrator ruleAdministrator = serviceProvider.getRuleAdministrator();

       //获取一个输入流,它包含着规则定义

       InputStream inStream = getResourceAsStream(“input_rules.xml”);

       //解析流中的规则定义

       RuleExecutionSet res1 = ruleAdministrator.getLocalRuleExecutionSetProvider(null)

                            .createRuleExecutionSet(inStream,null);

       inStream.close();

       //注册这个RuleExecutionSet

       String uri = res1.getName();

       ruleAdministrator.registerRuleExecutionSet(uri, res1 , null);

 

3:无状态的规则会话,演示从上面示例代码中注册的RuleExecutionSet中获取StatelessRuleSession实例,并执行规则。

 

       String RULE_SERVICE_PROVIDER = “org.jcp.jsr94.jess”;

       // 装入JSR94参考实现的规则服务提供者(RuleServiceProvider

       Class.forName(“org.jcp.jsr94.jess.RuleServiceProviderImpl”);

       // 通过RuleServiceProviderManager获取RuleServiceProvider

       RuleServiceProvider serviceProvider = RuleServiceProviderManager.getRuleServiceProvider(

                                 RULE_SERVICE_PROVIDER);

       //获取RuleRuntime并调用规则引擎

       RuleRuntime ruleRuntime = serviceProvider.getRuleRuntime();

 

       //创建一个无状态会话

       StatelessRuleSession statelessRuleSession = (StatelessRuleSession) ruleRuntime

              .createRuleSession(uri, new HashMap(), RuleRuntime.STATELESS_SESSION_TYPE);

       //调用executeRules执行规则

       Customer inputCustomer = new Customer(“test”);

       inputCustomer.setCreditLimit(5000);

       List input = new ArrayList();

       Input.add(inputCustomer);

 

       //执行规则,不带有过滤器

       List results = statelessRuleSession.executeRules(input);

 

       //释放资源

       statelessRuleSession.release();

 

 

4:有状态规则会话,演示从上面示例代码中注册的RuleExecutionSet中获取StatefulRuleSession实例,然后加入输入对象,并使用Handle访问对象,最后提取结果对象。

 

       String RULE_SERVICE_PROVIDER = “org.jcp.jsr94.jess”;

       // 装入JSR94参考实现的规则服务提供者(RuleServiceProvider

       Class.forName(“org.jcp.jsr94.jess.RuleServiceProviderImpl”);

       // 通过RuleServiceProviderManager获取RuleServiceProvider

       RuleServiceProvider serviceProvider = RuleServiceProviderManager.getRuleServiceProvider(

                                 RULE_SERVICE_PROVIDER);

       //获取RuleRuntime并调用规则引擎

       RuleRuntime ruleRuntime = serviceProvider.getRuleRuntime();

 

       //创建一个有状态会话

       StatefulRuleSession statefulRuleSession = (StatefulRuleSession) ruleRuntime

              .createRuleSession(uri, new HashMap(), RuleRuntime.STATEFULL_SESSION_TYPE);

       //增加输入对象

       Invoice inputInvoice = new Invoice(“Invoice”);

       inputInvoice.setAmount(1750);

       statefulRuleSession.addObject(inputInvoice);

       //执行规则

       statefulRuleSession.executeRules();

       //提取结果

       results = statefulRuleSession.getObjects();

       //增加其他输入对象

       Invoice inputInvoice2 = new Invoice(“Invoice 2”);

       inputInvoice2.setAmount(4000);

       //执行规则

       statefulRuleSession.executeRules();

       //提取结果

       results = statefulRuleSession.getObjects();

       //释放资源

       statefulRuleSession.release();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSR(Jump to Subroutine)指令是一种无条件的跳转指令,它用于将程序的控制权转移到一个子程序(或函数)中执行,并在子程序执行完成后返回到原来的位置继续执行。JSR 指令的格式如下: ``` JSR BaseR, PCoffset9 ``` 其中,BaseR 是一个基地址寄存器(Base Register),用于存储子程序的起始地址;PCoffset9 是一个相对于当前指令的偏移量,用于计算子程序的入口地址。 JSR 指令的执行流程如下: 1. 将当前指令的下一条指令地址存储到 R7 中,用于返回时恢复现场。 2. 将 BaseR 中存储的地址加上 PCoffset9 中的偏移量,计算出子程序的入口地址,并将其存储到 PC 中,从而跳转到子程序的起始位置执行。 子程序执行完毕后,可以使用 RET(Return)指令返回到原来的位置继续执行。RET 指令的格式如下: ``` RET ``` RET 指令的执行流程如下: 1. 将 R7 中存储的值加载到 PC 中,从而返回到原来的位置继续执行。 2. 在返回前,可以使用类似 POP 指令的方式将栈中存储的寄存器值恢复到原来的状态,从而恢复现场。 需要注意的是,在使用 JSR 指令时,需要事先将子程序的起始地址存储到某个基地址寄存器中。例如,可以使用 LEA(Load Effective Address)指令将子程序的地址加载到寄存器中: ``` LEA R6, Subroutine JSR R6, #0 ``` 上述代码中,LEA 指令将 Subroutine 标签的地址加载到 R6 中,然后通过 JSR 指令跳转到子程序的起始位置执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值