jbpm5.1介绍(2)快速开始首先下载jBPM,http://sourceforge.net/projects/jbpm/files/可以有选择性的下载:bin:jBPM的二进制文件和它们的依赖包src:核心模块的源码gwt-console:jBPM的控制台,包括服务端和客户端docs:文档examples:一些jBPM的例子,可以导入到Eclipseinstaller:jBPM的安装,下载和安装一个jBPM的示例installer-full:所有的包括demo,jar包等待的完整工程一些有用的链接http://planet.jboss.org/view/feed.seam?name=jbossjbpmhttp://twitter.com/jbossjbpmhttp://www.jboss.com/index.html?module=bb&op=viewforum&f=217https://issues.jboss.org/browse/JBPMhttps://hudson.jboss.org/hudson/job/jBPM/源码jBPM的,现在使用它的源代码版本控制系统的git。可以在这里找到jBPM项目的来源(包括所有版本从jBPM5.0-CR1开始):https://github.com/droolsjbpm/jbpm安装所需条件JDK1.5+(setasJAVA_HOME)Ant1.7+演示环境安装到安装目录下运行antinstall.demo将会执行下载JBossAS下载EclipseJBoss的安装Drools的Guvnor到JBossOryx安装设置安装到JBossjBPM的控制台安装jBPM的Eclipse插件安装Drools的Eclipse插件如果你想看到报告在jBPM控制台上,那么需要修改build.properties文件的jBPM.birt.download属性设置为trueantstart.demo启动示例启动H2数据库启动了JBossAS启动Eclipse启动人工任务服务使用Eclipsetools导入示例工程下的sample/evaluation导入之后可以看到工程中的示例程序双击打开Evaluation.bpmn可以运行ProcessTest进行测试使用jBPM控制台启动后输入如下链接http://localhost:8080/jbpm-console使用krisv/krisv登录可以看到如下界面你可以启动一个新的流程,查看一个正在运行的流程的实例的状态,查看你的任务,完成任务,监控流程的执行使用Guvnor仓库和设计作为一个过程库的Guvnor库可用于存储业务流程。它还提供了一个基于Web的界面来管理您的进程。输入如下地址可以进入http://localhost:8080/drools-guvnor核心引擎API本节介绍的API,你需要加载过程并执行它们。对于如何界定的过程本身更详细,查看检出的BPMN2.0的章节。你可以在知识库中定义一个流程实例,然后在知识库中产生一个实例的session对象,如下图所示知识库可以共享会话之间,通常只创建一次,在启动应用程序。知识库可以动态改变(这样你就可以在运行过程中添加或删除)。会话可以创建基于一个知识库,用于执行过程,并与引擎交互。你想创建一个会话被认为是相对较轻的,你可以创造尽可能多的独立会议。如何创建许多会议是由你。在一般情况下,最简单的情况下开始创建一个会话,然后在您的应用程序的各个地方。你可以决定创建多个会话,例如,如果你想有多个独立的处理单元(例如,你想要的所有进程,从一个客户的完全独立于另一个客户的过程,使您可以创建一个为每个客户独立会议),或如果你需要多个会话,可扩展性的原因。如果你不知道做什么,只要简单地启动一个知识库,其中包含你所有的流程定义和创建会话,然后使用执行你所有的流程。正如上文所述,jBPM的API,因此可用于:(1)创建一个知识库,其中包含您的流程定义(2)创建一个会话启动新的进程实例,信号现有注册侦听等。1)知识库通过知识库加载流程定义,通过以下代码实现viewsourceprint?KnowledgeBuilderkbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(MyProcess.bpmn),ResourceType.BPMN2);KnowledgeBasekbase=kbuilder.newKnowledgeBase();ResourceFactory有类似的方法来加载文件系统的文件,从URL,InputStream中,等2)Session一旦你加载你的知识库,你应该创建一个会话与引擎交互。本次会议可以被用来启动新的进程,信号事件等,下面的代码片段显示了它是多么容易创建较早创建的知识库为基础的会话,并启动一个进程(ID)。viewsourceprint?StatefulKnowledgeSessionksession=kbase.newStatefulKnowledgeSession();ProcessInstanceprocessInstance=ksession.startProcess(com.sample.MyProcess);ProcessRuntime接口定义了所有的会议方法与流程交互,如下所示。viewsourceprint?/***Startanewprocessinstance.Theprocess(definition)thatshould*beusedisreferencedbythegivenprocessid.**@paramprocessIdTheidoftheprocessthatshouldbestarted*@returntheProcessInstancethatrepresentstheinstanceoftheprocessthatwasstarted*/ProcessInstancestartProcess(StringprocessId);/***Startanewprocessinstance.Theprocess(definition)thatshould*beusedisreferencedbythegivenprocessid.Parameterscanbepassed*totheprocessinstance(asname-valuepairs),andthesewillbeset*asvariablesoftheprocessinstance.**@paramprocessIdtheidoftheprocessthatshouldbestarted*@paramparameterstheprocessvariablesthatshouldbesetwhenstartingtheprocessinstance*@returntheProcessInstancethatrepresentstheinstanceoftheprocessthatwasstarted*/ProcessInstancestartProcess(StringprocessId,MapString,Objectparameters);/***Signalstheenginethataneventhasoccurred.Thetypeparameterdefines*whichtypeofeventandtheeventparametercancontainadditionalinformation*relatedtotheevent.Allprocessinstancesthatarelisteningtothistype*of(external)eventwillbenotified.Forperformancereasons,thistypeofevent*signalingshouldonlybeusedifoneprocessinstanceshouldbeabletonotify*otherprocessinstances.Forinternaleventwithinoneprocessinstance,usethe*signalEventmethodthatalsoincludetheprocessInstanceIdoftheprocessinstance*inquestion.**@paramtypethetypeofevent*@parameventthedataassociatedwiththisevent*/voidsignalEvent(Stringtype,Objectevent);/***Signalstheprocessinstancethataneventhasoccurred.Thetypeparameterdefines*whichtypeofeventandtheeventparametercancontainadditionalinformation*relatedtotheevent.Allnodeinstancesinsidethegivenprocessinstancethat*arelisteningtothistypeof(internal)eventwillbenotified.Notethattheevent*willonlybeprocessedinsidethegivenprocessinstance.Allotherprocessinstances*waitingforthistypeofeventwillnotbenotified.**@paramtypethetypeofevent*@parameventthedataassociatedwiththisevent*@paramprocessInstanceIdtheidoftheprocessinstancethatshouldbesignaled*/voidsignalEvent(Stringtype,Objectevent,longprocessInstanceId);/***Returnsacollectionofcurrentlyactiveprocessinstances.Notethatonlyprocess*instancesthatarecurrentlyloadedandactiveinsidetheenginewillbereturned.*Whenusingpersistence,itislikelynotallrunningprocessinstanceswillbeloaded*astheirstatewillbestoredpersistently.Itisrecommendednottousethis*methodtocollectinformationaboutthestateofyourprocessinstancesbuttouse*ahistorylogforthatpurpose.**@returnacollectionofprocessinstancescurrentlyactiveinthesession*/CollectionProcessInstancegetProcessInstances();/***Returnstheprocessinstancewiththegivenid.Notethatonlyactiveprocessinstances*willbereturned.Ifaprocessinstancehasbeencompletedalready,thismethodwillreturn*null.**@paramidtheidoftheprocessinstance*@returnt