快捷搜索:

JBPM 整合 Drools(JBoss Rule)

jBPM 是一个异常优秀的开源事情流引擎,虽然他不是一个一站式的事情流平台,不过它已经为我们供给了对照富厚的底层操作,为了满意特定的项目需求,我们一样平常必要对其进行二次开拓,才能适用于详细的营业需求。

此中一个主要的扩展点是针对 TaskNode 进行的用户的分配。TaskNode 是 jBPM 中一个异常紧张的观点,一个义务节点可以包孕多少个义务,不合的义务可以由不合的人来完成,义务实例被分配给 actorId 来完成,此中指定到人的分配事情便是 Assignment 要处置惩罚的,这也是我们必要定制的功能,为了实现用户的分配,我们必要实现 AssignmentHandler 接口,接口原型如下。

public interface AssignmentHandler extends Serializable {

void assign(Assignable assignable, ExecutionContext executionContext) throws Exception;

}

平日用代码实现的话,我们可以让一个类实现这个接口,并在 swimlane 或者 tasknode 中的 assignment 指定该类。然则,这样的机动性是显然不敷的,在系统的应用历程中,分配策略会赓续的进行调剂,是以我们必要更为机动的办理规划,jBPM 本身可以应用基于 Bean Shell 的脚原先写分配策略,然则 Bean Shell 不是那么强大年夜,我们必要更为强大年夜的办理规划,是以,我们选用了已经被 JBoss 收为旗下的 JBoss Drools 4.0 规则引擎 (在 3.0 的时刻曾经改名为 JBoss Rules,4.0 又改回来了)

jBPM 和 Drools 虽然同在 JBoss 旗下,不过他们今朝并没有很好的进行整合,以是我们照样要使用它们系统系统的一些功能来做整合,同样也是实现 AssignmentHandler 接口,不过别的我们使用了 jBPM 里面的一个小小的技术。看一下这段设置设置设备摆设摆设:

AgentAssignmentRule

血色标注的这段设置设置设备摆设摆设,我们可以理解为,在 RulesAssignmentHandler 这个类里有一个 ruleName 这样的属性,在初始化这个类的时刻,jBPM 会把设置设置设备摆设摆设中 ruleName 的值 set 给 RulesAssignmentHandler 中 ruleName 的属性。

public class RulesAssignmentHandler implements AssignmentHandler {

protected String ruleName;

public String getRuleName() {

return ruleName;

}

public void setRuleName(String ruleName) {

this.ruleName = ruleName;

}

protected RuleBase readRule(String ruleName) throws Exception {

// 到 classes 下的 /rules 下加载响应的文件

String rulePath = "/rules/" + ruleName + ".drl";

Resource resource = new ClassPathResource(rulePath);

Reader reader = new InputStreamReader(resource.getInputStream());

PackageBuilder builder = new PackageBuilder();

builder.addPackageFromDrl(reader);

Package pkg = builder.getPackage();

RuleBase ruleBase = RuleBaseFactory.newRuleBase();

ruleBase.addPackage(pkg);

return ruleBase;

}

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 的一等公夷易近,这个今后钻研好了再来和大年夜家分享。

您可能还会对下面的文章感兴趣: