- 获取待办列表:
- JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
- TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession();
- //只能获取尚未完成的任务列表(待办任务)
- List list = taskMgmtSession.findTaskInstances(userId);
下面的jbpm的源码
- public List findTaskInstances(String actorId) {
- List result = null;
- try {
- Query query = session.getNamedQuery("TaskMgmtSession.findTaskInstancesByActorId");
- query.setString("actorId", actorId);
- result = query.list();
- } catch (Exception e) {
- log.error(e);
- jbpmSession.handleException();
- throw new JbpmException("couldn't get task instances list for actor '"+actorId+"'", e);
- }
- return result;
- }
TaskMgmtSession.findTaskInstancesByActorId所对应的sql语句如下:
- <query name="TaskMgmtSession.findTaskInstancesByActorId">
- <![CDATA[
- select ti
- from org.jbpm.taskmgmt.exe.TaskInstance as ti
- where ti.actorId = :actorId
- and ti.isOpen = true
- ]]>
- </query>
可以看到jbpm并没有实现分页的处理
仅仅是把所有的记录都查询出来了
所以下面,进行了封装,实现了分页。
首先建立Page.java
- package com.eway.framework.basecomponent.services.jbpm.util;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-24
- * Time: 17:26:31
- * To change this template use File | Settings | File Templates.
- */
- public class Page {
- private int pageSize ;//每页显示的条数
- private int recordCount;//总共的条数
- private int currentPage;//当前页面
- public Page() {
- }
- public Page(int pageSize, int recordCount, int currentPage) {
- this.pageSize = pageSize;
- this.recordCount = recordCount;
- this.setCurrentPage(currentPage,"");
- }
- //构造方法
- public Page(int pageSize, int recordCount) {
- this(pageSize, recordCount, 1);
- }
- //总页数
- public int getPageCount() {
- int size = recordCount / pageSize;//总条数/每页显示的条数=总页数
- int mod = recordCount % pageSize;//最后一页的条数
- if (mod != 0)
- size++;
- return recordCount == 0 ? 1 : size;
- }
- //包含,起始索引为0
- public int getFromIndex() {
- //System.out.println("from index:"+(currentPage-1) * pageSize);
- return (currentPage - 1) * pageSize+1;
- }
- //不包含
- public int getToIndex() {
- //System.out.println("to index:"+Math.min(recordCount, currentPage * pageSize));
- return Math.min(recordCount, currentPage * pageSize);
- }
- //得到当前页
- public int getCurrentPage() {
- return currentPage;
- }//设置当前页
- /**
- *
- * @param currentPage
- * @param inner
- */
- public void setCurrentPage(int currentPage,String inner) {
- int validPage = currentPage <= 0 ? 1 : currentPage;
- validPage = validPage > getPageCount() ? getPageCount() : validPage;
- this.currentPage = validPage;
- }//得到每页显示的条数
- /**
- *
- * @param currentPage
- */
- public void setCurrentPage(int currentPage) {
- this.currentPage = currentPage;
- }
- //得到每页显示的条数
- public int getPageSize() {
- return pageSize;
- }//设置每页显示的条数
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }//得到总共的条数
- public int getRecordCount() {
- return recordCount;
- }//设置总共的条数
- public void setRecordCount(int recordCount) {
- this.recordCount = recordCount;
- }
- }
为了统一管理hibernate的session,笔者写了HibernateUtil.java
- package com.eway.framework.basecomponent.services.jbpm.util;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-26
- * Time: 12:23:03
- * To change this template use File | Settings | File Templates.
- */
- //定义一个HibernateUtil类来初始化hinernate 创建SessionFactory实例,并提供创建Session实例,关闭Session实例
- //以及打开/关闭事务 和从新创建SessionFactory实例的使用方法(所以方法都为静态)
- public class HibernateUtil {
- private static final SessionFactory sessionFactory;
- static {
- try {
- sessionFactory = new Configuration().configure().buildSessionFactory();
- } catch (Throwable ex) {
- ex.printStackTrace();
- throw new ExceptionInInitializerError(ex);
- }
- }
- public static final ThreadLocal<Session> tLocalsess = new ThreadLocal<Session>();
- public static final ThreadLocal<Transaction> tLocaltx = new ThreadLocal<Transaction>();
- /*
- getting the thread-safe session for using 取得session
- */
- public static Session currentSession() {
- Session session = (Session) tLocalsess.get();
- try {
- if (session == null || !session.isOpen()) {
- session = openSession();
- tLocalsess.set(session);
- }
- System.out.println("session.isOpen()===="+session.isOpen());
- } catch (HibernateException e) {
- e.printStackTrace();
- }
- return session;
- }
- /*
- * closing the thread-safe session 关闭session
- */
- public static void closeSession() {
- Session session = (Session) tLocalsess.get();
- tLocalsess.set(null);
- try {
- if (session != null && session.isOpen()) {
- session.close();
- }
- } catch (HibernateException e) {
- }
- }
- /*
- * begin the transaction 开始事务
- */
- public static void beginTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- if (tx == null) {
- tx = currentSession().beginTransaction();
- tLocaltx.set(tx);
- }
- } catch (HibernateException e) {
- }
- }
- // close the transaction 关闭事务
- public static void commitTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
- tx.commit();
- tLocaltx.set(null);
- } catch (HibernateException e) {
- }
- }
- // for rollbacking 事务回滚
- public static void rollbackTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- tLocaltx.set(null);
- if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
- tx.rollback();
- }
- } catch (HibernateException e) {
- }
- }
- private static Session openSession() throws HibernateException {
- return getSessionFactory().openSession();
- }
- private static SessionFactory getSessionFactory() throws HibernateException {
- return sessionFactory;
- }
- }
用于获取hibernate的session和事务处理,同时写了一个filter类,用于关闭session
笔者用的web服务器是tomcat,采用webwork+spring+hibernate+jbpm(如果你不是这样的,也具体不影响什么)
CloseSessionFilter.java
- package com.eway.framework.basecomponent.services.jbpm.util;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-26
- * Time: 13:10:04
- * To change this template use File | Settings | File Templates.
- */
- public class CloseSessionFilter implements Filter {
- Log log = LogFactory.getLog(this.getClass());
- protected FilterConfig config;
- public void init(FilterConfig config) throws ServletException {
- this.config = config;
- }
- public void doFilter(
- ServletRequest request,
- ServletResponse response,
- FilterChain chain)
- throws IOException, ServletException {
- try {
- chain.doFilter((HttpServletRequest) request, (HttpServletResponse) response);
- }
- finally {
- try {
- HibernateUtil.closeSession();
- log.debug("close session success");
- }
- catch (Exception e) {
- HibernateUtil.rollbackTransaction();
- log.debug("can not close session!/nerrors:" + e.getMessage());
- }
- finally {
- HibernateUtil.closeSession();
- }
- }
- }
- public void destroy() {
- }
- }
这个需要在web.xml中配置一下
- <filter>
- <filter-name>closeHibernateSessionFilter</filter-name>
- <filter-class>com.eway.framework.basecomponent.services.jbpm.util.CloseSessionFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>closeHibernateSessionFilter</filter-name>
- <url-pattern>/jbpm/*</url-pattern>
- </filter-mapping>
- package com.eway.framework.basecomponent.services.jbpm.util;
- import org.hibernate.Session;
- import org.hibernate.Query;
- import org.hibernate.HibernateException;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import java.util.List;
- import java.util.Map;
- import java.util.HashMap;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-24
- * Time: 17:26:16
- * To change this template use File | Settings | File Templates.
- */
- public class JbpmBaseJdbcDAO {
- private Page page;
- private Session hibernateSession;
- /**
- * 默认构造器
- */
- public JbpmBaseJdbcDAO() {
- this.page = null;
- this.hibernateSession = HibernateUtil.currentSession(); //当前的hibernate会话
- }
- /**
- * 带参构造器
- *
- * @param pageSize
- * @param currentPage
- * @param recordCount
- */
- public JbpmBaseJdbcDAO(int pageSize, int currentPage, int recordCount) {
- page = new Page();
- page.setRecordCount(recordCount);
- page.setCurrentPage(currentPage);
- page.setPageSize(pageSize);
- this.hibernateSession = HibernateUtil.currentSession(); //当前的hibernate会话
- }
- /**
- * @param page
- */
- public JbpmBaseJdbcDAO(Page page) {
- this.page = page;
- }
- /*
- * 根据sql,参数查询出结果
- * @param sql
- * @param parameterMap
- * @return
- */
- public List<Object> findByOutQuery(String sql, Map<String, Object> parameterMap) {
- Query query = null;
- List list = null;
- try {
- log.info("hibernateSession.isOpen()====" + hibernateSession.isOpen());
- boolean issql = sql.indexOf("from") != -1;//sql中包含字符串 “from”
- if (issql)
- query = hibernateSession.createQuery(sql); //查询对象
- else
- query = hibernateSession.getNamedQuery(sql); //查询对象
- if (this.page != null) {
- page.setRecordCount(this.getTotalCount(sql, parameterMap));
- int pageSize = page.getPageSize();//每页显示的条数
- int firstResult = page.getFromIndex();//从第多少条记录开始查询
- if (pageSize > 0 && firstResult > 0) {
- query.setFirstResult(firstResult);
- query.setMaxResults(pageSize);
- }
- }
- parameterMap = parameterMap == null ? new HashMap() : parameterMap;
- for (String key : parameterMap.keySet()) { //对查询条件进行迭代
- if (key != null && !"".equals(key)) {
- Object value = parameterMap.get(key);
- if (value != null) {
- query.setParameter(key, value); //加入查询条件
- }
- }
- }
- list = query.list();
- } catch (HibernateException e) {
- log.error("method--[findByOutQuery] throws HibernateException" + e.getMessage());
- e.printStackTrace();
- }
- return list;
- }
- /**
- * 根据sql,参数和页码查询出结果
- *
- * @param sql
- * @param parameterMap
- * @param page
- * @return
- */
- public List<Object> findByOutQuery(String sql, Map<String, Object> parameterMap, Page page) {
- this.page = page;
- return this.findByOutQuery(sql, parameterMap);
- }
- /**
- * 根据sql,参数和页码查询出结果
- *
- * @param sql
- * @param parameterMap
- * @param pageSize
- * @param currentPage
- * @param recordCount
- * @return
- */
- public List<Object> findByOutQueryAndPage(String sql, Map<String, Object> parameterMap, int pageSize, int currentPage, int recordCount) {
- page = new Page();
- page.setRecordCount(recordCount);
- page.setCurrentPage(currentPage);
- page.setPageSize(pageSize);
- return this.findByOutQuery(sql, parameterMap);
- }
- /**
- * 取到总共的条数
- *
- * @param sql
- * @param parameterMap
- * @return
- */
- private Integer getTotalCount(String sql, Map<String, Object> parameterMap) {
- Integer amount = 0;
- Query query = null;
- try {
- boolean issql = sql.indexOf("from") != -1;//sql中包含字符串 “from”
- if (!issql) {
- query = hibernateSession.getNamedQuery(sql);
- sql = query.getQueryString();
- }
- int sql_index = sql.indexOf(" from");
- String countStr = "select count(*) " + sql.substring(sql_index);
- query = hibernateSession.createQuery(countStr); //查询对象
- parameterMap = parameterMap == null ? new HashMap() : parameterMap;
- for (String key : parameterMap.keySet()) { //对查询条件进行迭代
- if (key != null && !"".equals(key)) {
- Object value = parameterMap.get(key);
- if (value != null) {
- query.setParameter(key, value); //加入查询条件
- }
- }
- }
- List list = query.list();
- if (!list.isEmpty()) {
- Object count = list.get(0);
- amount = Integer.parseInt(count.toString());
- }
- } catch (HibernateException e) {
- log.error("method--[getTotalCount] throws HibernateException" + e.getMessage());
- e.printStackTrace();
- }
- return amount;
- }
- private static Log log = LogFactory.getLog(JbpmBaseJdbcDAO.class);
- //getter and setter method
- public Page getPage() {
- return page;
- }
- public void setPage(Page page) {
- this.page = page;
- }
- }
那么谁来调用JbpmBaseJdbcDAO .java呢?
有下面的接口提供给用户使用
- package com.eway.framework.basecomponent.services.jbpm;
- import com.eway.framework.basecomponent.services.jbpm.util.Page;
- import java.util.Collection;
- import java.util.List;
- /**
- * Created by IntelliJ IDEA.
- * Author: xinpeng
- * Date: 2008-10-21
- * Time: 11:08:14
- * To change this template use File | Settings | File Templates.
- */
- public interface JbpmWorklistQueryService {
- public Collection<TaskInstanceDTO> queryToSignInListByPage(String userId,Page page);
- public List queryTodoListByPage(String userId, Page page);
- public Collection<TaskInstanceDTO> queryCompletedListByPage(String userId, Page page);
- }
可以看到方法public List queryTodoListByPage(String userId, Page page);正是我们所需要的
根据参与者和page对象可以取到当前参与者的对应page的待办列表
JbpmWorklistQueryServiceImpl.java是此接口的实现类
- package com.eway.framework.basecomponent.services.jbpm;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import java.math.BigDecimal;
- import java.util.*;
- import com.eway.framework.basecomponent.services.jbpm.util.Page;
- import com.eway.framework.basecomponent.services.jbpm.util.JbpmBaseJdbcDAO;
- /**
- * Created by IntelliJ IDEA.
- * Author: xinpeng
- * Date: 2008-10-21
- * Time: 11:08:37
- * To change this template use File | Settings | File Templates.
- */
- public class JbpmWorklistQueryServiceImpl implements JbpmWorklistQueryService {
- private static final Log log = LogFactory.getLog(JbpmWorklistQueryServiceImpl.class);
- public Collection<TaskInstanceDTO> queryToSignInListByPage(String userId, Page page) {
- //todo:改为分页的实现
- Collection<TaskInstanceDTO> todoList = new ArrayList<TaskInstanceDTO>();
- return todoList;
- }
- /**
- * 取到待办列表
- */
- public List queryTodoListByPage(String userId, Page page) {
- List todoList = new ArrayList();
- String sqlPath = "TaskMgmtSession.findTaskInstancesByActorId";
- JbpmBaseJdbcDAO baseJdbcDao = new JbpmBaseJdbcDAO();
- Map paraMap = new HashMap();
- paraMap.put("actorId", "admin");
- todoList = baseJdbcDao.findByOutQuery(sqlPath, paraMap, page);
- //
- // String sql = "select * from JBPM_TASKINSTANCE a where a.actorId_=? and a.isSuspended_ = ? and a.isOpen_ = ? and a.start_ is not null order by a.START_ desc";
- // Object[] args = new Object[]{userId, false, true};
- // List lstResultMap = baseJdbcDAO.findByOutQuery(sql, args);
- // for (Object mapItem : lstResultMap) {
- // Map map = (Map) mapItem;
- // String name = (String) map.get("NAME_");
- // log.debug("name = " + name);
- // TaskInstanceDTO taskInstance = new TaskInstanceDTO();
- // BigDecimal big = (BigDecimal) map.get("ID_");
- // taskInstance.setId(big.longValue());
- // taskInstance.setName(name);
- // taskInstance.setActorId((String) map.get("ACTORID_"));
- // taskInstance.setStart((Date) map.get("START_"));
- // taskInstance.setTokenId(((BigDecimal) map.get("TOKEN_")).longValue());
- // taskInstance.setTaskId(((BigDecimal) map.get("TASK_")).longValue());
- // taskInstance.setTaskMgmtInstanceId(((BigDecimal) map.get("TASKMGMTINSTANCE_")).longValue());
- // //taskInstance.setSwimlaneInstanceId(((BigDecimal)map.get("SWIMLANINSTANCE_")).longValue());
- // todoList.add(taskInstance);
- // }
- // log.info("todoList==" + todoList);
- return todoList;
- }
- /**
- * 取到办结列表
- * @param userId
- * @param page
- * @return
- */
- public Collection<TaskInstanceDTO> queryCompletedListByPage(String userId, Page page) {
- //todo:改为分页的实现
- JbpmBaseJdbcDAO jbpmBaseJdbcDAO = new JbpmBaseJdbcDAO();
- Collection<TaskInstanceDTO> completedList = new ArrayList<TaskInstanceDTO>();
- return completedList;
- }
- }
这样在客户端,,对此接口的方法进行调用就可以分页了。。
下面是客户端调用的代码
当然也是用webwork的一个action进行访问
webwork的具体配置就省去了,相信大家已经很熟悉了
JbpmAction.java中的获取待办列表的方法todoList 对待办列表进行了调用。
- package com.mycompany.jbpm.action;
- import com.eway.framework.basecomponent.services.jbpm.util.IDeployJbpmProcessService;
- import com.eway.framework.basecomponent.services.jbpm.util.Page;
- import com.eway.framework.basecomponent.services.jbpm.JbpmProcessDefinitionService;
- import com.eway.framework.basecomponent.services.jbpm.JbpmProcessInstanceService;
- import com.eway.framework.basecomponent.services.jbpm.JbpmWorklistQueryService;
- import com.opensymphony.webwork.ServletActionContext;
- import java.util.List;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.jbpm.taskmgmt.exe.TaskInstance;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * Created by IntelliJ IDEA.
- * User: yucehn
- * Date: 2008-11-25
- * Time: 17:20:01
- * To change this template use File | Settings | File Templates.
- */
- public class JbpmAction {
- private String processName;
- private IDeployJbpmProcessService ideployJbpmProcessService;//流程发布
- private JbpmProcessDefinitionService jbpmProcessDefinitionService;//流程定义服务
- private Page page = new Page();
- private int currentPageNum;
- private List jbpmProcessDefinitionList; //流程定义
- private List<TaskInstance> jbpmTaskInstanceList; //任务实例
- private JbpmProcessInstanceService jbpmProcessInstanceService;
- private JbpmWorklistQueryService jbpmWorklistQueryService;
- private static final Log log = LogFactory.getLog(JbpmAction.class);
- /**
- * 发布流程为processName的流程定义
- *
- * @return
- */
- public String deploy() {
- if (processName == null) {
- HttpServletRequest request = ServletActionContext.getRequest();
- processName = request.getParameter("processName");
- }
- log.info("processName===========" + processName);
- ideployJbpmProcessService.deployByname(this.processName);
- return "success";
- }
- /**
- * 发布所有的流程定义
- *
- * @return
- */
- public String deployAll() {
- ideployJbpmProcessService.deployAll();
- return "success";
- }
- /**
- * 默认执行
- *
- * @return
- */
- public String execute() {
- return "success";
- }
- /**
- * @return
- */
- public String findAllProcessDefination() {
- if (currentPageNum != 0)
- page.setCurrentPage(currentPageNum);
- this.jbpmProcessDefinitionList = jbpmProcessDefinitionService.getLatestProcessDefinitionListsByPage(page);
- return "success";
- }
- /**
- * 启动流程
- *
- * @return
- */
- public String startProcess() {
- if (processName == null) {
- HttpServletRequest request = ServletActionContext.getRequest();
- processName = (String) request.getParameter("processName");
- }
- log.info("processName===========" + processName);
- jbpmProcessInstanceService.startProcess("admin", this.processName);
- return "success";
- }
- /**
- * 待办列表
- * @return
- */
- public String todoList() {
- HttpServletRequest request = ServletActionContext.getRequest();
- try{
- currentPageNum = Integer.parseInt(request.getParameter("currentPageNum"));
- }catch(Exception e){
- currentPageNum =1;
- }
- Page page = new Page();
- page.setCurrentPage(currentPageNum);
- page.setPageSize(8);
- page.setRecordCount(100);
- log.info("page.getCurrentPage()======" + page.getCurrentPage());
- log.info("page.getRecordCount()" + page.getRecordCount());
- log.info("page.getPageSize()" + page.getPageSize());
- jbpmTaskInstanceList = jbpmWorklistQueryService.queryTodoListByPage("admin", page);
- // HttpServletResponse response = ServletActionContext.getResponse();
- request.setAttribute("list",jbpmTaskInstanceList);
- return "success";
- }
- //getter and setter method
- public String getProcessName() {
- return processName;
- }
- public void setProcessName(String processName) {
- this.processName = processName;
- }
- public void setIdeployJbpmProcessService(IDeployJbpmProcessService ideployJbpmProcessService) {
- this.ideployJbpmProcessService = ideployJbpmProcessService;
- }
- public void setJbpmProcessDefinitionService(JbpmProcessDefinitionService jbpmProcessDefinitionService) {
- this.jbpmProcessDefinitionService = jbpmProcessDefinitionService;
- }
- public Page getPage() {
- return page;
- }
- public void setPage(Page page) {
- this.page = page;
- }
- public int getCurrentPageNum() {
- return currentPageNum;
- }
- public void setCurrentPageNum(int currentPageNum) {
- this.currentPageNum = currentPageNum;
- }
- public List getJbpmProcessDefinitionList() {
- return jbpmProcessDefinitionList;
- }
- public void setJbpmProcessDefinitionList(List jbpmProcessDefinitionList) {
- this.jbpmProcessDefinitionList = jbpmProcessDefinitionList;
- }
- public JbpmProcessInstanceService getJbpmProcessInstanceService() {
- return jbpmProcessInstanceService;
- }
- public void setJbpmProcessInstanceService(JbpmProcessInstanceService jbpmProcessInstanceService) {
- this.jbpmProcessInstanceService = jbpmProcessInstanceService;
- }
- public void setJbpmWorklistQueryService(JbpmWorklistQueryService jbpmWorklistQueryService) {
- this.jbpmWorklistQueryService = jbpmWorklistQueryService;
- }
- public List<TaskInstance> getJbpmTaskInstanceList() {
- return jbpmTaskInstanceList;
- }
- public void setJbpmTaskInstanceList(List<TaskInstance> jbpmTaskInstanceList) {
- this.jbpmTaskInstanceList = jbpmTaskInstanceList;
- }
- }
到此时已经完成jbpm的分页的一个简单的测试demo
其中很多代码没有完成。。是今天刚写的,但在我的机器上已经编译通过,测试正常,每天都会有新的代码,敬请期待。
如果有地方不妥,或者是需要交流,欢迎email到madrocket@163.com (昵称:疯狂火箭)