`
shaqiang32
  • 浏览: 105838 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

jbpm非常好的实例

    博客分类:
  • jbpm
阅读更多

public class WorkflowManagerImpl extends HibernateDaoSupport implements
		WorkflowManager {

	private JbpmConfiguration jbpmConfiguration;
	
	public long addProcessInstance(String workflowName, int documentId) {
		 
		JbpmContext context = getContext();
		
		//从JBPM中加载流程定义
		ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition(workflowName);
		
		ProcessInstance instance = new ProcessInstance(definition);
		
		//将公文标识绑定到流程实例
		instance.getContextInstance().createVariable("document", documentId);
		
		//存储流程实例的信息
		context.save(instance);
		
		return instance.getId();
	}

	public void delProcessInstance(long processInstanceId) {
		
		JbpmContext context = getContext();
		
		//删除流程实例
		context.getGraphSession().deleteProcessInstance(processInstanceId);
	}

	public void delWorkflow(int workflowId) {
		
		//在OA中删除流程的定义
		Workflow workflow = (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
		getHibernateTemplate().delete(workflow);
		
		//在JBPM中删除流程定义
		//JBPM对流程定义按版本进行管理,所以在同一个时刻,可能存在同一个流程定义的多个不同的版本
		//如果需要对其删除,则应该删除所有的版本
		
		//查找对应流程定义的所有版本
		List defs = getContext().getGraphSession().findAllProcessDefinitionVersions(workflow.getName());
		for (Iterator iter = defs.iterator(); iter.hasNext();) {
			ProcessDefinition def = (ProcessDefinition) iter.next();
			getContext().getGraphSession().deleteProcessDefinition(def);
		}
	}

	public void deployProcessDefinition(byte[] processDefinition,
			byte[] processImage) {
		
		//通过byte[]创建ProcessDefinition对象
		ProcessDefinition def = 
			ProcessDefinition.parseXmlInputStream(
					new ByteArrayInputStream(processDefinition)); 
		
		//将流程定义文件部署到JBPM
		getContext().deployProcessDefinition(def);
		
		//首先查找一下Workflow对象是否已经存在
		Workflow workflow = (Workflow)getSession()
				.createQuery("select w from Workflow w where w.name = ? ")
				.setParameter(0, def.getName())
				.uniqueResult();
		
		//如果流程尚未存在,则创建
		if(workflow == null){
			workflow = new Workflow();
			workflow.setName(def.getName());
			workflow.setProcessDefinition(processDefinition);
			workflow.setProcessImage(processImage);
			getHibernateTemplate().save(workflow);
			return;
		}
		
		//如果流程已经存在,则更新
		workflow.setName(def.getName());
		workflow.setProcessDefinition(processDefinition);
		workflow.setProcessImage(processImage);
		getHibernateTemplate().update(workflow);
	}

	public Workflow findWorkflow(int workflowId) {
		return (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
	}

	public String flowToNextStep(String username, long processInstanceId,
			String transitionName) {
		
		JbpmContext context = getContext();
		String status = null;
		
		ProcessInstance instance = context.getProcessInstance(processInstanceId);
		
		//当前节点
		String currentNodeName = instance.getRootToken().getNode().getName();
		
		//起始节点
		String startNodeName = instance.getProcessDefinition().getStartState().getName();

		//如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
		if(currentNodeName.equals(startNodeName)){
			//需要使用流程实例的signal()方法来触发流程向下一步流动!
			instance.getRootToken().signal(transitionName);
		}else{
		
			//首先找出用户的当前任务
			List tasks = context.getTaskMgmtSession().findTaskInstances(username);
			for (Iterator iter = tasks.iterator(); iter.hasNext();) {
				TaskInstance taskInstance = (TaskInstance) iter.next();
				if(taskInstance.getProcessInstance().getId() == processInstanceId){
					
					//这就是当前文档对应的任务,需要结束这个任务,从而触发流程向下一步骤移动!
					taskInstance.end(transitionName);
					break;
				}
			}
		}
		
		//将公文当前所处节点作为状态信息返回
		status = instance.getRootToken().getNode().getName();
		
		//判断当前的状态是否已经结束!
		if(instance.hasEnded()){
			status = Document.STATUS_END;
		}
		
		return status;
	}

	public List searchAllWorkflows() {
		return getHibernateTemplate().find("from Workflow");
	}

	
	public List searchApprovingDocuments(String username) {
		
		JbpmContext context = getContext();
		
		List docIds = new ArrayList();
		
		//首先获得流转到用户的任务列表
		List tasks = context.getTaskMgmtSession().findTaskInstances(username);
		for (Iterator iter = tasks.iterator(); iter.hasNext();) {
			TaskInstance taskInstance = (TaskInstance) iter.next();
			
			//任务实例是否正在等待审批,如果不是,则忽略(即不应该被列到待审批列表中!)
			if(!taskInstance.isSignalling()){
				continue;
			}
			
			//根据其对应的流程实例,获得公文标识
			Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
			docIds.add(docId);
		}
		
		return docIds;
	}

	//下一步都有哪些流向?
	public List searchNextTransitions(String username,long processInstanceId) {
		
		JbpmContext context = getContext();
		
		List transitions = new ArrayList();
		
		//根据流程实例标识查找流程实例
		ProcessInstance instance = context.getProcessInstance(processInstanceId);
		
//		//根据流程实例,获得当前的节点,从而得到在当前节点下有哪些流向
//		List nextSteps = instance.getRootToken().getNode().getLeavingTransitions();

		
		//当前节点
		String currentNodeName = instance.getRootToken().getNode().getName();
		
		//起始节点
		String startNodeName = instance.getProcessDefinition().getStartState().getName();

		Collection nextSteps = null;
		//如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
		if(currentNodeName.equals(startNodeName)){
			//需要使用流程实例的signal()方法来触发流程向下一步流动!
			nextSteps = instance.getRootToken().getAvailableTransitions();
		}else{
		
			//首先找出用户的当前任务
			List tasks = context.getTaskMgmtSession().findTaskInstances(username);
			for (Iterator iter = tasks.iterator(); iter.hasNext();) {
				TaskInstance taskInstance = (TaskInstance) iter.next();
				if(taskInstance.getProcessInstance().getId() == processInstanceId){
					
					nextSteps = taskInstance.getAvailableTransitions();
					break;
				}
			}
		}
		
		for (Iterator iter = nextSteps.iterator(); iter.hasNext();) {
			Transition transition = (Transition) iter.next();
			transitions.add(transition.getName());
		}
		
		return transitions;
	}
	
	/**
	 * 获取JbpmContext对象,需要将JbpmContext的session设置为当前的session对象
	 * @return
	 */
	private JbpmContext getContext(){
		JbpmContext context = jbpmConfiguration.createJbpmContext();
		context.setSession(getSession());
		return context;
	}

	public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
		this.jbpmConfiguration = jbpmConfiguration;
	}

}


分享到:
评论
1 楼 289056879 2009-12-26  
你好,我现在也做到了这步,是尚学堂oa系统,我的delProcessDefinition部署流程,我不能上传文件,Daemon Thread [http-8080-2] (Suspended (exception SQLException))
JDBC4PreparedStatement(PreparedStatement).executeUpdate(byte[][], InputStream[], boolean[], int[], boolean[], boolean) line: 1997
JDBC4PreparedStatement(PreparedStatement).executeUpdate(boolean, boolean) line: 1964
JDBC4PreparedStatement(PreparedStatement).executeUpdate() line: 1949
IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(PreparedStatement) line: 73
IdentityGenerator$GetGeneratedKeysDelegate(AbstractReturningDelegate).performInsert(String, SessionImplementor, Binder) line: 33
SingleTableEntityPersister(AbstractEntityPersister).insert(Object[], boolean[], String, Object, SessionImplementor) line: 2158
SingleTableEntityPersister(AbstractEntityPersister).insert(Object[], Object, SessionImplementor) line: 2638
EntityIdentityInsertAction.execute() line: 48
ActionQueue.execute(Executable) line: 250
DefaultSaveEventListener(AbstractSaveEventListener).performSaveOrReplicate(Object, EntityKey, EntityPersister, boolean, Object, EventSource, boolean) line: 298
DefaultSaveEventListener(AbstractSaveEventListener).performSave(Object, Serializable, EntityPersister, boolean, Object, EventSource, boolean) line: 181
DefaultSaveEventListener(AbstractSaveEventListener).saveWithGeneratedId(Object, String, Object, EventSource, boolean) line: 107
DefaultSaveEventListener(DefaultSaveOrUpdateEventListener).saveWithGeneratedOrRequestedId(SaveOrUpdateEvent) line: 187
DefaultSaveEventListener.saveWithGeneratedOrRequestedId(SaveOrUpdateEvent) line: 33
DefaultSaveEventListener(DefaultSaveOrUpdateEventListener).entityIsTransient(SaveOrUpdateEvent) line: 172
DefaultSaveEventListener.performSaveOrUpdate(SaveOrUpdateEvent) line: 27
DefaultSaveEventListener(DefaultSaveOrUpdateEventListener).onSaveOrUpdate(SaveOrUpdateEvent) line: 70
SessionImpl.fireSave(SaveOrUpdateEvent) line: 535
SessionImpl.save(String, Object) line: 523
SessionImpl.save(Object) line: 519
GraphSession.deployProcessDefinition(ProcessDefinition) line: 77
JbpmContext.deployProcessDefinition(ProcessDefinition) line: 173
WorkflowManagerImpl.deployProcessDefinition(byte[], byte[]) line: 69
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: 310
ReflectiveMethodInvocation.invokeJoinpoint() line: 182
ReflectiveMethodInvocation.proceed() line: 149
TransactionInterceptor.invoke(MethodInvocation) line: 106
ReflectiveMethodInvocation.proceed() line: 171
ExposeInvocationInterceptor.invoke(MethodInvocation) line: 89
ReflectiveMethodInvocation.proceed() line: 171
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 204
$Proxy8.deployProcessDefinition(byte[], byte[]) line: not available
WorkflowAction.add(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 49
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
WorkflowAction(DispatchAction).dispatchMethod(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse, String) line: 270
WorkflowAction(DispatchAction).execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 187
DelegatingActionProxy.execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 110
RequestProcessor.processActionPerform(HttpServletRequest, HttpServletResponse, Action, ActionForm, ActionMapping) line: 431
RequestProcessor.process(HttpServletRequest, HttpServletResponse) line: 236
ActionServlet.process(HttpServletRequest, HttpServletResponse) line: 1196
ActionServlet.doPost(HttpServletRequest, HttpServletResponse) line: 432
ActionServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 710
ActionServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 803
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 290
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
PagerFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 29
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
OpenSessionInViewFilter.doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain) line: 198
OpenSessionInViewFilter(OncePerRequestFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 76
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
CharacterEncodingFilter.doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain) line: 96
CharacterEncodingFilter(OncePerRequestFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 76
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
StandardWrapperValve.invoke(Request, Response) line: 228
StandardContextValve.invoke(Request, Response) line: 175
StandardHostValve.invoke(Request, Response) line: 128
ErrorReportValve.invoke(Request, Response) line: 104
StandardEngineValve.invoke(Request, Response) line: 109
CoyoteAdapter.service(Request, Response) line: 216
Http11AprProcessor.process(long) line: 866
Http11AprProtocol$Http11ConnectionHandler.process(long) line: 716
AprEndpoint$Worker.run() line: 1498
Thread.run() line: 619
  
   请教了

相关推荐

    jBPM4.4开发实例

    **jBPM4.4开发实例** jBPM(Java Business Process Management)是一个开源的工作流管理系统,用于管理和执行业务流程。jBPM4.4是该框架的一个版本,它提供了强大的工作流服务,包括流程定义、流程实例管理、任务...

    jbpm4请假实例代码

    【jbpm4请假实例代码】是一个基于jbpm4工作流引擎的示例应用,它用于演示如何在实际项目中实现员工请假流程的自动化管理。jbpm4是一个开源的工作流管理系统,它提供了强大的业务流程建模、执行和管理功能,使得...

    JBPM4.4会签实例

    3. **编写工具类**:实例中提到的“丰富的工具类”可能包括任务管理、流程实例控制、数据交互等功能,它们帮助我们更好地操作JBPM引擎。这些工具类可以帮助我们查询任务,分配任务,以及检查任务状态。 4. **部署...

    JBPM5请假实例,完整版

    在这个"JBPM5请假实例,完整版"中,我们将深入探讨如何利用JBPM5来实现一个具体的请假流程,以及在这个过程中可能遇到的关键配置问题。 首先,我们要理解JBPM5的核心功能。JBPM5提供了一个强大的流程建模工具,它...

    经典的配置好的jbpm实例

    这个经典的jbpm实例提供了一个已经配置好的环境,可以直接在Tomcat应用服务器上部署,并能在MyEclipse集成开发环境中导入使用,极大地简化了开发者的学习和开发流程。 一、jbpm简介 jbpm是一个基于Java的流程引擎,...

    jbpm4.4 工程项目实例

    【jbpm4.4 工程项目实例】是一个基于jbpm工作流引擎的Web应用程序,旨在提供一个实际操作的示例,帮助开发者了解如何在实际项目中应用jbpm。jbpm是一个开源的工作流管理系统,它支持业务流程建模、部署、执行以及...

    struts2+spring+hibernate+jbpm工作流实例

    在这个“struts2+spring+hibernate+jbpm工作流实例”中,主要展示了如何利用这些技术实现一个公文审批流转的过程。 首先,Struts2是一个基于MVC设计模式的Web应用框架,它负责处理HTTP请求,并将这些请求映射到相应...

    jbpm开发实例详解

    jbpm实例的开发涉及流程定义、数据库配置、事务管理等多个方面,需要对Java、Eclipse插件、数据库管理和事务处理有一定的了解。通过实践,你可以更好地掌握jbpm的使用,从而在项目中实现灵活、高效的工作流管理。

    工作流jbpm应用的实例

    2. **部署流程**:将设计好的流程模型打包成jbpm可识别的格式,然后部署到jbpm服务器上。 3. **启动流程实例**:通过API或用户界面触发流程实例的启动,流程引擎会自动根据定义执行流程。 4. **任务处理**:系统会...

    jbpm的一个实例

    JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上 JBPM的工程文件,大家可以到...

    JBPM4开发实例

    这个实例教程详尽地介绍了从零开始使用JBPM4进行工作流开发的基本步骤,涵盖了环境配置、库的导入、流程定义文件的创建和编辑等多个环节,对于初学者来说是一个很好的学习资源。通过实践这个实例,开发者可以更好地...

    JBPM4 实例

    在JBPM4中,你可以使用BPMN2.0来设计和实现业务流程,这对于理解和管理流程逻辑非常有帮助。 ### 3. 实例:请假流程 "LeaveJbpm"这个例子很可能是一个简单的请假申请流程。在这个流程中,通常包括以下步骤: - **...

    jbpm eclipse工程实例

    下面将详细介绍如何利用jbpm和Eclipse进行工程实例操作。 首先,你需要在Eclipse中安装jbpm相关的插件,例如jBPM Developer Tools。这些插件提供了图形化的工作流模型编辑器,使得流程设计更为直观。你可以通过...

    我写的一个jbpm实例

    【jbpm实例详解】 jbpm,全称Java Business Process Management,是一个开源的工作流管理系统,用于处理业务流程自动化。它提供了一套完整的框架,包括流程定义、执行、监控和管理等,帮助企业实现流程的灵活配置和...

    一个Jbpm实例代码

    **Jbpm实例代码详解** Jbpm,全称Java Business Process Management,是一个开源的工作流管理系统,用于设计、执行和管理业务流程。它提供了一套完整的工具集,包括流程建模、部署、执行、监控和优化,使得企业可以...

    jbpm员工请假实例

    这是一个jbpm员工请假实例PDF文档,里面写得很详细,有图有代码,有文字描述,非常不错!

    Jbpm工作流实例—报销申请

    **Jbpm工作流实例—报销申请** Jbpm(jBoss Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的流程定义、执行、监控和优化工具,帮助企业实现业务流程自动化。在这个“报销申请”的...

    jbpm+SSH实例(报销流程)

    【jbpm+SSH实例(报销流程)】 在IT领域,工作流管理系统(Workflow Management System,简称WfMS)是用于自动化业务流程的关键工具。其中,jbpm(Business Process Management)是一个开源的工作流引擎,它提供了从...

    jbpm实例开发

    《jbpm实例开发详解》 jbPM,全称Java Business Process Management,是一款开源的工作流管理系统,主要用于业务流程的建模、部署和管理。本篇将围绕jbPM实例开发,通过实例来解析其基本概念、流程设计和执行管理,...

    jbpm4.3简单实例

    【jbpm4.3简单实例】是一个教程,旨在教授如何使用jbpm4.3这个工作流管理系统的基础功能。jbPM(Business Process Management)是Java领域的一款开源的工作流引擎,它允许开发者通过定义业务流程来自动化企业的业务...

Global site tag (gtag.js) - Google Analytics