创建一个事务,jbpm都是在一个事务中完成的
JbpmContext jbpmContext =
JbpmConfiguration.getInstance().createJbpmContext();
----中间写点东西
jbpmContext.close();
我们其实可以在web.xml里面配置一个选项,那么我们就不用创建流程和关闭流程了
也就是
JbpmContext jc = JbpmConfiguration.getInstance().getCurrentJbpmContext();
代替 :
JbpmContext jc = JbpmConfiguration.getInstance().createJbpmContext();
<servlet>
<servlet-name>CloseJbpmConfigurationServlet</servlet-name>
<servlet-class>org.jbpm.web.CloseJbpmConfigurationServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>JbpmContextFilter</filter-name>
<filter-class>org.jbpm.web.JbpmContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JbpmContextFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
注意:loadTaskInstance和loadProcessInstance 的工作其实可以调用
jbpmContext.loadTaskInstance(123);
jbpmContext.loadProcessInstance(123);
jbpmContext.save(processInstance);
他会去委托相应的session来完成
-----------Session--------------------------------------------------------------
Session , GraphSession , TaskMgmtSession
GraphSession graphSession = jbpmContext.getGraphSession();
Session session = jbpmContext.getSession();
其中GraphSession对于维护Jbpm的表,因为jbpm的xml对我们来说就是一个图(至少eclipse中是)
而Session是管理jbpm以外的表的
所以graphSession可以部署流程定义(其实就是save到jbpm的表里面嘛)
graphSession.deployProcessDefinition(processDefinition);//部署流程定义,如果已经存在同名的定义,则版本号会自动累加
graphSession.loadProcessDefinition(processDefinitionId);
graphSession.findLastestProcessDefinition("xxx");
graphSession.saveProcessDefinition(pd);
而session可以增删改查普通数据表
session.save(qingjiaForm);
session.load(QingjiaForm.class,Long.parseLong(id));
TaskMgmtSession tackMgmtSession = jbpmContext.getTaskMgmtSession();
这个session是用来和jbpm数据库表中的与工作相关的东西打交道的
//只能获取尚未完成的任务列表
//得到这个用户的所有taskInstance,这个userId就是assigment里面的actor-id
List list = taskMgmtSession.findTaskInstance(userId);
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(id);
---------------ProcessDefinition----------------------------------------------------------
ProcessDefinition这个对象是拥有xml信息的对象
从文件中拿到
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlResource("org/ministone/training/jbpm/processdefinition.xml");
ProcessDefinition pd =
ProcessDefinition.parseParZipInputStream(new ZipInputStream(file.getInputStream()));
从数据库中拿到
ProcessDefinition processDefinition =
graphSession.loadProcessDefinition(processDefinitionId);
ProcessDefinition processDefinition =
graphSession.findLastestProcessDefinition("xxx");
从字符串中拿到
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlString("<xxxx><xxx>xx<xxx>");
pd.getFileDefinition().getBytes(String name); //这个是从数据库中获取文件的字节流,需要传入文件的名字
Map bytesMap = pd.getFileDefinition().getBytesMap();//得到每一个文件
ZipOutputStream zipOutputStream
= new ZipOutputStream(resp.getOutputStream());
for(Iterator it=bytesMap.keySet().iterator();it.hasNext();){
String fname = (String)it.next();
byte[] filebytes = fd.getBytes(fname);
ZipEntry zipEntry = new ZipEntry(fname); //创建一个zip文件入口
zipOutputStream.putNextEntry(zipEntry);//使得入口和outputStream相连
zipOutputStream.write(fileBytes);
zipOutputStream.closeEntry();
}
zipOutputStream.finish();
zipOutputStream.flush();
zipOutputStream.close();
------------------ProcessInstance---------------------------------------------------------------
ProcessInstance是根据processDefinition给new出来的,他相当于xml的动态部分,
也就是有状态的ProcessInstance
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
jbpmContext.save(processInstance); //一般是在开始加载流程的时候弄
--------------taskInstance-----------------------------------------
if(taskInstance.getStart()==null)
taskInstance.start(); //标识一个任务的执行开始:任务的开始时间被填充,看成提交申请
//taskInstance.end();//任务结束时间被填充,下一个节点的初始化,前一个任务的结束和下一个节点的开始在一个事物内,可以看成事审批申请
jbpmContext.save(taskInstance);//记住:驱动完成之后还要save
--------------------创建数据库---------------------------------------
JbpmConfiguration.getInstance().createSchema(); //创建数据库
JbpmConfiguration.getInstance().dropSchema();
pi.signal(); 与 ti.end()的区别
联系: 他们都是调用了rootToken.signal()方法,
区别: ti.end()里面有这样一段代码
this.end = Clock.getCurrentTime(); //这个是对时间做了处理
而我们取代办任务列表的时候List list = taskMgmtSession.findTaskInstance(userId);
他的依据是if(end == null){获取}他不管流程的位置的
-----------------xml----------------------------------------------------
<process-definition name="qingjia" >
<start-state name="start-state1">
<transition to="fillform"></transition>
</start-state >
<task-node name="fillform">
<task name="fill form">
<assignment actor-id="1"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
</task>
<transition to="mgr audit"></transition>
</task-node>
<task-node name="mgr audit">
<task name="mgr audit">
<assignment actor-id="2"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
</task>
<transition to="end-state"></transition>
</task-node>
<end-state name="end-state"></end-state>
</process-definition>
流程角色 swimlane
<swimlane name="starter">
<assignment actor-id="1"/>
</swimlane>
然后
<task name="fill form">
<assignment actor-id="1"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
</task>
就可以变成
<task name="fill form" swimlane="starter">
</task>
用变量传递参与者id
<task-node name="collectform">
<task>
<assignment class="com.zwz.UserIdAssigmentHandler" /> ---通过这个类和上一个参数来动态加载这个actor-id
<assignment actor-id="#{userid}"/>
</task>
<transition name="auditfork" to="auditfork" />
</task-node>
Handler 实现
public class UserIdAssigmentHandler implements AssignmentHandler{
public void assign(Assignable assignable,ExecutionContext executionContext){
// String actorid = (String)executionContext.getVariable("userid");
String currentActorId = (String)executionContext.getProcessInstance().getContextInstance().getVariable("currentId");
//先得到当前的id,然后再通过业务逻辑,找到相应的处理者,然后设置进去
assignable.setActorId(this.getRealActorId(currentActorId)); //把我们需要的actor-id放进去
}
}
String currentActorId = (String)executionContext.getProcessInstance().getContextInstance().getVariable("currentId");
这一句依赖于上一个页面有:
taskInstance.getProcessInstance().getContextInstance().setVariable("currentId","34");
<task>
<assignment actor-id="#{userid}"/>
</task>
这样也可以
但是在到达这个tack前需要设置
pi.getContextInstance().setVariable("userid",xxx);
这样的话,assignement的执行者就会被自动赋值上
List list = ti.getTask().getTaskNode().getLeavingTransitions();
这个可以得到TaskNode的所有trans,因为有时候会有多个trans
-----------------------------------------------------------------------
--------------节点介绍-----------------------------------
start-state 这个节点可以指定task 但是不能指定task里面的actor
public TaskInstance createStartTaskInstance()
{
TaskInstance taskInstance = null;
Task startTask = taskMgmtDefinition.getStartTask();
if(startTask != null)
{
Token rootToken = processInstance.getRootToken();
ExecutionContext executionContext = new ExecutionContext(rootToken);
taskInstance = createTaskInstance(startTask, executionContext);
taskInstance.setActorId(SecurityHelper.getAuthenticatedActorId()); //这里actorId被覆盖了
}
return taskInstance;
}
那么如何设置这个被认证过的id呢?
jbpmContext.setActorId((String)session.getAttribute("actorId"));
TaskInstance ti = pi.getTaskMgmtInstance().createStartTaskInstance();//这里就得到了在start里面的任务
ti.start();
ti.end(); //一般第一个start节点就是做些初始化准备工作,所以连续的start,end
在start-state里面还可以指定swimlane,而且这个swimlane都不用写assigment,因为这个任务的执行者也是通过set进去的
<swimlane name="starter"></swimlane> 这样就可以直接用
<start-state name="start-state1">
<task name="填申请单" swimlane="starter" ></task>
<transition to="fillform"></transition>
</start-state >
---------------------------------------------
jbpm.cfg.xml
<jbpm-configuration>
<string name="jbpm.files.dir" value="d:/" /> ---这个配置意思是把流程定义存到指定的目录下面而不是数据库中
</jbpm-configuration>
分享到:
相关推荐
jbpm-api-4.4.jar..................................................................................................................................................
jbpm还提供了API和工具,如jbpm-explorer和jbpm-console,帮助用户管理和操作流程实例。 总的来说,jbpm是一个强大的业务流程管理工具,适用于需要自动化和优化业务流程的企业或项目。jbpm 4.4版本是其历史版本中的...
1. **jbpm-jpdl.jar**:这是jPDL的核心程序包,包含了流程定义和运行时流程实例管理的API。它可以将流程定义存储为XML文件并在内存中管理执行过程。 2. **jbpm-jpdl-designer-3.1.2.zip**:这是一个基于Eclipse的...
jbpm由几个关键部分组成,包括工作流引擎、工作流设计工具(jbpm-designer)、持久化机制(如JPA或Hibernate)、以及各种服务和API。这些组件通常被打包成不同的jar文件,以供不同功能的需求。 1. **核心jar包**:...
jbpm-gpd-site 4.4.zip 是一个与jbpm(Java Business Process Management)相关的压缩文件,它包含的是jbpm-eclipse插件的特定版本,适用于jbpm 4.4框架。jbpm是一个开源的工作流管理系统,用于设计、执行和管理业务...
除了核心引擎,jbpm还提供了丰富的API和工具集,包括一个基于Web的流程设计器,使得非技术背景的业务人员也能参与到流程的设计中来。此外,jbpm还支持与其他Java企业级框架如Spring的集成,方便在现有企业应用中嵌入...
为了使用jbpm-jpdl-3.2.3,你需要按照文档中的步骤配置环境,如添加必要的依赖,然后可以通过创建JPDL文件来定义你的业务流程,并使用jbpm提供的API或者工具启动和管理这些流程。这将帮助你实现企业的业务自动化,...
1. **jbpm框架介绍**:jbpm是一个开源的工作流管理系统,它提供了一整套工具和服务,用于设计、部署和执行业务流程。jbpm4.4是该框架的一个早期版本,它支持BPMN(Business Process Modeling Notation)2.0标准,这...
在这个part02的压缩包中,可能包含的文件有流程定义文件(.bpmn或.jpdl)、配置文件、Drools规则文件、示例流程、库文件、API文档以及可能的升级或补丁。通过解压和研究这些文件,开发者可以深入理解jbpm-4.4的内部...
4. **kie-server**:Kie Server是jBPM服务的运行时环境,它提供了RESTful API,使得其他应用程序和服务能远程调用jBPM的功能,如启动流程实例、查询流程状态、执行规则和决策服务等。 5. **数据存储**:jBPM使用...
3. **服务API**:jbpm-services-api-7.3.0.Final.jar提供了jBPM服务的API,允许开发者与jBPM引擎进行交互,如启动流程实例、查询流程状态、干预任务处理等。 4. **审计与日志**:jbpm-audit-7.3.0.Final.jar和jbpm-...
7. **jbpm-persistence-jpa-5.4.0.Final.jar**:包含了对JPA(Java Persistence API)的支持,用于存储和检索流程实例、任务和其他相关数据到关系数据库中。 8. **jbpm-bam-5.4.0.Final.jar**:业务活动监控...
【jbpm-gpd-site.zip】是一个与jbpm(JBoss Business Process Management)相关的压缩文件,...在实际开发中,开发者还需要了解如何配置jbpm服务器,设置数据源,以及如何使用工作流API来启动、监控和管理流程实例。
10. **与其他技术的集成**:jBPM能够与各种Java EE组件(如EJB、JMS、JPA)以及Spring等轻量级框架集成,提供了丰富的API和工具,方便开发者构建完整的业务流程解决方案。 综上所述,jbpm-4.3-src的源代码包为...
- jbPM和Activiti的API和概念:如流程定义、流程实例、任务管理、事件监听器等。 - 集成jbPM/Activiti与Spring、Hibernate等Java框架的方法。 - MEAN全栈开发:了解MongoDB的数据模型,Express的路由和中间件,...
- `www.pudn.com.txt`:可能是一个下载来源或说明文档,详细介绍了jBpm 3.1.2的获取途径和相关信息。 - `jbpm-3.1.2`:这可能是一个解压后的目录,其中可能包括了jBpm 3.1.2的源代码、库文件、文档、示例和其他资源...
【voms-api-java.zip】描述的是VO(Virtual Organization)Management System(VOMS)的Java API,这是一个用于验证和请求VOMS属性证书的工具。VOMS是高能物理领域常用的一种身份管理和认证系统,它扩展了X.509证书...
lib目录包含了jbpm-designer运行所需的库文件,包括jbpm核心库、Java EE相关库、图形处理库以及第三方服务的API等。这些库文件确保了jbpm-designer能够正确解析和执行工作流定义,同时也支持与其他系统和服务的集成...
在实际开发中,通常会将这些JAR文件添加到项目的类路径中,以便能够使用JBPM提供的API来设计、部署和执行流程。例如,可以使用流程定义语言(如BPMN)来创建流程模型,然后通过JBPM的API将其部署到工作流引擎。在Web...