jbpm(5)---decision节点的expr方式和handler方式

流程图如下:


问题:填写请假单后,如果请假天数大于3天则经理审批,如果小于3天则主管即可审批。填写请假信息后,下一步节点该如何走,可以通过decision分支节点决定

而decision决策分支节点有两种方式,一种是配置expr表达式方式是,一种是指定Handler类即指定一个java类进行处理。


方式1:通过expr表达式方式

注:表达式的结果不是true或false,而是下一个输出节点的name,如上图的to 主管审批或to 经理审批

配置方式如下:


1.1、发布流程定义


package com.cn.test;

import com.cn.util.JbpmUtil;

/**
 * 发布流程定义
 * 流程定义processDefinition,流程定义是规则,规则就是没有数据的描述
 * 
 * */
public class DeployProcessDefinition {
	public static void main(String[] args) {
		//发布流程定义
		JbpmUtil.delopy("jpdl/qingJia2.jpdl.xml");
		
	}
}

1.2、启动流程实例

package com.cn.test;

import org.jbpm.api.ExecutionService;

import com.cn.util.JbpmUtil;

/**
 * 启动流程实例以及流程流转
 * */
public class startProcessInstance2 {
	public static void main(String[] args) {
		ExecutionService executionService=JbpmUtil.getExecutionService();
		//1.启动流程实例
		executionService.startProcessInstanceById("qingJia2-2");
	}
}

此时流程节点处于:填写请假单节点


1.3、传递流程变量,供决策分支节点decision进行判断

package com.cn.test;

import java.util.HashMap;
import java.util.Map;

import org.jbpm.api.ExecutionService;

import com.cn.util.JbpmUtil;

/**
 * 启动流程实例以及流程流转
 * */
public class startProcessInstance2 {
	public static void main(String[] args) {
		ExecutionService executionService=JbpmUtil.getExecutionService();
		//1.启动流程实例
		//executionService.startProcessInstanceById("qingJia2-2");
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("days", 5);
		//2.流程流转到decision节点
		executionService.signalExecutionById("qingJia2.120001", map);
	}
}
此时,根据decision的expr:#{days>5?'to 经理审批':'to 主管审批'}即传递的流程局部变量days大于5天,则走经理审批,小于等于5天,则走主管审批节点。
查看数据库表结果,显示





方式2:通过decision的handler方式:

上面是通过decision的expr方式,那么如果是下面的这个流程图呢,用三元运算符怎么写疑问,太复杂了,所有实际开发中大多采用handler方式进行。




1、在src下新建包com.cn.handler,并创建类MyHandler,代码如下:

package com.cn.handler;

import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;

public class MyHandler implements DecisionHandler{
	/**
	 * 
	 */
	private static final long serialVersionUID = 2921491957122619758L;

	/**
	 * 返回值:当前输出路径的名称
	 * execution参数:当前正在执行的流程实例
	 * */
	@Override
	public String decide(OpenExecution execution) {
		Integer score=(Integer) execution.getVariable("score");
		if(score>=90){
			return "to 优秀";
		}else if(score<90 && score>=70){
			return "to 中等";
		}else if(score<70 && score>=60){
			return "to 及格";
		}else{
			return "to 不及格";
		}
	}

}

2、在流程图decision节点配置Handler,如下图:




3、发布流程定义
package com.cn.test;

import com.cn.util.JbpmUtil;

/**
 * 发布流程定义
 * 流程定义processDefinition,流程定义是规则,规则就是没有数据的描述
 * 
 * */
public class DeployProcessDefinition {
	public static void main(String[] args) {
		//发布流程定义
		JbpmUtil.delopy("jpdl/kaoshi.jpdl.xml");
		
	}
}



4、启动流程实例,进行考试

package com.cn.test;

import com.cn.util.JbpmUtil;

/**
 * 发布流程定义
 * 流程定义processDefinition,流程定义是规则,规则就是没有数据的描述
 * 
 * */
public class DeployProcessDefinition {
	public static void main(String[] args) {
		//发布流程定义
		JbpmUtil.delopy("jpdl/kaoshi.jpdl.xml");
		
	}
}

会在jbpm4_execution中产生一条数据
 

5、传递流程局部变量

package com.cn.test;

import java.util.HashMap;
import java.util.Map;

import org.jbpm.api.ExecutionService;

import com.cn.util.JbpmUtil;

/**
 * 启动流程实例以及流程流转
 * */
public class startProcessInstance2 {
	public static void main(String[] args) {
		ExecutionService executionService=JbpmUtil.getExecutionService();
		//1.启动流程实例
		//executionService.startProcessInstanceById("kaoshi-1");
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("score", 85);
		executionService.signalExecutionById("kaoshi.150001", map);
	}
}

运行完后,85分会进入中等,查看数据库表如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想使用xml的方式配置声明式事务管理,可以在Spring的配置文件中加入以下内容: ```xml <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="myService" class="com.example.MyService"> <property name="jbpmTemplate" ref="jbpmTemplate"/> </bean> <bean id="jbpmTemplate" class="org.jbpm.api.JbpmTemplate"> <property name="configuration" ref="jbpmConfiguration"/> </bean> <bean id="jbpmConfiguration" class="org.jbpm.api.Configuration"> <property name="jbpmProperties"> <props> <!-- 配置jbpm的属性 --> </props> </property> </bean> ``` 在以上配置中,`<tx:annotation-driven>`用于启用声明式事务管理,`transaction-manager`属性指定了事务管理器,`<bean>`元素定义了MyService、JbpmTemplate和JbpmConfiguration等bean,在这些bean的定义中可以通过`<property>`元素注入依赖关系。 如果你想使用xml的方式手动控制事务的边界,可以使用Spring提供的TransactionTemplate类。例如: ```xml <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="myService" class="com.example.MyService"> <property name="jbpmTemplate" ref="jbpmTemplate"/> <property name="transactionTemplate" ref="transactionTemplate"/> </bean> <bean id="jbpmTemplate" class="org.jbpm.api.JbpmTemplate"> <property name="configuration" ref="jbpmConfiguration"/> </bean> <bean id="jbpmConfiguration" class="org.jbpm.api.Configuration"> <property name="jbpmProperties"> <props> <!-- 配置jbpm的属性 --> </props> </property> </bean> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean> ``` 在以上配置中,`<bean>`元素定义了MyService、JbpmTemplate和JbpmConfiguration等bean,在这些bean的定义中可以通过`<property>`元素注入依赖关系。其中,`transactionManager`属性指定了事务管理器,`transactionTemplate`属性指定了事务模板。在MyService类中使用TransactionTemplate来控制事务的边界,例如: ```java @Service public class MyService { @Autowired private JbpmTemplate jbpmTemplate; @Autowired private TransactionTemplate transactionTemplate; public void doSomething() { transactionTemplate.execute(new TransactionCallback<Void>() { @Override public Void doInTransaction(TransactionStatus status) { // 在这里执行业务逻辑 jbpmTemplate.execute(...); return null; } }); } } ``` 这样写代码时,如果在transactionTemplate.execute方法内部出现异常,事务会自动回滚。如果在execute方法外部出现异常,事务也会回滚。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值