Drools - YUHAO-ZX/StudyCollection GitHub Wiki

官方文档解读:http://docs.jboss.org/drools/release/6.2.0.Final/drools-docs/html_single/index.html

类功能划分

1.KIE将扫描类路径中找到所有与它kmodule.xml JAR文件。每找到JAR由KieModule接口表示。

2.kmodule.xml文件是选择资源,知识库和配置的基础知识和会话描述符(描述kbase,ksession的配置信息,具体配置解读见文档)

3. KieContainer 用于创建kiesession,kiebase的容器

4. KieServices 用于提供kie服务的总对象(is the interface from where it possible to access all the Kie building and runtime facilities),可以创建KieContainer

5. KieBase 特别是KieBase是应用程序的所有知识定义的存储库。它将包含的规则,过程,功能,和类型的模型。本身不包含数据,创建成本高,可创建kiesession

6. KieSession KieSession在运行时数据存储并执行。它是从创建KieBase或更容易,可直接建立从 KieContainer它是否已在

ksession.execute(...)

7.可为KieSession创建监听:ruleRuntimeEventListener,agendaEventListener和processEventListener

8.由于纪伊项目也是一个Maven项目在pom.xml文件中声明的groupId,artifactId和version用来生成一个ReleaseId唯一标识您的应用程序内的项目。这使得从项目中的新KieContainer的创建通过传递它ReleaseId的KieServices。

9. KieFileSystem KieModule.xml 也可以不用声明和创建,可以通过KieFileSystem来创建

10. KieModuleModel 用于没有KieModule.xml文件声明,使用KieFileSystem来动态定义kbase,ksession配置

11. KieBuilder 所有资源最后最后通过KieFileSystem抽象到KieBuilder

12. KieRepository KieModule的容器,这里放着KieFileSystem中的KieModule

KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = ...
kieServices.newKieBuilder( kfs ).buildAll();
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().

13.检查编译是否出错

KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
assertEquals( 0, kieBuilder.getResults().getMessages( Message.Level.ERROR ).size() );

14. KieScanner 可以监控是否有新的kie项目部署,如果有,可以检查变化

KieServices kieServices = KieServices.Factory.get();
ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "myartifact", "1.0-SNAPSHOT" );
KieContainer kContainer = kieServices.newKieContainer( releaseId );
KieScanner kScanner = kieServices.newKieScanner( kContainer );

// Start the KieScanner polling the Maven repository every 10 seconds
kScanner.start( 10000L );

15. KieRuntime 提供规则和执行过程的方法

16.全局

global java.util.List list

List list = new ArrayList();
ksession.setGlobal("list", list);

可以设置对象为全局,相当于static

17. RuleRuntimeEventManager 允许添加和除去监听,所以,对于工作记忆和日程事件可以听取

例如

ksession.addEventListener( new DefaultAgendaEventListener() {
    public void afterMatchFired(AfterMatchFiredEvent event) {
        super.afterMatchFired( event );
        System.out.println( event );
    }
});

18. KieRuntimeEvent 事件类型

目前支持的
MatchCreatedEvent
MatchCancelledEvent
BeforeMatchFiredEvent
AfterMatchFiredEvent
AgendaGroupPushedEvent
AgendaGroupPoppedEvent
ObjectInsertEvent
ObjectDeletedEvent
ObjectUpdatedEvent
ProcessCompletedEvent
ProcessNodeLeftEvent
ProcessNodeTriggeredEvent
ProcessStartEvent

19. KieRuntimeLogger 日志

20. 规则执行可返回

StatelessKieSession ksession = kbase.newStatelessKieSession();
ExecutionResults bresults =
    ksession.execute( CommandFactory.newSetGlobal( "stilton", new Cheese( "stilton" ), true);
Cheese stilton = bresults.getValue( "stilton" );

21. StatelessKieSession

22. KieMarshallers 用于编组kiesessioin和取消kiesession编组

23. 事务,除了代码层面,还有具体的数据源和事务配置,具体见文档

KieServices kieServices = KieServices.Factory.get();
Environment env = kieServices.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
         Persistence.createEntityManagerFactory( "emf-name" ) );
env.set( EnvironmentName.TRANSACTION_MANAGER,
         TransactionManagerServices.getTransactionManager() );

// KieSessionConfiguration may be null, and a default will be used
KieSession ksession =
        kieServices.getStoreServices().newKieSession( kbase, null, env );
int sessionId = ksession.getId();

UserTransaction ut =
  (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.insert( data1 );
ksession.insert( data2 );
ksession.startProcess( "process1" );
ut.commit();

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36.

37.

38.

39.