jbpm例子

2009-12-16
jbpm练习小例子
文章分类:Java编程 关键字: jbpm小例子
在此非常感谢的人:linliangyi2007:http://linliangyi2007.iteye.com/blog/176345 主要是参考的是他的内容;

还有就是:http://www.blogjava.net/chengang/category/12967.html。以及网上其他的孜孜不倦贡献的人们。





这次模仿写的是:请假的流程:



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


<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="testone">

<swimlane name="bossswimlane" >
<assignment class="com.firstflow.task.BossAssignmentHandler"></assignment>
</swimlane>
<start-state name="开始">
<transition name="申请开始" to="填写病假申请单">
</transition>
</start-state>
<task-node name="填写病假申请单">
<task name="填写申请内容">
<controller>
<variable name="days"></variable>
</controller>
<assignment class="com.firstflow.task.NewLeaveAssignmentHandler">
</assignment>
</task>
<transition to="天数判定" name="病假申请填写完成"></transition>
</task-node>

<decision name="天数判定">
<transition to="经理审批" name="天数小于5天">
<condition expression='#{days lt 5}'></condition>
</transition>
<transition to="总经理审批" name="天数大于或等于5天">
<condition expression='#{days ge 5}'></condition>
</transition>
</decision>
<task-node name="经理审批">
<task name="经理开始审批">
<controller>
<variable name="fork"></variable>
</controller>
<assignment actor-id="manager" ></assignment>
</task>
<transition to="总经理审批" name="经理审批通过"></transition>
<transition to="结束" name="经理审批未通过"></transition>
</task-node>

<task-node name="总经理审批">
<task name="总经理开始审批" swimlane="bossswimlane"></task>
<transition to="发通知" name="总经理审批通过"></transition>
<transition to="结束" name="总经理审批未通过"></transition>
</task-node>

<node name="发通知">
<action class="com.firstflow.action.NoteProcessActoinHandler"></action>
<transition to="结束"></transition>
</node>

<end-state name="结束"></end-state>
</process-definition>





现在再定义相应的类:

BossAssignmentHandler : 动态委派总经理审批的类


public class BossAssignmentHandler implements AssignmentHandler {

/**
*
*/
private static final long serialVersionUID = 8742291098601946988L;

@Override
public void assign(Assignable assignable, ExecutionContext executionContext)
throws Exception {
/*
* 动态委派
*/
ContextInstance ci = executionContext.getContextInstance();
String user = (String)ci.getVariable("boss");
//由于 参数“boss”这里没有添加。所以在这里就写死。。。
assignable.setActorId("boss");

}

}


NewLeaveAssignmentHandler 给发起申请的人的任务



public class NewLeaveAssignmentHandler implements AssignmentHandler {

/**
* 填写申请
*/
private static final long serialVersionUID = 8742291098601946988L;


@Override
public void assign(Assignable assignable, ExecutionContext executionContext)
throws Exception {
/*
* 将填写申请单的任务分配给流程发起人
*/
ContextInstance ci = executionContext.getContextInstance();
String user = (String)ci.getVariable("actor");
assignable.setActorId(user);

}

}



NoteProcessActoinHandler 审批通过 发通知的类



public class NoteProcessActoinHandler implements ActionHandler {

/**
*
*/
private static final long serialVersionUID = -7942030378343202920L;


@Override
public void execute(ExecutionContext executionContext) throws Exception {

ContextInstance ci = executionContext.getContextInstance();
String user = (String)ci.getVariable("actor");
Integer days = (Integer)ci.getVariable("days");
System.out.println(new Date() + " 员工 " + user + " 请假 " + days + " 天, 已批准!!!");
/*
* 这句别漏了,否则流程不会向下走哒
*/
executionContext.leaveNode();

}

}





当这些都定义好之后。就是要发布这个流程到数据库中了。



DesployTest1 类就是把流程发布到数据库中去,当然首先要一点就是你先要把jbpm的类映射到数据库中去。


public class DesployTest1 {

/**
* @param args
*/
public static void main(String[] args) {
JbpmConfiguration config = JbpmConfiguration.getInstance();

// 创建一个 jbpm 容器

JbpmContext jbpmContext = config.createJbpmContext();

// 由 processdefinition.xml 生成相对应的流程定义类 ProcessDefinition

InputStream is = null;
try {
is = new FileInputStream("src/main/jpdl/firstflow1/processdefinition.xml");
} catch (FileNotFoundException e) {

e.printStackTrace();
}
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);

// 利用容器的方法将流程定义数据部署到数据库上

jbpmContext.deployProcessDefinition(processDefinition);

// 关闭 jbpmContext

jbpmContext.close();
System.out.println("OK");


}

}



现在就是测试类了:



MyFlowProcessDBTest 就是测试的类



public class MyFlowProcessDBTest {
/*
* 初始化jBPM配置
* 包含对Hibernate的数据库初始化
*/
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
public static void main(String[] args){
MyFlowProcessDBTest test = new MyFlowProcessDBTest();
test.testApplication();
// test.test6000YuanApplication();
// test.test7000YuanApplication();
}

public void testApplication(){
ProcessInstance pi = createProcessInstance("lecord");
submitApplication("lecord" , 6);
approveByManager(true);
approveByBoss(true);
checkTasks(pi);
}

/**
* 生成流程实例
*/
protected ProcessInstance createProcessInstance(String user){
System.out.println("==请假流程开始==");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
GraphSession graphSession = jbpmContext.getGraphSession();
/*
* 从数据库获取指定的流程定义
*/
ProcessDefinition pdf = graphSession.findLatestProcessDefinition("testone");
//生成流程实例
ProcessInstance pi = pdf.createProcessInstance();
//设置流程发起人
pi.getContextInstance().createVariable("actor", user);
//触发流程转向
pi.signal();
/*
* 保存流程实例
*/
jbpmContext.save(pi);
return pi;
}finally{
jbpmContext.close();
}
}

/**
* 填写提交申请单
* @param money
*/
@SuppressWarnings("unchecked")
protected void submitApplication(String actorId , int days){
System.out.println("==填写请假内容==");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
/*
*根据操作者ID,获取属于该操作者的任务集
*/
List<TaskInstance> taskInstances = jbpmContext.getTaskList(actorId);
for(TaskInstance ti : taskInstances){
System.out.println(ti.getCreate());
System.out.println("ti.name = " + ti.getName());
System.out.println("ti.actor = " + ti.getActorId());
ContextInstance ci = ti.getContextInstance();
ci.setVariable("days",new Integer(days));
ti.end();
}
}finally{
jbpmContext.close();
}
}

/**
* 部门经理审批
* @param pass
*/
@SuppressWarnings("unchecked")
protected void approveByManager(boolean pass){
System.out.println("==经理审批==");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try{
List<TaskInstance> taskInstances = jbpmContext.getTaskList("manager");
System.out.println(taskInstances.size()+"-------经理该审批的taskInstances---------");

for(TaskInstance ti : taskInstances){
System.out.println("ti.name = " + ti.getName());
System.out.println("ti.actor = " + ti.getActorId());
if(pass){
ti.end("经理审批通过");
}else{
ti.end("经理审批未通过");
}
}
}finally{
jbpmContext.close();
}
}

/**
* 总经理审批
* @param pass
*/
@SuppressWarnings("unchecked")
protected void approveByBoss(boolean pass){
System.out.println("==总经理审批==");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try{
List<TaskInstance> taskInstances = jbpmContext.getTaskList("boss");
for(TaskInstance ti : taskInstances){
System.out.println("ti.name = " + ti.getName());
System.out.println("ti.actor = " + ti.getActorId());
if(pass){
ti.end("总经理审批通过");
}else{
ti.end("总经理审批未通过");
}
}
}finally{
jbpmContext.close();
}
}
}





这个只是模仿的做的。还有很多的不足。引用了别人的成功希望别介意哦。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值