spring activiti drools6.5整合(轉)
spring activiti drools6.5整合
整合activiti drools
在網上找了很多整合activit使用的都是5.x的drools ,我按照按照網上的方法配置時整合6.5時,發現老是提示
Deployment * doesn't contain any rules 。
轉換思路
後來打算不採用BusinessRuleTask,通過普通的serviceTask來自己編寫觸發規則的方法。
- pom配置 主要就是依賴activiti drool spring 的相關依賴
- 編寫drools指令碼生成類
-
@Component
-
public class DroolsLoader {
-
/**
-
* drools指令碼動態生成 可以根據業務,在不同場景下去生成
-
* @throws IOException
-
*/
-
@PostConstruct
-
public void init() throws IOException {
-
KieServices kieServices = KieServices.Factory.get();
-
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
-
KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("Test");
-
KieSessionModel kieSessionModel = kieBaseModel.newKieSessionModel("sdfasdf");
-
KieFileSystem kfs = kieServices.newKieFileSystem();
-
//讀取事先定義好的指令碼 可以在此處動態生成指令碼
-
String ruleTemplate = IOUtils
-
.toString(MyStartProcess.class.getResourceAsStream("/drools/user.drl"), "UTF-8");
-
kfs.write("src/main/resources/drools/hello.drl",ruleTemplate);
-
kfs.writeKModuleXML(kieModuleModel.toXML());
-
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
-
}
-
}
這兒我採用的初始化方法去建立drools指令碼,在實際的應用場景中我們也可以根據需求在不同的時間點建立,在規則平臺中我們也可以自定義去實時的動態建立規則。需要注意的是kieBaseModel.newKieSessionModel("sdfasdf"); session的name是sdfasdf,在後續的觸發時需要找到指定session這樣就可以觸發我們想要觸發的規則,而不是觸發所有規則。
事例中是讀取編寫drools檔案,實際開發中我們可以通過佔位符實現模板檔案,自定義的生成drools指令碼然後載入到droolsResposity中。
user.drl檔案內容如下:
-
package asdfas
-
import com.bauer.java.activitidrools.bean.UserBean
-
rule "testuser"
-
when
-
$ruleParam :UserBean(age > 20)
-
then
-
System.out.println("hello world---");
-
end
如果 年齡大於20會輸出hello world
3.bpmn檔案配置
採用表示式的方式去觸發規則,目前bpmn檔案是預先寫好的。實際的應用場景是動態生成的,類似drools指令碼的生成。然後通過avtiviti的api實現動態部署如下面程式碼所示:
Deployment deployment = repositoryService.createDeployment().name(name).addString(name+".bpmn", bpmn).deploy();
4.編寫觸發規則類
-
@Component("bussinuessRuleTask")
-
public class BussinuessRuleTask {
-
/**
-
*
-
* @param execution
-
* @param name 用於區分觸發哪些規則 sessionname
-
*/
-
public void fireRule(String name , DelegateExecution execution ) {
-
KieServices kieServices = KieServices.Factory.get();
-
KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
-
KieSession kieSession = kContainer.newKieSession(name);
-
//插入入參
-
kieSession.insert(execution.getVariable("userBean"));
-
kieSession.fireAllRules();
-
kieSession.dispose();
-
System.out.println("rule has fired");
-
}
-
}
這裡需要注意的是這個name實際對應的是上文中所說到的session的name是sdfasdf,這裡需要保持一致這樣我才能控制觸發指定的規則。