`

基于开源工作流引擎OSWorkflow的业务系统实例——请假审批系统

阅读更多

近日调查osworkflow的相关知识,寻找一个能够运行的实例,相关的资料比较少,javaeye上搜到一篇:

主题:基于开源工作流引擎OSWorkflow的业务系统实例——请假审批系统  

http://www.iteye.com/topic/100499

里面附有源码,实际运行以后发现很多问题,经过调试修改以后,得以解决;总的来说,以上实例还是很不错的;对于理解工作流的原理很有助益。

 

以下是需要注意的地方:

1. 执行初始化数据库的MySQL脚本 osworkflow_leaveApprove_mysql.sql 时,最后9行Insert语句后面应该加上分号(;),否则不能一次性创建。

Sql代码 复制代码
  1. INSERT INTO OS_USER (USERNAME,PASSWORDHASH) VALUES ('employee1','7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w==');   
  2. INSERT INTO OS_USER (USERNAME,PASSWORDHASH) VALUES ('hr1','7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w==');   
  3. INSERT INTO OS_USER (USERNAME,PASSWORDHASH) VALUES ('manager1','7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w==');   
  4.   
  5. INSERT INTO OS_GROUP (GROUPNAME) VALUES ('employee');   
  6. INSERT INTO OS_GROUP (GROUPNAME) VALUES ('hr');   
  7. INSERT INTO OS_GROUP (GROUPNAME) VALUES ('manager');   
  8.   
  9. INSERT INTO OS_MEMBERSHIP (USERNAME,GROUPNAME) VALUES ('employee1','employee');   
  10. INSERT INTO OS_MEMBERSHIP (USERNAME,GROUPNAME) VALUES ('hr1','hr');   
  11. INSERT INTO OS_MEMBERSHIP (USERNAME,GROUPNAME) VALUES ('manager1','manager');  
INSERT INTO OS_USER (USERNAME,PASSWORDHASH) VALUES ('employee1','7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w==');
INSERT INTO OS_USER (USERNAME,PASSWORDHASH) VALUES ('hr1','7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w==');
INSERT INTO OS_USER (USERNAME,PASSWORDHASH) VALUES ('manager1','7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w==');

INSERT INTO OS_GROUP (GROUPNAME) VALUES ('employee');
INSERT INTO OS_GROUP (GROUPNAME) VALUES ('hr');
INSERT INTO OS_GROUP (GROUPNAME) VALUES ('manager');

INSERT INTO OS_MEMBERSHIP (USERNAME,GROUPNAME) VALUES ('employee1','employee');
INSERT INTO OS_MEMBERSHIP (USERNAME,GROUPNAME) VALUES ('hr1','hr');
INSERT INTO OS_MEMBERSHIP (USERNAME,GROUPNAME) VALUES ('manager1','manager');

 

 

2.leave_apply.xml 也就是workflow定义文件,也是最关键的一个文件。(原帖中有2个工程的代码,一个是JBuild的工程leaveApprove,另一是Eclipse的工程os_leave;我们使用os_leave,但是要把leaveApprove\src\下的leave_apply.xml 等6个文件复制到os_leave\src\下)

 

(1).Line7:初始化工作流时,没有定义owner;此时应该在step1,employee1进行申请,因此加入 owner="employee1"

(2).后面的result里面没有定义owner的地方,加入 owner="${caller}"

否则出现owner为空,currentstep表无法插入的现象;

或是出现原帖跟帖中反映较多的:com.opensymphony.workflow.StoreException:

Unable to create current step for workflow instance #7:

root cause: Cannot add or update a child row: a foreign key constraint fails (`workflowtest/os_currentstep`, CONSTRAINT `os_currentstep_ibfk_2` FOREIGN KEY (`OWNER`) REFERENCES `os_user` (`USERNAME`))

(3).System.out.println()中的中文换成英文,否则出现警告:Sourced file: <Inline eval of:
                                System.out.println("步骤 4 自动动作 请假申请获准邮件通知 Send mail 祝贺你$$$$$$$");
                            ; > Token Parsing Error: Lexical error at line 2, column 62.  Encountered: " " (32), after : "\"e\u00a4 4 \u00ea\u00a8\u00a8\\": <at unknown location>

这种警告的情况下,DB更新正常,但hr1和manager1审批后,页面上会显示“请假审批时出现异常!”(尽管实际上审批正常终了)

(4).step3的unconditional-result应流向step4,不是step5.

修正后的leave_apply.xml 如下:

Xml代码 复制代码
  1. <workflow>  
  2.     <initial-actions>  
  3.         <action id="100" name="启动请假申请工作流">  
  4.             <results>  
  5.                 <unconditional-result old-status="Finished" status="Underway" step="1" owner="employee1"/>  
  6.             ...  
<workflow>
	<initial-actions>
		<action id="100" name="启动请假申请工作流">
			<results>
				<unconditional-result old-status="Finished" status="Underway" step="1" owner="employee1"/>
			...
Xml代码 复制代码
  1. System.out.println("Step 1 SubmitApply FitCondition WaitApprove");   
                                        System.out.println("Step 1 SubmitApply FitCondition WaitApprove");
  。。。
Xml代码 复制代码
  1. <result old-status="Finished" status="Underway" step="5" owner="${caller}">  
  2.     ...  
						<result old-status="Finished" status="Underway" step="5" owner="${caller}">
							...
Xml代码 复制代码
  1. System.out.println("Step 2 ApplyApprove ManegerSay NO");   
                                        System.out.println("Step 2 ApplyApprove ManegerSay NO");
                                  。。。
Xml代码 复制代码
  1. <result old-status="Finished" status="Underway" step="5" owner="${caller}">  
  2.     ...  
						<result old-status="Finished" status="Underway" step="5" owner="${caller}">
							...
Xml代码 复制代码
  1. <unconditional-result old-status="Finished" status="Underway" step="4" owner="${caller}"/>  
  2. ..  
						<unconditional-result old-status="Finished" status="Underway" step="4" owner="${caller}"/>
					...
Xml代码 复制代码
  1. System.out.println("Step 4 Auto Pass Send mail Congratulations$$$$$$$");   
                                System.out.println("Step 4 Auto Pass Send mail Congratulations$$$$$$$");
                           。。。
Xml代码 复制代码
  1. <unconditional-result old-status="Finished" status="Finished" step="6" owner="${caller}"/>  
  2. ..  
						<unconditional-result old-status="Finished" status="Finished" step="6" owner="${caller}"/>
					...
Xml代码 复制代码
  1. System.out.println("Step 5 Auto unPass Send mail Sorry$$$$$$$");   
                                System.out.println("Step 5 Auto unPass Send mail Sorry$$$$$$$");
                          ...
Xml代码 复制代码
  1. <unconditional-result old-status="Finished" status="Finished" step="6" owner="${caller}"/>  
  2.           
						<unconditional-result old-status="Finished" status="Finished" step="6" owner="${caller}"/>
...					
Xml代码 复制代码
  1. </workflow>  
</workflow>

 

 3.数据源的问题:

(1).LeaveDao.java中:

Java代码 复制代码
  1. InitialContext ic = new InitialContext();   
  2.         ds = (DataSource) ic.lookup("java:/comp/env/JSQLConnectDB_LeaveApply");  
InitialContext ic = new InitialContext();
        ds = (DataSource) ic.lookup("java:/comp/env/JSQLConnectDB_LeaveApply");

(2)src\下的osuser.xml, osworkflow.xml, propertyset.xml 中的数据源相关部分:

Java代码 复制代码
  1. <arg name="datasource" value="java:/comp/env/JSQLConnectDB_LeaveApply"/>  
<arg name="datasource" value="java:/comp/env/JSQLConnectDB_LeaveApply"/>

(3)TOMCAT_HOME\conf\Catalina\localhost\ 下新建osleave.xml (与webapp下工程所在文件夹同名):

Java代码 复制代码
  1. <Context path="/osleave" docBase="osleave"  
  2.         debug="5" reloadable="true" crossContext="true">   
  3. <Resource name="JSQLConnectDB_LeaveApply" auth="Container" type="javax.sql.DataSource"  
  4.                maxActive="100" maxIdle="30" maxWait="10000"  
  5.                username="root" password="admin" driverClassName="com.mysql.jdbc.Driver"  
  6.                url="jdbc:mysql://localhost:3306/oswf?autoReconnect=true"/>   
  7. </Context>  
<Context path="/osleave" docBase="osleave"
        debug="5" reloadable="true" crossContext="true">
<Resource name="JSQLConnectDB_LeaveApply" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="root" password="admin" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/oswf?autoReconnect=true"/>
</Context>

(4)TOMCAT_HOME\webapps\osleave\WEB-INF\web.xml:

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"    
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"    
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7. <description>MySQL Test App</description>  
  8. <resource-ref>  
  9.       <description>DB Connection</description>  
  10.       <res-ref-name>JSQLConnectDB_LeaveApply</res-ref-name>  
  11.       <res-type>javax.sql.DataSource</res-type>  
  12.       <res-auth>Container</res-auth>  
  13. </resource-ref>  
  14.        
  15.   <welcome-file-list>  
  16.     <welcome-file>default.jsp</welcome-file>  
  17.   </welcome-file-list>  
  18.   
  19. </web-app>  
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<description>MySQL Test App</description>
<resource-ref>
      <description>DB Connection</description>
      <res-ref-name>JSQLConnectDB_LeaveApply</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
</resource-ref>
	
  <welcome-file-list>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

</web-app>

 (5)TOMCAT_HOME\webapps\osleave\META-INF 下新建context.xml :

Xml代码 复制代码
  1. <?xml version='1.0' encoding='utf-8'?>      
  2.       
  3. <Context>      
  4.       
  5.     <Resource name="JSQLConnectDB_LeaveApply"          
  6.        auth="Container"          
  7.        type="javax.sql.DataSource"          
  8.        driverClassName="com.mysql.jdbc.Driver"          
  9.        url="jdbc:mysql://localhost/bbs"          
  10.        username="root"          
  11.        password="root"          
  12.        maxActive="50"          
  13.        maxIdle="20"          
  14.        maxWait="10000" />          
  15.       
  16. </Context>     
<?xml version='1.0' encoding='utf-8'?>   
   
<Context>   
   
    <Resource name="JSQLConnectDB_LeaveApply"       
       auth="Container"       
       type="javax.sql.DataSource"       
       driverClassName="com.mysql.jdbc.Driver"       
       url="jdbc:mysql://localhost/bbs"       
       username="root"       
       password="root"       
       maxActive="50"       
       maxIdle="20"       
       maxWait="10000" />       
   
</Context>   

 

4. SQL语句的问题(LeaveDao.java中)

(1). GETDATE() 这个方法是MSSQL中的,在MySQL中无效,报错信息大概是在某某附近(near...);在MySQL中取系统时间用now() 即可:

Java代码 复制代码
  1. String exeSql = ""  
  2.           + " INSERT INTO bus_leaveApprove (applyID,approver,approveTime,opinion)"  
  3.           + " VALUES ('" + leaveApproval.getApplyID() + "','" + leaveApproval.getApprover()   
  4.           + " ',now()," + leaveApproval.getOpinion() + ")";  
String exeSql = ""
          + " INSERT INTO bus_leaveApprove (applyID,approver,approveTime,opinion)"
          + " VALUES ('" + leaveApproval.getApplyID() + "','" + leaveApproval.getApprover()
          + " ',now()," + leaveApproval.getOpinion() + ")";

注意:有2处。

(2).如果还有其他SQL问题,尝试在代码中将一句sql文写到同一行,不要分行;并删除中间的空格。

 

5.其他问题

(1).JSP页面错误,显示相关类找不到(User,Manager,Workflow,Property等类),解决方法:将workspace\os_leave\lib\ 下的.jar 文件复制到 TOMCAT_HOME\webapps\osleave\WEB-INF\lib\

(2).工程编译出现下列错误:

Unbound classpath container: 'com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER' in project

等2个error时,在工程的Build-Path中:最后一个Tab标签页(Order and export)中,调整 J2EE14_CONTAINER 和JRE 的上下顺序即可。(如反复出现此问题,反复调整2者顺序即可)

 

经过上述修改及设置,现在应该就是可以正常运行的一个实例了。

环境:JDK/JRE:1.6.10  TOMCAT:5.5.27  MySQL:5.0.?

Eclipse下的工程文件,及database初期化的MySQL脚本,随后列出下载。

 

2009/7/14

(转载请注明出处)

http://www.iteye.com/topic/426133 

  • xihu
  • 等级: 初级会员
  • OSWorkflow的业务系统实例--请假审批系统 的博客文章。

    分享到:
    评论
    2 楼 liming2008521 2012-01-06  
    对,能不能把你的源码打个包发个完整的例子呢
    1 楼 wujingyong 2011-04-28  
    想咨询一下,这个例子一定要配置数据源么?能不能直接使用jdbc驱动的形式来连接数据库,比如在xml里直接配置相关的数据库链接信息。而不需要设置数据源。

    搞了半天,一直很迷糊,能不能发给我一个完整的实例呢?eclipse+mysql

    相关推荐

      OSWorkflow——请假审批系统(代码全,数据库mysql)

      这个开源项目为开发者提供了灵活的工作流定义和执行能力,使得在系统中实现如请假审批这样的业务流程变得简单。在这个"OSWorkflow——请假审批系统(代码全,数据库mysql)"中,我们能看到一个基于OSWorkflow实现的请假...

      OsWorkflow工作流实例

      OsWorkflow是一款开源的工作流引擎,它为应用程序提供了一种灵活且可扩展的方式来管理业务流程。在本实例中,我们将深入探讨OsWorkflow的核心概念、主要功能以及如何创建和测试一个工作流实例。 工作流引擎是软件...

      osworkflow eclipse+mysql 请假审批流程 完整示例

      这个示例提供了一个完整的osworkflow与Eclipse结合的请假审批流程,它不仅展示了osworkflow的工作流管理能力,还演示了如何将工作流引擎与实际业务逻辑相结合,为实际的企业应用提供了参考。通过学习和实践这个示例...

      OSworkFlow工作流请假流程实例

      OSworkflow(OpenSymphony Workflow)是一个开源的工作流管理系统,它提供了强大的流程定义和执行的能力,广泛应用于企业级应用中,如请假流程等业务场景。在本实例中,我们将深入探讨如何利用OSworkflow来实现一个...

      OSWorkFlow 请假实例

      OSWorkFlow是一个强大的工作流引擎,它在IT领域中被广泛应用来实现业务流程自动化。工作流,简单来说,就是一系列相互关联的任务,按照特定的顺序执行,以完成一个业务过程。OSWorkFlow作为开源的工作流解决方案,为...

      osworkflow请假实例

      osWorkflow(简称OSW)是一个开源的工作流引擎,它允许开发者在应用程序中定义、管理和执行工作流程。这个实例是基于OSW的请假申请流程,使用了Tomcat 6.0作为应用服务器,Oracle数据库作为数据存储,并且可以方便地...

      工作流 osworkflow 例子和原理

      OSWorkflow(OpenSymphony Workflow)是一个开源的工作流引擎,它提供了一种灵活的方式来设计、实施和管理业务流程。本篇文章将深入探讨OSWorkflow的工作原理及其应用实例。 OSWorkflow的核心概念包括工作流定义、...

      yy.rar_DEMO_demo osworkflow_流程引擎_请假流程引擎

      标题提到的"yy.rar_DEMO_demo osworkflow_流程引擎_请假流程引擎"是一个基于osWorkflow的工作流引擎的演示项目,专门设计用来展示如何实现请假流程。osWorkflow是一款开源的工作流引擎,它允许开发者定义、执行和...

      基于osworkflow框架的OA系统demo

      通过基于osworkflow的OA系统DEMO,我们可以学习到如何利用工作流引擎实现业务流程自动化,提高办公效率。同时,osworkflow的灵活性和强大功能,使其成为构建复杂OA系统时的理想选择。理解并掌握osworkflow的使用,...

      Osworkflow 入门级例子

      Osworkflow 是一个开源的工作流引擎,它为应用程序提供了一种灵活的方式来管理业务流程。这个入门级的例子将带你了解 Osworkflow2.8 的基本概念和如何在项目中简单地实现工作流。 Osworkflow 提供了一个强大的框架...

      osworkflow开发指南

      2. **osWorkFlow架构**:了解osWorkFlow的设计原理和组件,如流程定义、流程实例、任务服务、持久化机制等,这有助于你构建和维护工作流系统。 3. **流程定义**:学习如何使用XML或图形工具(如FlowDesigner)来...

      osworkfolw 工作流demo

      osWorkflow 是一个开源的工作流引擎,它主要用于设计和执行复杂的业务流程。这个“osworkflow 工作流demo”提供了一个具体的应用示例,演示了如何使用 osWorkflow 实现请假审批这样的工作流程。osWorkflow 提供了...

      osworkflow2.8基于Spring+Hibernate

      osworkflow是一款开源的工作流引擎,它提供了灵活的工作流程定义和执行管理功能。在Java应用中,osworkflow常常与Spring和Hibernate这两个主流的框架结合使用,以实现业务流程的自动化处理。本篇文章将深入探讨如何...

      osworkflow_leaveApprove_mysql

      在"osworkflow_leaveApprove_mysql"项目中,我们看到的是一个基于OSWorkflow的请假审批流程示例,专为初学者设计,帮助他们快速理解和掌握工作流系统的运作原理。 MySQL作为全球最受欢迎的开源关系型数据库管理系统...

      osworkflow中文手册

      OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个中文手册是为了解决中文用户在理解和使用OSWorkflow时的语言障碍,提供详细的指南和实例解析。 工作流引擎是软件系统中一个...

      osworkflow简单实现

      OSWorkflow,全称为OpenSymphony Workflow,是一款开源的工作流引擎,用于在应用程序中实现复杂的业务流程。这个项目由OpenSymphony Group开发,现在已经并入到Atlassian的Confluence产品中。OSWorkflow提供了一种...

      OSWorkflow 可以请假小例子(mysql+tomcat)

      OSWorkflow 是一个强大的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。在这个"可以请假的小例子"中,我们将探讨如何使用OSWorkflow与MySQL数据库、Tomcat应用服务器以及Eclipse开发环境集成,来创建一...

      OSWorkFlow入门

      OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个框架提供了灵活的流程定义、状态跟踪、任务分配以及事件通知等功能,使得开发人员能够轻松地创建和管理动态工作流程。本文将...

      画流程图的例子(源码)OsWorkFlow.rar

      OsWorkFlow,作为一款开源的工作流引擎,它提供了强大的流程图绘制功能,并支持自定义流程逻辑。在本文中,我们将深入探讨如何利用OsWorkFlow来创建和管理流程图,并通过源码分析,理解其实现原理。 首先,我们要...

    Global site tag (gtag.js) - Google Analytics