Java最全JBPM学习(六):详解流程图,2024必看

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

processEngine.getTaskService().assignTask(taskId, userId);

–>组任务的分配

1.  使用流程变量:assignee=“#{userIdsString}” // 要是String型的变量,多个候选人之前用’,'隔开

2. AssignmentHandler:assignable.addCandidateUser(userId);// 添加组任务的候选人

a) 需要在.jbdl.xml的元素中写

b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口

c) 在AssignmentHandlerImpl类中可以使用assignable.addCandidateUser(userId),添加组任务候选人。

3. TaskService.addTaskParticipatingUser(taskId,userId,Participation.CANDIDATE);//添加组任务的候选人

v. Decision判断活动

1. 使用expression,如:expr=“#{‘to state2’}”

2. 使用Handler,在Handler Class里配置指定的DecisionHandlerImpl类的路径

DecisionHandlerImpl.java

public class DecisionHandlerImpl implements DecisionHandler {

// 计算离开当前节点用的Transition的名称并返回
@Override
public String decide(OpenExecution execution) {
  System.out.println("DecisionHandlerImpl.decide()");
  // 获取业务数据
  Integer days = (Integer) execution.getVariable("请假天数");
  // 选择Transition
  if (days > 7) {
  	return "to 总经理审批";
  } else {
  	return "to end1";
  }
}

}

ProcessTest.java

@Test

public void test() {

// 1,部署流程定义
InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); // 当前类所在包中的文件
processEngine.getRepositoryService()//
  	.createDeployment()//
  	.addResourceFromInputStream("test.jpdl.xml", in)//
  	.deploy();
// 2,启动流程实例
Map<String, Object> variables = new HashMap<String, Object>();
// variables.put("请假天数", 10);启动流程实例后,进行到to 总经理审批环节。
variables.put("请假天数", 3);//启动流程实例后,进行到to end1环节。
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test", variables);

}

此时,如果variables.put(“请假天数”, 3);启动流程实例后,进行到to end1环节。

此时,如果variables.put(“请假天数”, 10);启动流程实例后,进行到to 总经理审批环节。

3. 如果同时配置了expression与Handler,则expression有效,忽略Handler。

vi. fork、join分支/聚合活动

public class ProcessTest {

private ProcessEngine processEngine = Configuration.getProcessEngine();
@Test
public void test() {
  // 1,部署流程定义
  InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); // 当前类所在包中的文件
  processEngine.getRepositoryService()//
  		.createDeployment()//
  		.addResourceFromInputStream("test.jpdl.xml", in)//
  		.deploy();
  // 2,启动流程实例
  ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
  System.out.println("processInstanceId = " + pi.getId());
  System.out.println("当前正在执行的活动:" + pi.findActiveActivityNames());
}

}

输出结果为:

processInstanceId = test.330007

当前正在执行的活动:[汇款, 发货]

可以看出,汇款和发货同时执行中。并且,只有当2条路线都到join活动,流程才会继续往后执行。

b) 自定义活动(custom)

i. 在元素中指定class属性为指定的类ExternalActivityBehaviourImpl

ii. 这个类要实现ExternalActivityBehaviour接口,其中有两个方法:

1. execute(ActivityExecution):节点的功能代码

2. signal(ActivityExecution, String, Map):在当前节点等待时,外部发信号时的行为

3. 在execute()方法中,可以调用以下方法对流程进行控制

a) ActivityExecution.waitForSignal():在当前节点等待。

b) ActivityExecution.takeDefaultTransition():使用默认的Transition离开,当前节点中定义的第一个为默认的。

c) ActivityExecution.take(String transitionName):使用指定的Transition离开

d) ActivityExecution.end():结束流程实例

4. 也可以实现ActivityBehaviour接口,只有一个方法execute(ActivityExecution),这样就不能等待,否则signal时会有类转换异常。

public class ExternalActivityBehaviourImpl implements ExternalActivityBehaviour {

// 到达这个活动时执行的方法
@Override
public void execute(ActivityExecution execution) throws Exception {
  System.out.println("已发送信息.");//此处写自己要执行的事件
  // 默认是执行完代码后离开当前活动,不会执行signal方法,也可以写如下代码
  // execution.takeDefaultTransition(); // 离开当前活动
  // // 使用指定名称的Transition离开当前活动
  // execution.take(transitionName);
  // 执行完后不要离开,而是要等待外部调用signal()方法时才离开
  execution.waitForSignal();
}
// 调用signal()方法离开当前节点前执行的方法(如果在execute()中直接离开当前节点了,这个方法就不会被执行)
@Override
public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {
  System.out.println("ExternalActivityBehaviourImpl.signal()");
}

}

3.事件

a) 在根元素中,或在节点元素中,使用元素指定事件,其中event属性代表事件的类型。

b) 在中用子元素,指定处理的类,要求指定的类要实现EventListener接口

c) 事件类型:

i. 元素放在根元素()中,可以指定event为start或end,表示流程的开始与结束。

最后

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

[外链图片转存中…(img-4qAKdWtx-1715318234985)]

[外链图片转存中…(img-EOfvq3ff-1715318234985)]

[外链图片转存中…(img-hysTqwT4-1715318234986)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值