`
laitaogood
  • 浏览: 107769 次
  • 性别: Icon_minigender_1
  • 来自: 豫章郡→紫禁城
社区版块
存档分类
最新评论

jBPM工作流应用

阅读更多
一、 环境配置
基础环境是eclipse3+myeclipse6+mysql5+tomcat6 。
首先从网站上下载jBPM开发包(jbpm-jpdl-suite-3.2.3.zip),据说现在jBPM3已经升到3.2.6了,而且据说已经推出了jBPM4了。将jbpm-jpdl-suite-3.2.3.zip解压缩后,里面有个\designer文件夹,这个是eclipse IDE的jBPM插件,是可视化的那种。
安装这个插件:
1、 HelpSoftware Updates
2、 Find and Install  Search for new features to install
3、 点击 New Local Site,选择jBPM开发包解压缩后的那个插件的地址,例如D:\jbpm-jpdl-3.2.3\designer
4、 一路点击Next就可以了,安装完成后,eclipse需要重启。重启后,可以在project中到到一个JBoss jBPM的项目。如图所示。



二、 设置一个User Library
很多人不习惯Process Project的那种代码结构,而我也不习惯。Process Project 的结构如图所示。



于是想给它设置一个自己的库,可以随时在各种WEB应用中调用。设置User Library的步骤如下:
1、 eclipse中,点击WindowPreferences
2、 JavaUser Library
3、 点击New,设置User Library name 为jBPM Library。点击OK。
4、 点击Add JARs,首先来到jBPM解压缩后的路径(例如:D:\jbpm-jpdl-3.2.3),有两个JAR,其中jbpm-jpdl.jar是一定要加的。
5、 还有其他的JARs要加,重复步骤4,进入lib包(例如:D:\jbpm-jpdl-3.2.3\lib),选中所有的JARs。
6、 这样,我们的jBPM Library就设置好了。如图所示:




三、 一个结合Struts 1.x的应用
首先,假定一个流程。这个流程是常用的报销流程,只考虑了最简单的流程。



角色有三种:普通员工(employee)、经理(manager)、BOSS(boss)。这里因为只是做个示例,没有考虑过多的权限方面的设置。这里设计了三个用户,分别对应了三种角色,并且员工有上级(经理)无下属、经理有上级(BOSS)有下属(员工)、BOSS无上级有下属(经理)。具体参看数据库设计。
好了,数据设计好了,开始搭建系统吧。步骤如下:
1、 FileNewWeb Project
2、 给新添加的web项目添加Struts 1.x类库。
3、 添加新的User Library,将刚才设置好的jBPM Library添加进来。
4、 在项目下新增一个Source Folder,命名为jbpm。
搭建好的结构如下图所示:



项目的流程定义文件和jBPM插件生成的图片在com.flowdemo.jbpm.expense包下。hibernate.cfg.xml配置文件需要做一些修改,原本配置的数据库连接是hsqldb。现在把它改成为连接MySQL。具体的配置信息查看代码清单。
Com.flowdemo.service包中包含有两个业务逻辑类,一个是关于对象持久化的:PersistenceService.java 一个是工作流的:FlowService.java 。
以下是PersistenceService.java源代码,主要是对持久化对象的一些操作。
package com.flowdemo.service;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.flowdemo.po.Expenses;
import com.flowdemo.po.Users;
import com.flowdemo.util.HibernateSessionFactory;

public class PersistenceService {

	/**
	 * 保存一个报销单对象
	 * @param expense
	 */
	public static void save(Expenses expense){
		Session hibernateSession = HibernateSessionFactory.getSession();
		try{
			//hibernateSession.getTransaction().begin();
			hibernateSession.beginTransaction();
			hibernateSession.saveOrUpdate(expense);
			hibernateSession.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			hibernateSession.getTransaction().rollback();
		}finally{
			HibernateSessionFactory.closeSession();
		}
	}
	
	/**
	 * 更新一个报销单对象
	 * @param expense
	 */
	public static void update(Expenses expense){
		Session hibernateSession = HibernateSessionFactory.getSession();
		try{
			//hibernateSession.getTransaction().begin();
			hibernateSession.beginTransaction();
			//hibernateSession.saveOrUpdate(expense);
			hibernateSession.update(expense);
			hibernateSession.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			hibernateSession.getTransaction().rollback();
		}finally{
			HibernateSessionFactory.closeSession();
		}
	}
	
	/**
	 * 删除一个报销单对象
	 * @param expense
	 */
	public static void delete(Expenses expense){
		Session hibernateSession = HibernateSessionFactory.getSession();
		try{
			//hibernateSession.getTransaction().begin();
			hibernateSession.beginTransaction();
			hibernateSession.delete(expense);
			hibernateSession.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			hibernateSession.getTransaction().rollback();
		}finally{
			HibernateSessionFactory.closeSession();
		}
	}
	
	/**
	 * 返回一个报销单列表
	 * @return
	 */
	public static List<Expenses> getExpenses(){
		Session hibernateSession = HibernateSessionFactory.getSession();
		List<Expenses> expenses = new ArrayList<Expenses>();
		try{
			
			//hibernateSession.getTransaction().begin();
			hibernateSession.beginTransaction();
			//hibernateSession.delete(expense);
			Query query = hibernateSession.createQuery("from Expenses");
			expenses = query.list();
			hibernateSession.getTransaction().commit();
			
		}catch(Exception e){
			e.printStackTrace();
			hibernateSession.getTransaction().rollback();
		}finally{
			HibernateSessionFactory.closeSession();
		}
		return expenses;
	}
	
	/**
	 * 根据用户ID返回一个对象
	 * @param userId
	 * @return
	 */
	public static Users getUserById(String userId){
		Session hibernateSession = HibernateSessionFactory.getSession();
		Users user = new Users();
		try{
			hibernateSession.beginTransaction();
			user = (Users)hibernateSession.get(Users.class, userId);	
			hibernateSession.getTransaction().commit();
			
		}catch(Exception e){
			e.printStackTrace();
			hibernateSession.getTransaction().rollback();
		}finally{
			HibernateSessionFactory.closeSession();
		}
		return user;
	}
	
	/**
	 * 检查用户是否存在
	 * @param user
	 * @return
	 */
	public static boolean checkUser(Users user){
		Users user2 = null;
		try{
			user2 = getUserById(user.getUserId());
			
			System.out.println("用户的值==="+user2.getUserName());
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			//HibernateSessionFactory.closeSession();
		}
		if(user2.getUserPass() == user.getUserPass() || user2.getUserPass().equals(user.getUserPass())){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 测试主方法
	 * @param args
	 */
	public static void main(String[]args){
		Session hibernateSession = HibernateSessionFactory.getSession();
		System.out.println("测试Session是否启动1"+hibernateSession.toString());
		hibernateSession.close();
		System.out.println("测试Session是否启动2"+hibernateSession.toString());
		
		hibernateSession = HibernateSessionFactory.getSession();
		System.out.println("测试Session是否启动1"+hibernateSession.toString());
		HibernateSessionFactory.closeSession();
		System.out.println("测试Session是否启动2"+hibernateSession.toString());
		
		Users user = new Users();
		user.setUserId("001");
		user.setUserPass("employee");
		
		boolean flag = checkUser(user);
		System.out.println("是否是正确的?"+flag);
	}
	
}

以下是FlowService.java源代码:
package com.flowdemo.service;

import java.util.ArrayList;
import java.util.List;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;

import com.flowdemo.jbpm.util.PoTaskWrapper;
import com.flowdemo.po.Expenses;
import com.flowdemo.po.Users;
import com.flowdemo.util.HibernateSessionFactory;

public class FlowService {

	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	/**
	 * 初始化流程
	 */
	public static void initJbpm(){
		JbpmContext jbpmContext = jbpmConfiguration.getCurrentJbpmContext();
		if(jbpmContext == null || jbpmContext.equals("")){
			jbpmContext = jbpmConfiguration.createJbpmContext();
		}
		//如果流程定义没有,则重新部署
		try{
			ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("com/flowdemo/jbpm/expense/processdefinition.xml");;			
				//测试是否存在
			System.out.println("流程定义是否加载?==="+processDefinition.toString());
			jbpmContext.deployProcessDefinition(processDefinition);
			
			GraphSession graphSession = jbpmContext.getGraphSession();
			processDefinition = graphSession.findLatestProcessDefinition("expense");
		}finally{
			jbpmContext.close();
		}
		
	}
	
	/**
	 * 绑定报销单到流程中
	 */
	public static void bindingExpenseToProcess(){
		JbpmContext jbpmContext = jbpmConfiguration.getCurrentJbpmContext();
		if(jbpmContext == null || jbpmContext.equals("")){
			jbpmContext = jbpmConfiguration.createJbpmContext();
		}
		try{
			jbpmContext.setSessionFactory(HibernateSessionFactory.getSessionFactory());
			ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("expense");
			ProcessInstance processInstance = new ProcessInstance(processDefinition);
			
			jbpmContext.save(processInstance); 
			
			long processInstanceId = processInstance.getId();
			
			//用什么来get or load这个Expenses对象呢?
			Expenses expense = (Expenses)jbpmContext.getSession().createQuery("from Expenses where processInstanceId = "+null).list().get(0);
			//Expenses expense = (Expenses)jbpmContext.getSession().get(Expenses.class, 3);
			expense.setProcessInstanceId(new Long(processInstanceId).toString());
			
			jbpmContext.getSession().update(expense);
			processInstance.getContextInstance().setVariable("expense_id", expense.getExpenseId());
			
			processInstance.signal();
		}finally{
			jbpmContext.close();
		}
		
	}
	
	/**
	 * 根据用户来返回自己需要处理的任务
	 * @param user
	 * @return
	 */
	public static List getTasks(Users user){
		JbpmContext jbpmContext = jbpmConfiguration.getCurrentJbpmContext();
		if(jbpmContext == null || jbpmContext.equals("")){
			jbpmContext = jbpmConfiguration.createJbpmContext();
		}
		System.out.println("提供任务的人的名字"+user.getUserName());
		List tasks = new ArrayList();
		//List expenses = new ArrayList();
		List poAndTasks = new ArrayList();
		try{
			tasks = jbpmContext.getTaskMgmtSession().findTaskInstances(user.getUserName());
			System.out.println("需要处理的任务的多少"+tasks);
			TaskInstance taskInstance = null;
			Expenses expense = null;
			
			for(int i=0;i<tasks.size();i++){
				taskInstance = (TaskInstance)tasks.get(i);
				Integer expenseId =(Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("expense_id");
				System.out.println("expenseId的值是多少呢?"+expenseId);
				
				PoTaskWrapper poTask = new PoTaskWrapper();
				
				jbpmContext.setSessionFactory(HibernateSessionFactory.getSessionFactory());
				expense = (Expenses)jbpmContext.getSession().load(Expenses.class, expenseId);
				System.out.println("对应的报销单的编号、金额和理由"+expense.getExpenseId()+" "+expense.getMoney()+" "+expense.getReason());
				//expenses.add(expense);
				
				poTask.setExpense(expense);
				System.out.println("poTask获得的expense-->"+poTask.getExpense().getMoney());
				poTask.setTaskInstanceId(taskInstance.getId());
				poTask.setTokenId(taskInstance.getToken().getId());
				poAndTasks.add(poTask);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			jbpmContext.close();
		}
		//return expenses;
		System.out.println("队列的长度 -->"+poAndTasks.size());
		return poAndTasks;
	}
	
	/**
	 * @param processInstanceId
	 * @return
	 */
	public static boolean managerApprove(String processInstanceId){
		JbpmContext jbpmContext = jbpmConfiguration.getCurrentJbpmContext();
		if(jbpmContext == null || jbpmContext.equals("")){
			jbpmContext = jbpmConfiguration.createJbpmContext();
		}
		try{
			ProcessInstance processInstance = jbpmContext.getProcessInstance(new Long(processInstanceId).longValue());
			//ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("expense");
			//ProcessInstance processInstance = new ProcessInstance(processDefinition);
			TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createTaskInstance();
			taskInstance.end();
			processInstance.signal();
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			jbpmContext.close();
		}
		
		return false;
	}
	
	
	/**
	 * 审核
	 * @param taskInstanceId
	 */
	public static void approve(long taskInstanceId){
		JbpmContext jbpmContext = jbpmConfiguration.getCurrentJbpmContext();
		if(jbpmContext == null || jbpmContext.equals("")){
			jbpmContext = jbpmConfiguration.createJbpmContext();
		}
		try{
			TaskInstance taskInstance = jbpmContext.getTaskInstance(taskInstanceId);
			//taskInstance.end("manager_approve");
			taskInstance.end();
			//processInstance.signal();
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			jbpmContext.close();
		}
	}

}

还有一点需要注意的是,在测试运行之前需要把jbpm的数据库表创建好,当然也可以通过JbpmContext jbpmContext = cfg.createJbpmContext();来创建,但是这是在每次运行时都会创建,所以还是直接通过导入jbpm的sql文件来创建的好。
好了,一个基于struts的jbpm应用差不多就完成了,我比较懒,所以也不太想在介绍代码上费功夫了,各位看官自己看咯,呵呵。
还想做一些集成spring的应用,但是由于公司也没用上这种技术,所以兴趣又降了一大半,⊙﹏⊙b汗。以后有机会再自己写写吧。以下附上源代码。有需要的请下载吧。按照习惯,我去掉了jar包,所有的需要的jar清单,请看图片:



  • 大小: 35.6 KB
  • 大小: 10.5 KB
  • 大小: 43 KB
  • 大小: 9.7 KB
  • 大小: 32.7 KB
  • 大小: 51.1 KB
分享到:
评论
19 楼 b_xinjun1120 2014-07-04  
哥们 给jar包吧  找了好长时间没找全 发到547033802@qq.com  感激不尽
18 楼 lukun_java 2011-09-16  
10:52:28,458 [http-8001-Processor24] WARN  JDBCExceptionReporter : SQL Error: 515, SQLState: 23000
10:52:28,459 [http-8001-Processor24] ERROR JDBCExceptionReporter : 无法将 NULL 值插入列 'CLASS_',表 'jbpm.dbo.JBPM_PROCESSDEFINITION';该列不允许空值。INSERT 失败。
org.hibernate.exception.ConstraintViolationException: could not insert: [org.jbpm.graph.def.ProcessDefinition]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.jbpm.db.GraphSession.deployProcessDefinition(GraphSession.java:77)
at org.jbpm.JbpmContext.deployProcessDefinition(JbpmContext.java:173)
at com.flowdemo.service.FlowService.initJbpm(FlowService.java:35)
at com.flowdemo.struts.action.SubmitExpenseAction.execute(SubmitExpenseAction.java:45)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:619)

运行到报销金额,输入点提交之后出现这个问题,望指点...
17 楼 goldtoad 2009-10-13  
private void retrieveByteArrays() {
    try {
      FileDefinition fileDefinition = processDefinition.getFileDefinition();
      //gpdBytes = fileDefinition.getBytes("gpd.xml");
      gpdBytes = fileDefinition.getBytes("com/flowdemo/jbpm/expense/gpd.xml");
      //imageBytes = fileDefinition.getBytes("processimage.jpg");
      imageBytes = fileDefinition.getBytes("com/flowdemo/jbpm/expense/processimage.jpg");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

fileDefinition 为空 怎么解决,谢谢
16 楼 laitaogood 2009-08-13  
elvishehai 写道
把那个struts和jbpm的例子也拿出来啊,

呃……,找了一下,没有了,呵呵
15 楼 elvishehai 2009-08-01  
把那个struts和jbpm的例子也拿出来啊,
14 楼 eve8517 2009-04-23  
这个问题我已经解决了,发现是jbpm版本用的不对的问题。
现在出现的一个新问题是
13:53:28,984 [http-8080-Processor24] DEBUG NullableType : binding '5' to parameter: 1
13:53:29,000 [http-8080-Processor24] ERROR StandardWrapperValve : Servlet.service() for servlet jsp threw exception
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [org.jbpm.graph.exe.Token#5]
at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:68)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at org.jbpm.graph.exe.Token$$EnhancerByCGLIB$$f0acb1a2.getProcessInstance(<generated>)
13 楼 eve8517 2009-04-23  
laitaogood 写道
eve8517 写道
我用你的代码运行后,出现如下错误,帮忙看看,谢谢!
16:32:40,234 [http-8080-Processor24] WARN  RequestProcessor : Unhandled Exception thrown: class org.hibernate.exception.SQLGrammarException
16:32:40,250 [http-8080-Processor24] ERROR StandardWrapperValve : Servlet.service() for servlet action threw exception
java.sql.SQLException: Unknown column 'node0_.PARENTLOCKMODE_' in 'field list'
……

是不是少了cglib包啊?hibernate延迟加载需要cglib的,你看看是不是少了包
另一种可能就是jBPM的数据库和表没建好吧


这些包都存在了的,数据库和表都建好了,可以在task表里找到任务的。
你在线没?方便的话,把你整个工程打包发一下我。我的邮箱是eve8517@gmail.com
我想看看到底什么问题。
12 楼 kjj 2009-04-22  
jbpm现在还比较生,3太复杂,4倒是比较简化,几乎是完全推到重来,不过现在还在alpha,继续等待............
11 楼 laitaogood 2009-04-22  
eve8517 写道
我用你的代码运行后,出现如下错误,帮忙看看,谢谢!
16:32:40,234 [http-8080-Processor24] WARN  RequestProcessor : Unhandled Exception thrown: class org.hibernate.exception.SQLGrammarException
16:32:40,250 [http-8080-Processor24] ERROR StandardWrapperValve : Servlet.service() for servlet action threw exception
java.sql.SQLException: Unknown column 'node0_.PARENTLOCKMODE_' in 'field list'
……

是不是少了cglib包啊?hibernate延迟加载需要cglib的,你看看是不是少了包
另一种可能就是jBPM的数据库和表没建好吧
10 楼 eve8517 2009-04-22  
我用你的代码运行后,出现如下错误,帮忙看看,谢谢!
16:32:40,234 [http-8080-Processor24] WARN  RequestProcessor : Unhandled Exception thrown: class org.hibernate.exception.SQLGrammarException
16:32:40,250 [http-8080-Processor24] ERROR StandardWrapperValve : Servlet.service() for servlet action threw exception
java.sql.SQLException: Unknown column 'node0_.PARENTLOCKMODE_' in 'field list'
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2926)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2978)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:933)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1027)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3049)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:399)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:98)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:836)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:66)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at org.jbpm.graph.def.Node$$EnhancerByCGLIB$$f2f76a0e.execute(<generated>)
at org.jbpm.graph.exe.ProcessInstance.fireStartEvent(ProcessInstance.java:189)
at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:147)
at org.jbpm.graph.exe.ProcessInstance.<init>(ProcessInstance.java:96)
at com.flowdemo.service.FlowService.bindingExpenseToProcess(FlowService.java:57)
at com.flowdemo.struts.action.SubmitExpenseAction.execute(SubmitExpenseAction.java:48)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1158)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
9 楼 laitaogood 2009-04-20  
Storm1988 写道
关于ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("com/flowdemo/jbpm/expense/processdefinition.xml");这段代码有个问题。

我用junit进行测试时,执行到ProcessDefinition.parseXmlResource这个方法时,会抛出异常,找不到对应目录文件。


但是用如下方法就可以通过,先生成文件流,在读取就可以了,这是为什么。
FileInputStream f=new FileInputStream("hello/processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(f);

首先,请确认下您是否是按照我的代码里的package那样设置的
其次,parseXmlInputStream是处理xml文件输入流的,当然可以读取输入流中的内容。parseXmlResource方法中包括了处理输入流的操作,所以直接将xml文件的路径传递给parseXmlResource是可以的。
对了,好像JUNIT好象不是运行时环境,所以又可能会出现异常!我猜是这个原因!

嗯,Storm1988同学的习惯非常好,下次做什么得先写测试用例。谢谢!
8 楼 Storm1988 2009-04-20  
关于ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("com/flowdemo/jbpm/expense/processdefinition.xml");这段代码有个问题。




我用junit进行测试时,执行到ProcessDefinition.parseXmlResource这个方法时,会抛出异常,找不到对应目录文件。




但是用如下方法就可以通过,先生成文件流,在读取就可以了,这是为什么。
FileInputStream f=new FileInputStream("hello/processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(f);
7 楼 laitaogood 2009-03-16  
cocococoon 写道

多谢楼主开启的话题。

在www.projectzero.org上看到这个审批差旅计划的例子,比较而言,jBPM花费的时间有些多了。

虽然说自卖自夸有些不妥,但能让程序员们的生活简单些也值得了。不妨一试&nbsp;

呵呵,谢谢
我也是闲来无事,一怕自己荒废了java,二想锻炼下自己
我做的这个例子离真正的企业应用还差了十万八千里,这个我自己知道,感觉自己有标题党的嫌疑了
呵呵,谢谢捧场哈
6 楼 cocococoon 2009-03-16  
多谢楼主开启的话题。

在www.projectzero.org上看到这个审批差旅计划的例子,比较而言,jBPM花费的时间有些多了。

虽然说自卖自夸有些不妥,但能让程序员们的生活简单些也值得了。不妨一试 
5 楼 laitaogood 2009-03-16  
hanshuixinhan 写道
为什么我部署好了 登陆的时候报空指针异常呢

请检查jbpm的数据库表和自定义的表是否建立,用户表是否初始化数据了
4 楼 xieyongwei 2009-03-16  
jar包中没用的东西太多
对于这种内容的帖子
懂的人根本不会细看
不懂的人看了更是不懂
发出来基本没什么价值!
3 楼 hanshuixinhan 2009-03-16  
%%%% Error Creating SessionFactory %%%%
org.hibernate.MappingNotFoundException: resource: org/jbpm/graph/action/MailAction.hbm.xml not found
at org.hibernate.cfg.Configuration.addResource(Configuration.java:517)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1511)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1479)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1458)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1432)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1352)
at com.flowdemo.util.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:30)
at com.flowdemo.service.PersistenceService.getUserById(PersistenceService.java:104)
at com.flowdemo.service.PersistenceService.checkUser(PersistenceService.java:128)
at com.flowdemo.struts.action.LoginAction.execute(LoginAction.java:35)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
10:16:00,093 [http-8080-1] INFO  Configuration : configuring from resource: /hibernate.cfg.xml
10:16:00,093 [http-8080-1] INFO  Configuration : Configuration resource: /hibernate.cfg.xml
10:16:00,093 [http-8080-1] INFO  Configuration : Reading mappings from resource: org/jbpm/db/hibernate.queries.hbm.xml
2 楼 hanshuixinhan 2009-03-16  
为什么我部署好了 登陆的时候报空指针异常呢
1 楼 rianpeny 2009-03-15  
顶!!!!!!!!!!!!!!!!!!!!!!!!!!!1

相关推荐

    jBPM工作流应用开发指南

    《jBPM工作流应用开发指南》是一本面向初学者的文档,旨在帮助开发者快速掌握jBPM工作流系统的开发技巧。jBMP,全称Java Business Process Management,是开源组织JBoss提供的一款用于业务流程管理(BPM)的框架,它...

    jBPM工作流应用开发指南(中文版)

    很详细的jBPM工作流应用开发指南(中文版) 很详细的jBPM工作流应用开发指南(中文版)

    JBPM工作流应用开发文档

    【JBPM工作流应用开发文档】深入解析 JBPM(java Business Process Management)是一个基于JavaEE的轻量级工作流管理系统,旨在支持企业级的流程定义、部署、执行和管理。作为JBoss的一个子项目,它与其他优秀开源...

    jBPM工作流应用开发指南目录

    ### jBPM工作流应用开发指南核心知识点概览 #### 工作流基础与jBPM概述 **工作流管理思想之于企业现代化管理** 工作流管理思想是现代企业管理的重要组成部分,它强调流程的标准化、自动化和优化,旨在提高企业运营...

    《jBPM工作流应用开发指南》代码

    《jBPM工作流应用开发指南》是一本深入解析jBPM框架的书籍,它为开发者提供了详尽的指导,帮助他们理解和应用工作流技术。jBPM是Java业务流程管理(Business Process Management)的一个开源解决方案,它允许开发者...

    jBPM工作流应用开发指南目录和个人笔记

    这个压缩包包含了jBPM工作流应用开发的关键资源,包括安装配置指南、完整的开发指南目录以及工作流基础知识,还有个人的学习笔记,是深入理解并实践jBPM的好资料。 首先,我们来看"安装和配置jBPM4.pdf"。这个文件...

    jBPM4工作流应用开发指南.pdf

    - **jBPM4工作流应用开发指南:** 表明这是一个专注于jBPM4版本的工作流应用开发的指南,由胡奇编写。 - **胡奇:** 该标签重复提及胡奇,强化了指南作者的身份和该作品的关联性。 ### 部分内容知识点: 由于提供...

    jbpm工作流整合

    jbpm工作流整合是一个关键的主题,它涉及到企业级业务流程管理(BPM)系统的实施与集成。jbpm是一个开源的工作流管理系统,它提供了一套全面的工具和框架,用于设计、执行、监控和优化业务流程。这个压缩包可能包含...

    jBPM工作流详解

    **jBPM工作流详解** jBPM,全称Java Business Process Management,是Red Hat公司开发的一款开源的工作流管理系统,它提供了对业务流程的建模、执行和监控能力。jBPM不仅支持传统的工作流标准,如BPMN 2.0,还集成...

    JBPM工作流全套学习资料

    【JBPM工作流全套学习资料】是一份详尽的学习资源,涵盖了JBPM工作流系统的基础到高级知识。JBPM(Java Business Process Management)是开源的企业级工作流管理系统,它允许开发者设计、部署和执行业务流程。这个...

    jbpm工作流 基础视频

    总的来说,这套jbpm工作流基础视频教程旨在帮助初学者快速上手,掌握jbpm的基本操作和应用。通过观看jbpm-overview.swf文件,学习者可以直观地了解jbpm的全貌,为进一步深入学习和实践打下坚实基础。在实际工作中,...

    jbpm工作流web应用

    **jbpm工作流web应用** 是一个基于Java的业务流程管理(BPM)系统,它提供了全面的工作流解决方案,能够帮助开发者构建可扩展且灵活的Web应用程序。jbpm结合了Eclipse开发环境、Tomcat应用服务器和MySQL数据库,形成...

    JBPM工作流引擎内核设计思想及构架笔记分享

    JBPM 工作流引擎内核设计思想及构架笔记...本文通过 JBPM 工作流引擎内核设计思想和构架,来帮助读者理解工作流引擎的内核设计思想和结构,并提供了一些有用的信息和建议,来帮助读者更好地理解和应用工作流引擎技术。

    JBPM工作流

    因此,JBPM工作流技术在高校教务管理中的应用,不仅是一种技术实施,也是教育管理信息化发展的重要一步。它通过实现更加科学、规范的管理流程,对提升高校管理水平和服务质量起到了积极的推动作用。随着教育信息技术...

    jBPM4工作流应用开发指南完整版带书签

    但是,基于标题、描述、标签以及给出的指令,我们可以推测该文档的核心内容是关于jBPM4工作流应用开发的指南。接下来,我将详细展开关于jBPM4和工作流应用开发的知识点。 ### jBPM4概述 jBPM(Java Business ...

    jbpm工作流简单实例

    jbpm不仅支持BPMN(Business Process Model and Notation)标准,还具备强大的规则引擎、事件处理以及与企业服务总线(ESB)的集成能力,使得开发者能够构建复杂的工作流应用。 **jbpm的核心组件** 1. **流程定义*...

    jBPM4工作流应用开发指南.rar

    **jBPM4工作流应用开发指南** jBPM4是一款强大的开源工作流管理系统,它为业务流程管理和执行提供了一套完整的解决方案。本指南将深入探讨jBPM4的特性和使用方法,帮助开发者实现高效的工作流应用开发。 **1. jBPM...

Global site tag (gtag.js) - Google Analytics