说说如何扩展 jBPM 实现“变态”需求

如果需求很“变态”,那我们可以试着扩展 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哈哈~

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/80198316