1. 程式人生 > >spring activiti drools6.5整合(轉)

spring activiti drools6.5整合(轉)

spring activiti drools6.5整合

 

 

整合activiti drools

在網上找了很多整合activit使用的都是5.x的drools ,我按照按照網上的方法配置時整合6.5時,發現老是提示

Deployment * doesn't contain any rules 。

轉換思路

後來打算不採用BusinessRuleTask,通過普通的serviceTask來自己編寫觸發規則的方法。

  1. pom配置 主要就是依賴activiti drool spring 的相關依賴
  2. 編寫drools指令碼生成類 
 
  1. @Component

  2. public class DroolsLoader {

  3.  
  4. /**

  5. * drools指令碼動態生成 可以根據業務,在不同場景下去生成

  6. * @throws IOException

  7. */

  8. @PostConstruct

  9. public void init() throws IOException {

  10. KieServices kieServices = KieServices.Factory.get();

  11. KieModuleModel kieModuleModel = kieServices.newKieModuleModel();

  12. KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("Test");

  13. KieSessionModel kieSessionModel = kieBaseModel.newKieSessionModel("sdfasdf");

  14. KieFileSystem kfs = kieServices.newKieFileSystem();

  15. //讀取事先定義好的指令碼 可以在此處動態生成指令碼

  16. String ruleTemplate = IOUtils

  17. .toString(MyStartProcess.class.getResourceAsStream("/drools/user.drl"), "UTF-8");

  18. kfs.write("src/main/resources/drools/hello.drl",ruleTemplate);

  19. kfs.writeKModuleXML(kieModuleModel.toXML());

  20. KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();

  21. }

  22. }

這兒我採用的初始化方法去建立drools指令碼,在實際的應用場景中我們也可以根據需求在不同的時間點建立,在規則平臺中我們也可以自定義去實時的動態建立規則。需要注意的是kieBaseModel.newKieSessionModel("sdfasdf"); session的name是sdfasdf,在後續的觸發時需要找到指定session這樣就可以觸發我們想要觸發的規則,而不是觸發所有規則。

事例中是讀取編寫drools檔案,實際開發中我們可以通過佔位符實現模板檔案,自定義的生成drools指令碼然後載入到droolsResposity中。

user.drl檔案內容如下:

 
  1. package asdfas

  2. import com.bauer.java.activitidrools.bean.UserBean

  3.  
  4. rule "testuser"

  5. when

  6. $ruleParam :UserBean(age > 20)

  7. then

  8. System.out.println("hello world---");

  9. end

如果 年齡大於20會輸出hello world

3.bpmn檔案配置

採用表示式的方式去觸發規則,目前bpmn檔案是預先寫好的。實際的應用場景是動態生成的,類似drools指令碼的生成。然後通過avtiviti的api實現動態部署如下面程式碼所示:

Deployment deployment = repositoryService.createDeployment().name(name).addString(name+".bpmn", bpmn).deploy();

   4.編寫觸發規則類

 
  1. @Component("bussinuessRuleTask")

  2. public class BussinuessRuleTask {

  3.  
  4. /**

  5. *

  6. * @param execution

  7. * @param name 用於區分觸發哪些規則 sessionname

  8. */

  9. public void fireRule(String name , DelegateExecution execution ) {

  10. KieServices kieServices = KieServices.Factory.get();

  11. KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());

  12. KieSession kieSession = kContainer.newKieSession(name);

  13. //插入入參

  14. kieSession.insert(execution.getVariable("userBean"));

  15. kieSession.fireAllRules();

  16. kieSession.dispose();

  17. System.out.println("rule has fired");

  18. }

  19. }

這裡需要注意的是這個name實際對應的是上文中所說到的session的name是sdfasdf,這裡需要保持一致這樣我才能控制觸發指定的規則。

 

原始碼:https://github.com/weiruiwei/activiti-drools-example.git