protected void initRuleContextData(ExecutionContext executionContext, WorkingMemory workingMemory) {
ContextInstance ci = executionContext.getContextInstance();
Map vars = ci.getVariables();
workingMemory.insert(ci);
workingMemory.insert(vars);
}
public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception {
RuleBase ruleBase = readRule(ruleName);
WorkingMemory workingMemory = ruleBase.newStatefulSession();
// 为了简便操作,我只是拿了放入 ExecuteContext 中的 variable 进行逻辑处理
initRuleContextData(executionContext, workingMemory);
workingMemory.insert(assignable);
workingMemory.fireAllRules();
}
}
对应的 AgentAssignmentRule.drl 文件内容如下,假定 ExecutionContext 中有 price 这个 variable,我们判定当这个值 > 5000 的时候,我们将此任务分配给 senior_agent 来处理。
package org.agilejava.workflow
import java.util.Map
import org.jbpm.taskmgmt.exe.Assignable
rule "Assign Agent"
when
a : Assignable()
Map(this[’price’] >= 5000)
then
a.setActorId("senior_agent");
end
就这样,我们就完成了最为简单的 jBPM 和 Drools 的整合,当然这种方式只是简单的利用了 jBPM 的一些特性来做的,我们每次都得指定这个 RulesAssignmentHandler,还是很麻烦的,更好的方式就是我们改写 ProcessDefinition.xml 的 parser,让 Drools 的规则定义成为和 swimlane, actor-id, expression 这样的分配方式同样级别的,让 Drools 成为 jBPM 的一等公民,这个以后研究好了再来和大家分享。
责任编辑:小草