快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门威尼l斯人网址_博格自动化网进入



子流程的应用

成果先容

具澳门威尼l斯人网址体阐述开拓成果

评审标准:清楚先容开拓成果

当一个流程的营业逻辑异常繁杂的时刻,可以斟酌应用子流程。子流程和主流程是相对自力的。

设计思路

描述主要的设计思路,开拓措施以及技巧要点

评审标准:清晰表达设计思路和技巧要点

在jbpm中,我们可以将一个繁杂的营业流程文件根据营业逻辑的不合划分为父流程和子流程,这样一方面可以令我们的流程定义文件不会设计得太臃肿,二来可以方便我们将来的掩护,只对必要改动的流程进行改动,而不影响其他流程。

若何应用

阐述若何结合项目必要利用成果进行开拓。这部分必要具体描述,让其他开拓职员按照此成果申报,能够进行一样平常简单的开拓,具有较强的可操作性。

评审标准:开拓职员按此应用阐明基础能利用成果进行开拓

这里我们先容下关于jbpm子流程的应用,这里我们定义两个流程定义xml文件,一个是父流程定义文件,一个是子流程定义文件。这里我想当履行完Payfirst义务的时刻,jbpm流程能自动去我的子流程文件中去履行那边定义的义务。

这里是父流程processdefinition.xml

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="myapp">

。。。。。。

<task-node name="PayFirst">

<task name="PayFirstTask" swimlane="finance"></task>

<transition name="get house contract" to="subprocess">

<action name="action"

class="com.myapp.action.MessageActionHandler">

<message>

Has pay first bulk of money. Print constract now!

</message>

</action>

</transition>

</task-node>

<process-state name="subprocess">

<sub-process name="subprocessdefinition"/>

<transition to="end"></transition>

</process-state>

<task-node name="pass round for perusal"

signal="last-wait" create-tasks="false">

<task name="perusal">

<assignment actor-id="#{processStarter}">

</assignment>

</task>

<event type="node-enter">

<action name="createInstance"

class="com.myapp.action.CreateTaskInstanceAction"></action>

</event>

<transition name="backto" to="OnePersonAudit">

</transition>

</task-node>

</process-definition>

可以看到,上面我们应用到了

,在jbpm中,process-state标签代表的是引用子流程。这里我们接着定义子流程文件。

子流程subprocessdefinition定义文件

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.2"

name="subprocessdefinition">

<swimlane name="service">

<assignment actor-id="service1" />

</swimlane>

<start-state name="subStart">

<transition to="PrintContract"></transition>

</start-state>

<task-node name="PrintContract">

<task name="PrintContractTask" swimlane="service"></task>

<transition name="PrintContract" to="end">

<action name="action"

class="com.myapp.action.MessageActionHandler">

<message>Finish the process instance now.</message>

</action>

</transition>

</task-node>

<end-state name="end"></end-state>

</process-definition>

示例实现

结合项目必要实现,采纳开拓成果开拓一个简单利用示例。可以链接到其它文档,如示例实现的项目工程

评审标准:能简单展示开拓成果的开拓利用

上面我们定义了两个XML文件,一个是父流程,一个是子流程。下面我们说下若何应用这两个文件。首先我们要先支配这两个文件,应用子流程要留意,支配的时刻必然要先支配子流程,然后在支配父流程。

ProcessDefinition subProcess = ProcessDefinition.parseXmlResource

("subprocessdefinition/processdefinition.xml");

jbpmContext.deployProcessDefinition(subProcess);

ProcessDefinition processDefinition = ProcessDefinition.

parseXmlResource("processdefinition.xml");

jbpmContext.deployProcessDefinition(processDefinition);

支配完后,jbpm会将这两个流程定义文件保存在jbpm_processinstance表中,在调用中,与单个流程文件调用没有任何差别,我们调用PrintContract 义务的end()措施,jbpm会根据的流程文件,自动找到子流程文件所定义的义务进行履行。

应用规范

描述应用该技巧的规范(如接口设计、接口实现、框架设计、数据布局设计等)、约定、约束等

评审标准:清晰、具体描述出其利用规范澳门威尼l斯人网址

留意事变

描述设置设置设备摆设摆设、开拓等必要留意的问题,包括各类关键点和难点。可慢慢弥补

评审标准:开拓历程中碰到的关于利用开拓成果开拓的问题,大年夜部分都可以从这里找到谜底

应用子流程要留意:

要先支配子流程,然后再支配主流程,否则,主流成履行的时刻会报找不到子流程的非常

直接查看jbpm_Token或者jbpm_log无法找到流程间的关系,必要查看jbpm_processinstance表,才能找到父流程,由于 Token在脱离process state的时刻就会删除subprocessid,直接看jbpm_log也无法看出两个token之间的关系。

利用系统与jBPM的结合

成果先容

在实际开拓应用jBPM,可以采纳jBPM系统与营业澳门威尼l斯人网址系统完全分离的策略。jBPM系统只认真流程的监控和履行,营业的重心仍旧是实际营业需求。

设计思路

客户端造访系统时,统统营业相关的操作在营业系统中实现,必要流程监控的营业在jBPM流程系统中建立相关流程,供给相关流程的监控和履行接口,客户端可以经由过程这些接口对流程进行操作。

启动一个流程实例时,首先造访流程系统,取得一个新的流程实例ID。在营业系统中保存这个ID。

在进行流程监控和履行时,根据这个ID对流程实例进行操作。

若何应用

以上面购房流程为例阐明,将客户购房历程在一个Order中进行处置惩罚。

客户挂号看房,启动一个澳门威尼l斯人网址流程实例,取得流程ID,保存在Order中

贩卖职员,贩卖经理,财务职员,都可以经由过程流程系统供给的API查找当前义务,履行义务时,一方面履行流程,一方面改动Order记录。

示例实现

Order要记录流程ID。

public class Order implements Serializable {

private Long id;

private Long processId;

}

流程和营业系统的接口为OrderManager 和BpmManager。

客户看房登录时先启动一个流程。

BpmManager bpmManger=...;

Long processId=bpmManager.createProcess();

Order order=new Order();

order.setProcessId(processId);

session.save(order);

在后面的步骤中,可以根据Order的processId取得流程ID,履行流程义务。

bpmManager.executeProcessTask();

......

session.update(order);

......

留意事变

利用系统顶用户角色若何与jBPM结合

成果先容

利用系统中的用户应该与jBPM流程系统中同等,必须统一路来才能应用。一方面可以采纳用户帐号同步的策略,从营业系统复制需要的用户信息到jBPM流程系统中,另一方面可以应用共用用户账号的策略,维持最基础的用户账号自力性,营业系统从最基础的用户账号上扩展用户信息。

设计思路

因为两个系统顶用户在需求上有必然的区别,得益Hibernate的映射机制,可以应用一个用户账号表,不合映射文件,维持系统的相对自力性。

若何应用

jBPM顶用户是由identity模块供给,在实际开拓中,可以以jBPM中供给的用户表为根基,利用系统的较具体的用户信息在上面扩展。

也可以建立一个根基的用户帐号,jBPM中的用户与利用系统中的用户在它的根基上扩展。

示例实现

jBPM中User供给了几最基础的字段。

public class User extends Entity implements Principal {

private static final long serialVersionUID = 1L;

protected String password = null;

protected String email = null;

protected Set memberships = null;

public User() {

}

public User(String name) {

super(name);

}

}

Hibernate映射文件内容为:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping auto-import="false" default-access="field">

<class name="org.jbpm.identity.User"

table="JBPM_ID_USER"

discriminator-value="U">

<id name="id" column="ID_"><generator class="native" /></id>

<discriminator type="char" column="CLASS_"/>

<property name="name" column="NAME_"/>

<property name="email" column="EMAIL_"/>

<property name="password" column="PASSWORD_"/>

<set name="memberships" cascade="all">

<key column="USER_" />

<one-to-many class="org.jbpm.identity.Membership" />

</set>

<set name="permissions" cascade="all" table="JBPM_ID_PERMISSIONS">

<key column="ENTITY_" foreign-key="none" />

<element type="org.jbpm.identity.hibernate.PermissionUserType">

<column name="CLASS_"/>

<column name="NAME_"/>

<column name="ACTION_"/>

</element>

</set>

</class>

</hibernate-mapping>

这里,利用系统用户为CustomUser,这里采纳从jBPM中的User中承袭的策略,它多出一个字段carId。

public class CustomUser extends User {

private String cardId;

public String getCardId() {

return cardId;

}

public void setCardId(String cardId) {

this.cardId = cardId;

}

}

映射文件为:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping auto-import="false" default-access="field">

<subclass name="com.sample.model.CustomUser"

extends="org.jbpm.identity.User" discriminator-value="U">

<join table="CUSTOM_USER">

<key column="ID_"></key>

<property name="cardId" column="CARDID_" />

</join>

</subclass>

</hibernate-mapping>

这里,CustomUser是从jBPM中的User承袭的。

jBPM当前版本的稳定性评估

成果先容

经由过程官方jbpmRoadMap以及jbpm jira上面所写的计划,得出今朝jbpm的版本更新速率将会对照频繁,计划上说将在今年事尾完成jbpm4.0,今朝版本已经更新到jbpm3.2.1版本,而且从jira上发明jbpm3.3的版本也在快速开拓中。而且从jira上看,今朝版本进级主如果bug的改动和功能的完善。

流程履行步骤耗时阀值和自动提醒设置

成果先容

Jbpm内置调整功能, jbpm的调整部分分为2块,timer主如果流程设计职员的事情,将timer放置到流程中;scheduler是jbpm自己掩护的,我们只必要在后台进行调用即可。

设计思路

流程履行可以建立或删除准时器. 准时器寄放在一个timer store里. 当一个准时器的运行必须先从timer store里面取得并且在根据指定的光阴来启动该准时器

Jbpm光阴治理思路整体来说实现的异常清晰:

1、引擎解析流程定义xml时,给响应的事故挂接上create-timer 和 cancel-timer动作

2、流程实例实际运转时,create-timer动作在响应事故触发时履行

3、create-timer在job表里插入响应光阴job记录,给该job记录附上谋略完毕的履行光阴

4、JobExecutorServlet在后台启动一到多个JobExecutorThread线程

5、JobExecutorThread线程不绝的每隔一段光阴对job表扫描一次,找出必要履行的job记录,履行之

6、只履行一次的job记录,履行完毕后删除之;重复履行的job记录,写入新的履行光阴,更新之

7、响应事故触发cancel-timer动作,将对应job记录从job表里删除

若何应用

jBPM经由过程准时器(timer)实现日程调整。在node中加入timer元素,即可实现基于准时器的节点履行监控,实现自动提醒功能。

jbpm供给了2种调用scheduler的措施:

一种是用在web利用的,采纳org.jbpm.scheduler.impl.SchedulerServlet,详细的措施这个类的javadoc有很好的示例,我们只需在web.xml中加载它就行了;

另一种是针对的c-s法度榜样,jbpm供给了一个很好的示例

org.jbpm.scheduler.impl.SchedulerMain,我们可以参照它编写我们自己的Scheduler。

实例实现

最轻易的措施指定一个准时器是在节点里加入准时器元素.

运用action的timer的例子

<state name='catch crooks'>

<timer name='reminder' duedate='3 business hours' repeat='10 business minutes'

transition='time-out-transition' >

<action class='the-remainder-action-class-name' />

timer>

state>

运用script的timer的例子

<state name='catch crooks'>

<timer name='reminder' duedate='3 business hours' repeat='10 business minutes'

transition='time-out-transition' >

<script>Sys澳门威尼l斯人网址tem.out.println(new Date())script>

timer>

state>

在上例中,一旦流程实例运行进入state 'catch crooks',准时器reminder即被创建。该准时器延迟3 business hours开始履行动作,每10 business minutes重复履行一次,到期后顿时履行action类中的Java代码,然后实施time-out-transition(或script打印光阴)迁移。

经由过程在事故的action中加入create-timer和cancel-timer动作,可以分手实现事故对准时器的创建和取消。

准时器timer可以被用于decision fork join node process-state state super-state task-node等节点,可以设置开始光阴duedate和频率repeat,准时器动作可所以所支持的任何动作元素,如action或script,会运行我们设置的动作。准时器经由过程动作创建和取消,有两个动作元素create-timer和cancel-timer。事实上,默认的准时器元素只是create-timer动作依赖于node-enter事故、cancel-timer动作依赖于node-leave事故的一个大略表示。

说说全部历程:

1、令牌进入节点catch crooks

2、timer被触发(实际这时是在履行create-timer动作)

3、3 business hours后 timer 事故触发

4、定义的action被履行

5、令牌顺着time-out-transition路径脱离catch crooks节点

6、cancel-timer动作被履行即timer终止(没有给repeat的时机)

另注: 运用timer要先启动scheduler,假如是web项目则只要在web.xml中设置设置设备摆设摆设JbpmThreadsServlet,这样在项目启动后会自动开启scheduler。

JbpmThreadsServlet设置设置设备摆设摆设如下:

<!-- JbpmThreadsServlet -->

<servlet>

<servlet-name>JbpmThreadsServletservlet-name>

<servlet-class>org.jbpm.web.JbpmThreadsServletservlet-class>

<load-on-startup>1load-on-startup>

servlet>

<servlet-mapping>

<servlet-name>JbpmThreadsServletservlet-name>

<url-pattern>/threadsurl-pattern>

servlet-mapping>

留意事变

对time节点来说 name、repeat、transition都是可选属性。对一个流程定义来说,每一个time节点的name必须独一,假如你不定义name属性,引擎会默认把node节点的name赋给timer。在上面这个例子里,假如你不定义timer节点的name,则它的name就会是catch crooks。说说repeat属性,假如你不定义它,则timer就会只履行一次动作不会重复履行。transition属性,假如定义了这个属性,流程令牌会在timer履行动作完毕后,顺着这个路径脱离node节点。以是在上面这个例子里,只管定义了repeat属性,action照样会只履行一次。

action节点,可选,即timer节点在光阴到时履行的动作,可所以随意率性action类型,包括script。留意与光阴有关的两种action类型:create-timer 和 cancel-timer。着实一个timer节点在被引擎解释时便是被分化为create-timer 和 cancel-timer两个action,create-timer挂接到node-enter事故中,cancel-timer挂接到node- leave事故中。action节点最多只可以挂一个。

传阅功能的实现

成果先容

传阅功能是治理系统中对照常见的一个功能,这里应用jbpm实现该功能。

设计思路

这里经由过程应用jbpm的transition来实现传阅功能。

若何应用

关于jbpm的transition应用很简单,大年夜家可以参考jbpm用户指南

示例实现

<task-node name="Coding">

<task name="Coding"swimlane="programmer"/>

<transition name="to_CodeReview" to="Code Review">

</transition>

<transition name="to_IntegratedTest" to="IntegratedTest">

</transition>

</task-node>

<task-node name="Code Review">

<task name="Review Code" swimlane="manager"/>

</task>

<transition name="to_Coding" to="Coding"></transition>

</task-node>

上面是一个“代码反省”的类似传阅的流程,法度榜样员编写完代码之后必要传给manager进行代码检察,manager检察完毕必要发还给法度榜样员。

您可能还会对下面的文章感兴趣: