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的示例