我们正在继续使用JPAKnowledgeService持续进行drools会话。 我们按照drools用户手册中的指南配置和实现如下:
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
loadDRL(kbase); // method to load the DRL rules to kbase
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory( "org.drools.persistence.jpa"));
env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
ksession.insert(new Event());
ksession.fireAllRules();
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(ksession.getId(), kbase, null, env);
ksession.insert(new Event());
ksession.fireAllRules();
ksession.dispose();
我们第一次使用有状态会话时,我们需要新建它JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env)
。
第二次或第三次我们在同一个线程中使用相同的会话时,我们可以从DB JPAKnowledgeService.loadStatefulKnowledgeSession(ksession.getId(), kbase, null, env)
重新加载会话,或者只在工作内存中使用会话。
但即使是在同一个地方,在并发环境中,我们如何确定是否需要从DB加载会话或仅使用工作内存中的会话?是否会自动检测工作内存中是否有会话,如果没有,将从DB加载?
另外在spring配置环境中,我们无法控制是否新建会话或从DB加载会话或只是在工作内存中使用会话,它是如何执行的?