1、命令模式在Jbpm的使用,有助于管理各命令的执行,也方便方便接口处理,如下:
protected int getJobCount() {
return processEngine.execute(new Command<Integer>() {
private static final long serialVersionUID = 1L;
public Integer execute(Environment environment) {
org.hibernate.Session session = environment.get(org.hibernate.Session.class);
return (Integer) session.createCriteria("org.jbpm.pvm.internal.job.JobImpl")
.add(Restrictions.gt("retries", 0))
.setProjection(Projections.rowCount())
.uniqueResult();
}
});
}
以上类图只在Task处理做解释,实际上包含业务处理的所有操作(DAO)都为一个Command,如上面的getTaskCmd,其实现如下:
package org.jbpm.pvm.internal.cmd;
import org.jbpm.api.JbpmException;
import org.jbpm.api.cmd.Environment;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskImpl;
/**
* @author Alejandro Guizar
*/
public class GetTaskCmd extends AbstractCommand<Task> {
private static final long serialVersionUID = 1L;
protected String taskId;
public GetTaskCmd(String taskId) {
if (taskId==null) {
throw new JbpmException("taskId is null");
}
this.taskId = taskId;
}
public Task execute(Environment environment) throws Exception {
DbSession dbSession = environment.get(DbSession.class);
return dbSession.get(TaskImpl.class, Long.parseLong(taskId));
}
}
而以上处理中的DbSession就是hibernate的Session接口,这是在enviroment中注入的:
package org.jbpm.pvm.internal.hibernate;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.metadata.ClassMetadata;
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.history.HistoryComment;
import org.jbpm.api.task.Task;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.client.ClientExecution;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.model.HistoryCommentImpl;
import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
import org.jbpm.pvm.internal.id.DbidGenerator;
import org.jbpm.pvm.internal.job.JobImpl;
import org.jbpm.pvm.internal.job.StartProcessTimer;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.query.DeploymentQueryImpl;
import org.jbpm.pvm.internal.query.HistoryActivityInstanceQueryImpl;
import org.jbpm.pvm.internal.query.HistoryDetailQueryImpl;
import org.jbpm.pvm.internal.query.HistoryProcessInstanceQueryImpl;
import org.jbpm.pvm.internal.query.JobQueryImpl;
import org.jbpm.pvm.internal.query.ProcessInstanceQueryImpl;
import org.jbpm.pvm.internal.query.TaskQueryImpl;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskImpl;
import org.jbpm.pvm.internal.util.Clock;