如果需求很“变态”,那我们可以试着扩展 jBPM,它很容易被扩展,比如事件监听器、自定义活动和 Java 代码活动等等。
假设我们这里需要定制任务的查询,基于多个属性来作为查询条件。
目前的任务服务(TaskService)要实现这个功能比较麻烦,我们可以扩展 jBPM4 的命令服务,来实现自定义查询任务的命令:
public class CustomTaskQueryCommand implements Command<List<Task>> {
/**
* 任务优先级
*/
private int taskPriority;
/**
* 任务描述
*/
private String taskDescLike;
/**
* 任务开始时间
*/
private Date taskCreateFrom;
/**
* 任务结束时间
*/
private Date taskCreateTo;
/**
* 利用构造函数获取过滤参数(条件)
*
* @param taskPriority 优先级
* @param taskDescLike 描述
* @param taskCreateFrom 创建时间条件的起始时间
* @param taskCreateTo 创建时间条件的结束时间
*/
public CustomTaskQueryCommand(int taskPriority, String taskDescLike, Date taskCreateFrom, Date taskCreateTo) {
this.taskPriority = taskPriority;
this.taskDescLike = taskDescLike;
this.taskCreateFrom = taskCreateFrom;
this.taskCreateTo = taskCreateTo;
}
@Override
public List<Task> execute(Environment environment) throws Exception {
Session session = environment.get(Session.class);//获取 hibernate 会话
Criteria criteria = session.createCriteria(TaskImpl.class);
//任务映射属性名称可参见 jbpm.task.hbm.xml
if (taskPriority != 0) {
criteria.add(Restrictions.eq("priority", taskPriority));
}
if (taskDescLike != null) {
criteria.add(Restrictions.like("description", "%" + taskDescLike + "%"));
}
if (taskCreateFrom != null && taskCreateTo != null) {
criteria.add(Restrictions.between("createTime", taskCreateFrom, taskCreateTo));
}
//执行查询
List<?> list = criteria.list();
return (List<Task>) list;
}
}
CustomTaskQueryCommand 实现了 Command 接口,并在 execute 方法中,通过 Environment 对象获取了 Hibernate 的 Session 对象,接下来就可以对数据进行多条件过滤查询啦O(∩_∩)O哈哈~
单元测试:
public class CustomTaskQueryCommandTest extends JbpmTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
//创建任务并设置优先级与描述
create("生产", Priority.HIGH, "生产任务");
create("包装", Priority.LOW, "包装任务");
create("运输", Priority.HIGHEST, "运输任务");
}
@Test
public void test(){
Calendar from=Calendar.getInstance();
from.set(2018,1,1);
Calendar to=Calendar.getInstance();
to.set(2018, 5, 30);
Command<List<Task>> command=new CustomTaskQueryCommand(Priority.HIGHEST,
"运输",from.getTime(),to.getTime());
List<Task> tasks= Configuration.getProcessEngine().execute(command);
assertEquals(1, tasks.size());
final Task task = tasks.get(0);
assertEquals("运输", task.getName());
assertEquals("运输任务",task.getDescription());
}
/**
* 创建任务
*
* @param name 任务名
* @param priority 优先级
* @param desc 描述
* @return
*/
private void create(String name, int priority, String desc) {
Task task = taskService.newTask();
task.setName(name);
task.setPriority(priority);
task.setDescription(desc);
taskService.saveTask(task);
}
}
单元测试中,我们先在 setUp() 方法中创建几个测试用的任务,接下来在测试方法中实例化自定义的命令类,然后从 Configuration.getProcessEngine()
中获取的 ProcessEngine 对象中执行命令。
扩展 jBPM 是不是很简单呀O(∩_∩)O哈哈~
网友评论