Drools 5.1.1_DOC (50)
Drools 5.1.1_DOC_Drools Flow
第5章 Drools 流API
Drools流API应该被用于:
(1)创建一个包含你的流程定义的知识库;
(2) 创建一个会话,用于启动新流程实例,发信号通知现有的(ones?流程实例),注册侦听器,等等。
5.1. 知识库(Knowledge Base)
我 们的基于知识的API,允许你首先创建创建一个包含所有必要知识的知识库,并且可以跨会话重复使用。 这个知识库包括所有你的流程定义(以及其他的知识类型,如规则)。下面的代码片断显示了如何使用Knowledge Builder 添加资源(在这个案例中,从类路径添加),创建一个只由一个流程定义构成的知识库。。
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("MyProcess.rf"), ResourceType.DRF);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
注意基于知识的API,允许用户以几乎相同的方式添加不同类型的资源到相同的知识库,比如流程和规则。这让了解如何使用Drools 流的用户,几乎立即开始使用 Drools Fusion,甚至整合这些不同类型的知识。
接下来,你应该创建一个与引擎交互的会话。下面的代码片断显示根据前面创建的知识库创建一个会话和启动一个流程(通过id)是多少容易。
tatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ProcessInstance processInstance = ksession.startProcess("com.sample.MyProcess");
ProcessRuntime接口定义了所有与流程交互的会话方法,如下所示。有关每个方法的详情,请参考JavaDocs 。
ProcessInstance startProcess(String processId);
ProcessInstance startProcess(String processId, Map<String, Object> parameters);
void signalEvent(String type, Object event);
void signalEvent(String type, Object event, long processInstanceId);
Collection<ProcessInstance> getProcessInstances();
ProcessInstance getProcessInstance(long id);
void abortProcessInstance(long id);
WorkItemManager getWorkItemManager();
有 状态和无状态知识会话都提供了用于注册和删除侦听器的方法。ProcessEventListener对象可以被用来侦听与流程相关的事件,如启动或完成 一个流程,进入和离开一个节点,等等。下面显示了ProcessEventListener不同的方法。一个事件对象提供了对诸如链接到事件的流程实例和 节点实例的相关信息的访问。
public interface ProcessEventListener {
void beforeProcessStarted( ProcessStartedEvent event );
void afterProcessStarted( ProcessStartedEvent event );
void beforeProcessCompleted( ProcessCompletedEvent event );
void afterProcessCompleted( ProcessCompletedEvent event );
void beforeNodeTriggered( ProcessNodeTriggeredEvent event );
void afterNodeTriggered( ProcessNodeTriggeredEvent event );
void beforeNodeLeft( ProcessNodeLeftEvent event );
void afterNodeLeft( ProcessNodeLeftEvent event );
}
根据这些流程侦听器提供的信息可以创建审计日志。我们提供了各种各样的默认日志器实现:
1. Console logger:这个日志器写出所有事件到控制台。
2. File logger:这个日志器写出所有事件到一个使用XML表示的文件。然后可以在IDE 中使用这个日志文件,把在执行期间发生的事件生成一个基于树的可视化。
3. Threaded file logger:因为在关闭日志器时或在日志器中的事件数量达到预定水平时,文件日志器才写事件到磁盘,而在运行期间调试流程时不能使用它。 一个线程化文件日志器在一个指定时间间隔后写事件到一个文件,这让在调试流程时使用日志器实时可视化进度成为可能。
KnowledgeRuntimeLoggerFactory 让你添加一个日志器到你的会话,如下所示。当创建一个控制台日志时,为了那个需要被创建的日志器,知识会话必须作为一个参数传递。文件日志器还需要被创建 的日志文件名字,而线程化文件日志器则需要在那个事件后保存的间隔(毫秒)时间。
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger( ksession, "test" );
// add invocations to the process engine here,
// e.g. ksession.startProcess(processId);
...
logger.close();
使 用在Drools Eclipse插件中的Audit View ,可在Eclipse中打开日志文件,在那儿事件作为一棵树的被可视化。在(日志?)事件前和事件后之间发生的事件作为那个事件的儿子被显示。 下面的截屏显示了一个简单的例子,在那儿流程被启动,导致 Start 节点、一个动作节点和一个End 节点的激活,在这之后流程被完成