大家好,我是讯享网,很高兴认识大家。
一、背景
我们写drl规则的时候,有时候需要自己声明一些类来帮助后面的规则运行。如果需要用到的类需要提前用java声明,这样就不行了,可以在drl文件中声明一个类吗?可以通过使用drools的类型声明来实现。
二、前置知识1、Type declaration语法结构
语法结构语法结构
2.java代码1中获取drl声明的类型。非枚举类型kie base kie base = kie container . getkie base(& # 34;类型-kabse & # 34;);//规则文件的包名声明的类型名为FactType ProductOrderFactType = kie base . get FactType(& # 34;规则& # 34;, “产品订单& # 34;);object instance = productorderfacttype . new instance();productOrderFactType.set(实例,& # 34;订单编号& # 34;,20220517121212001 l);2.枚举类型的值需要通过反射获得。
kie base kie base = kie container . getkie base(& # 34;类型-kabse & # 34;);//这里FactType的真实类型是EnumClassDefinition,可以在枚举FactType orderstatusfacttype = kiebase . get FactType(& # 34;规则& # 34;, “订单状态& # 34;);//获取值类<?& gtfactClass = orderstatusfacttype . get factClass();method method = fact class . get method(& # 34;valueOf & # 34,string . class);Object pay = method.invoke(null,& # 34;支付& # 34;);注:
如果你看不懂上面的代码,那就往下看。
三、需求
1.在drl文件中声明一个枚举类型。
2。在drl文件中声明一个类。
3。在drl文件中声明一个类,并完成继承操作。
4。编写规则并使用我们的自定义类型。
5。为java中drl文件中声明的类型赋值,包括类和枚举类型。
四、实现1、在drl文件中声明一个枚举类型
//声明枚举类型声明枚举顺序状态已创建(0,& # 34;创建一个新的& # 34;),支付(1,& # 34;付费& # 34;),收到(2,& # 34;收到& # 34;);状态:整数;desc:弦乐;End语法结构:声明enum枚举名称end
2、在drl文件中声明一个类
//声明一个类声明base order orderId:Long//order id created time:Date//time Item:product Item//上面在Java中定义的枚举类型end这个类中的每个属性都有一个类型,可以是现有的事实,也可以是任何有效的Java类型。
3、在drl文件中声明一个类并完成继承操作
//实现继承操作declare product order extends base order userid:long//订购用户的idend使用extends完成继承操作。
4、编写rule并使用我们自定义的type
//定义一个规则,其中ProductOrder存在于规则内存中,orderStatus为paid userId = = 1001rule & # 34rule _ type & # 34当$ order:product order(userId = = 1001 & & orderStatus = = orderStatus时,无循环为真。PAY)然后String created time = new simple date format(& # 34;yyyy-MM-DD HH:MM:ss & # 34;) .format($ order . getcreatedtime());system . out . println(& # 34;用户[& # 34;+$ order . get userid()+& # 34;]在[& # 34;+created time+& # 34;]购买[& # 34;+ $order.getItem()。getItemName()+& # 34;]支付已经完成& # 34;);modify($ order){ set order status(order status . received)} End解释:
1。如果在规则内存中有一个ProductOrder对象,并且userId的值为1001,orderstatus的值为PAY,则该规则被激活。
2。当这个规则被激活时,修改后的订单的状态被接收,修改后的值在java代码中获得。
5、java中给在drl文件中声明的type赋值
@Slf4jpublic类DroolsTypeDeclareApplication { public static void main(String[]args)抛出InstantiationException,IllegalAccessException,NoSuchMethodException,InvocationTargetException { kie services kie services = kie services . get();kie container kie container = kie services . getkieclasspathcontainer();KieSession KieSession = kie container . new KieSession(& # 34;type-k session & # 34;);kiesession . addevent listener(new debugluruntimeeventlistener());kiesession . addevent listener(new debuggendaeventlistener());kiesession . addevent listener(new DebugProcessEventListener());kie base kie base = kie container . getkie base(& # 34;类型-kabse & # 34;);FactType productOrderFactType = kie base . get FactType(& # 34;规则& # 34;, “产品订单& # 34;);FactType orderStatusFactType = kie base . get FactType(& # 34;规则& # 34;, “订单状态& # 34;);//获取值类<?& gtfactClass = orderstatusfacttype . get factClass();method method = fact class . get method(& # 34;valueOf & # 34,string . class);Object pay = method.invoke(null,& # 34;支付& # 34;);object instance = productorderfacttype . new instance();product item item = new product item();item . set itemname(& # 34;iphone 13 & # 34);productOrderFactType.set(实例,& # 34;订单编号& # 34;,20220517121212001 l);productOrderFactType.set(实例,& # 34;createdTime & # 34,new Date());productOrderFactType.set(实例,& # 34;item & # 34,项);productOrderFactType.set(实例,& # 34;订单状态& # 34;,支付);productOrderFactType.set(实例,& # 34;userId & # 34,1001 l);kieSession.insert(实例);kiesession . fireall rules();object order status = productorderfacttype . get(instance,& # 34;订单状态& # 34;);log . info(& # 34;获取规则中修改后的枚举字段的值:[{ }]& # 34;,order status);kiesession . dispose();}}注意:
1。要用java获取drl文件中声明的类型,需要使用kieBase.getFactType来获取。
2。如果需要获取drl文件中声明的枚举类型的值,可以通过反射来获取。
6、运行上方的代码
用户[1001]于[2022-05-17 11: 42: 27.724]购买的[iphone 13]已于11:42:27.724[main]infocom . Huan . drools . queries . droolstypedeclareapplication-获取规则中修改后的枚举字段的值。
五、完整代码
https://gitee . com/Huan 1993/spring-cloud-parent/tree/master/drools/drools-drl-type-declarations
六、参考链接
1、https://docs . drools . org/7 . 69 . 0 . final/drools-docs/html _ single/index . html # drl-declarations-con _ drl-rules
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/8067.html