Seam Drools5分支 包含了对Seam与Drools5 API交互的增强。在这里,我将展示如何将现有的numberguess示例修改为使用Drools5
我们首先定义org.drools.KnowledgeBase并添加一个DRL (.drl)类型的单条规则资源。这种添加资源的新方式允许我们将任何类型的规则资源添加到KnowledgeBase(之前不可能做到),同时也遵循Drools5 API风格(kbuilder.add(ResourceFactory.newClassPathResource("numberguess.drl"), ResourceType.DRL);)
<drools:knowledge-base name="kbase" knowledge-builder-config="kbuilderconfig.properties" knowledge-base-config="kbaseconfig.properties"> <drools:rule-resources> <value>classpath;numberguess.drl;DRL</value> </drools:rule-resources> <drools:event-listeners> <value>org.drools.event.knowledgebase.DefaultKnowledgeBaseEventListener</value> </drools:event-listeners> </drools:knowledge-base>
然后我们创建org.drools.runtime.StatefulKnowledgeSession,传入我们的kbase
引用
<drools:stateful-knowledge-session name="ksession" knowledge-base="#{kbase}" knowledge-session-config="ksessionconfig.properties" audit-log="/home/tsurdilo/Desktop/ksession"> <drools:event-listeners> <value>org.drools.event.rule.DebugAgendaEventListener</value> <value>org.drools.event.rule.DebugWorkingMemoryEventListener</value> </drools:event-listeners> </drools:stateful-knowledge-session>
页面流定义保持不变
<bpm:jbpm> <bpm:pageflow-definitions> <value>pageflow.jpdl.xml</value> </bpm:pageflow-definitions> </bpm:jbpm>
这里我们需要更改处理器,使其能够与org.drools.runtime.StatefulKnowledgeSession一起工作
<handler class="org.jboss.seam.drools.KnowledgeDecisionHandler">
就是这样,numberguess示例仍然按预期工作。需要强调的一个更改是
Drools5 API不再在org.drools.runtime.StatefulKnowledgeSession和org.drools.runtime.StatelessKnowledgeSession上暴露setGlobalResolver方法。这主要是为了让其他API不会滥用此方法。相反,我们现在必须添加一个代理,例如
ksession = knowledgeBase.getValue().newStatefulKnowledgeSession(ksessionconfig, null); ksession.getGlobals().setDelegate(new SeamDelegate());
接下来,我将展示使用Drools Fusion的示例