﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-沉睡森林@漂在北京-随笔分类-Workflow</title><link>http://www.blogjava.net/wangbing/category/34953.html</link><description>本处文章除注明“转载”外均为原创，转载请注明出处。 </description><language>zh-cn</language><lastBuildDate>Fri, 07 May 2010 09:22:24 GMT</lastBuildDate><pubDate>Fri, 07 May 2010 09:22:24 GMT</pubDate><ttl>60</ttl><item><title>[转]将osworkflow与spring和hibernate集成的基本介绍</title><link>http://www.blogjava.net/wangbing/archive/2010/05/06/320212.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Thu, 06 May 2010 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2010/05/06/320212.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/320212.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2010/05/06/320212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/320212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/320212.html</trackback:ping><description><![CDATA[<span style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">1. 将osworkflow与spring和hibernate结合的原因</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 1）简化对osworkflow的配置</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 2）利用hibernate框架的一些特性，如持久化，缓存等</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 3）事务管理，osworkflow本身是不支持事务的，而事务是作为一个产品的基本功能</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 4）可以利用spring加入其它的扩展功能，如用户认证和鉴权。这点本文没有介绍。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">2、准备</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 下载osworkflow-2.8.0版本 ，下载hibernate-3.2版本，下载spring-framework-2.5.5版本</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">3、搭建eclipse环境</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp; 测试的工程目录如下：</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">src&nbsp; 源代码目录</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp; oswf&nbsp; 包路径</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test.java 测试类，后面会给出源代码</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">bin&nbsp; 编译目的目录</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; oswf 包路径</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test.class&nbsp; 编译生成的class文件</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp; //下面的几个配置文件位于bin目录下</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; log4j.properties 这是log4j的配置文件，这可以不需要</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; //下面三个hbm.xml文件是osworkflow持久化的o/r映射文件，这是从osworkflow的源代码目录com"opensymphony"workflow"spi"hibernate3下拷出来的。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; HibernateCurrentStep.hbm.xml</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; HibernateHistoryStep.hbm.xml</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; HibernateWorkflowEntry.hbm.xml</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; //下面三个文件直接从osworkflow自带的例子中获取的，其中example.xml是流程定义文件。osuser.xml是osuser的配置文件。workflows.xml是osworkflow配置有哪些流程定义的配置文件。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; example.xml</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; osuser.xml</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; workflows.xml</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">osworkflow-spring.xml&nbsp; //这是spring 的配置文件，位于根目录下,后面会给出源代码</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">//下面两个是eclipse的工程文件</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">.project</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">.classpath</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">4、编写spring 的beans.xml配置文件</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp; 文件名如osworkflow-spring.xml，内容如下：</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="<a href="http://www.springframework.org/schema/beans" style="text-decoration: none; color: #336699; ">http://www.springframework.org/schema/beans</a>"<br />
xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" style="text-decoration: none; color: #336699; ">http://www.w3.org/2001/XMLSchema-instance</a>"<br />
xsi:schemaLocation="<a href="http://www.springframework.org/schema/beans" style="text-decoration: none; color: #336699; ">http://www.springframework.org/schema/beans</a><br />
<a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" style="text-decoration: none; color: #336699; ">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</a>"&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;!-- 下面配置数据源datasource，这里用的是spring 自带的一个测试用的连接池。也可以用开源的连接池Jakarta Commons DBCP。<br />
如果程序是运行在servlet容器中，如tomcat中，可直接使用在tomcat中配置的数据库连接池jdni。<br />
这里给出的是oracle数据库驱动，可以换成任意的数据库，如mysql等。 --&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="url"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:oracle:thin:@127.0.0.1:1521:orcl&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="username"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;test&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;test&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&lt;!-- 配置hibernate的sessionFactory以及相关的配置，这是使用hibernate的入口--&gt;<br />
&nbsp;&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;&lt;ref local="dataSource"/&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="mappingResources"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;HibernateCurrentStep.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;HibernateHistoryStep.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;HibernateWorkflowEntry.hbm.xml&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.Oracle9iDialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.current_session_context_class"&gt;thread&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.hbm2ddl.auto"&gt;create-drop&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;!-- 配置osworkflow中所用的propertyset，这里配置的是默认的内存方式的propertyset。--&gt;<br />
&nbsp;&lt;bean id="propertySetDelegate" class="com.opensymphony.workflow.util.PropertySetDelegateImpl"&gt;&nbsp;<br />
&nbsp;&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;!-- 配置osworkflow的存储工厂WorkflowStore --&gt;<br />
&nbsp;&lt;bean id="workflowStore" class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore"&gt;<br />
&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertySetDelegate"&gt; &lt;ref bean="propertySetDelegate"/&gt; &lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; &lt;!-- 配置osworkflow的工厂类 --&gt;<br />
&nbsp;&lt;bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="resource"&gt;&lt;value&gt;workflows.xml&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="reload"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&lt;bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration"&gt;<br />
&nbsp;&nbsp;&lt;property name="store"&gt;&lt;ref local="workflowStore"/&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="factory"&gt;&lt;ref local="workflowFactory"/&gt;&lt;/property&gt;&nbsp;&nbsp;<br />
&nbsp;&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp; &lt;!-- 配置osworkflow的工作流接口。注意下面的构造函数参数值test是用户名 --&gt;<br />
&nbsp;&lt;bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow"&gt;<br />
&nbsp;&nbsp;&lt;constructor-arg&gt;&lt;value&gt;test&lt;/value&gt;&lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&lt;property name="configuration"&gt;&lt;ref local="osworkflowConfiguration"/&gt;&lt;/property&gt;&nbsp;<br />
&nbsp;&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; &lt;!-- 下面的配置是配置让oswrorkflow使用spring的事务框架 --&gt;<br />
&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
&nbsp;&nbsp; &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;!-- 应用程序在代码中唯一要关注的就只有这一个Bean，其它不用关注 --&gt;<br />
&lt;bean id="workflow" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />
&nbsp;&lt;property name="transactionManager" ref="transactionManager"/&gt;<br />
&nbsp;&lt;property name="target" ref="workflowTarget"/&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&lt;property name="transactionAttributes"&gt;<br />
&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&lt;/beans&gt;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">5、编写测试代码，只有一个类，代码如下：</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">package oswf;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">import org.springframework.beans.factory.xml.XmlBeanFactory;<br />
import org.springframework.core.io.FileSystemResource;<br />
import org.springframework.core.io.Resource;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">import com.opensymphony.user.Group;<br />
import com.opensymphony.user.User;<br />
import com.opensymphony.user.UserManager;<br />
import com.opensymphony.workflow.Workflow;</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">public class Test {</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;UserManager um = UserManager.getInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp; User test = um.createUser("test");<br />
&nbsp;&nbsp;&nbsp;&nbsp; test.setPassword("test");</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; Group foos = um.createGroup("foos");<br />
&nbsp;&nbsp;&nbsp;&nbsp; Group bars = um.createGroup("bars");<br />
&nbsp;&nbsp;&nbsp;&nbsp; Group bazs = um.createGroup("bazs");</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; test.addToGroup(foos);<br />
&nbsp;&nbsp;&nbsp;&nbsp; test.addToGroup(bars);<br />
&nbsp;&nbsp;&nbsp;&nbsp; test.addToGroup(bazs);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;catch(Exception e){<br />
&nbsp;&nbsp;&nbsp;System.out.println("create user error,app exit");<br />
&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;System.out.println("create user success");<br />
</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;Resource res = new FileSystemResource("osworkflow-spring.xml");<br />
&nbsp;&nbsp;XmlBeanFactory beanFactory =new XmlBeanFactory(res);<br />
&nbsp;&nbsp;Workflow workflow = (Workflow) beanFactory.getBean("workflow");&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try {&nbsp;<br />
&nbsp;&nbsp;&nbsp;workflow.initialize("example", 100, null);&nbsp;<br />
&nbsp;&nbsp;} catch (Exception e)&nbsp;<br />
&nbsp;&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
代码是，首先要创建一个用户（这里使用的是osworkflow默认绑定的osuser框架）。然后获取workflow&nbsp; bean，再调用initialize方法创建一个新的流程。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">6、问题</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 1）osworkflow使用了propertyset框架，但propertyset框架和osworkflow都是opensymphony下的一个开源项目。osworkflow中提供的propertyset jar包不支持hibernate3，因此本例子中是使用内存化的propertyset，没有持久化propertyset。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">2）osworkflow中的BasicWorkflow类的构造函数必须提供一个参数，参数是osuser中的用户。而且没有提供设置用户的set方法，这样就只能在配置文件中把用户名写死。这只能用在测试环境中。在实际中需要修改这个代码，支持动态设置用户。</p>
<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">3）osuser框架不支持通过hibernate持久化，如果要支持，需要自己下载源代码改写。但osuser支持通过jdbc持久化。</p>
</span>
<img src ="http://www.blogjava.net/wangbing/aggbug/320212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2010-05-06 15:47 <a href="http://www.blogjava.net/wangbing/archive/2010/05/06/320212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流学习笔记（三）——让代码动起来</title><link>http://www.blogjava.net/wangbing/archive/2008/10/07/232991.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Tue, 07 Oct 2008 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2008/10/07/232991.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/232991.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2008/10/07/232991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/232991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/232991.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在到处查资料，下载demo后，我终于让自己的osworkflow工作流跑了起来。环境采用了MySQL5、Tomcat6和JDBC做持久层。具体的步骤如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、创建数据库，脚本如下。&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2008/10/07/232991.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/232991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2008-10-07 20:51 <a href="http://www.blogjava.net/wangbing/archive/2008/10/07/232991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流学习笔记（二）——入门之作</title><link>http://www.blogjava.net/wangbing/archive/2008/10/07/232987.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Tue, 07 Oct 2008 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2008/10/07/232987.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/232987.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2008/10/07/232987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/232987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/232987.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;憋了几天，终于出来了一点东西。下面是流程图和我写的xml文件。总的来说，对OSWorkflow还是不能算清楚。重点在设计方面疑问还很多。&nbsp;流程图：XML文件：                                    &lt;?xml version="1.0" encoding="UTF-8"?&gt;        ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangbing/archive/2008/10/07/232987.html'>阅读全文</a><img src ="http://www.blogjava.net/wangbing/aggbug/232987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2008-10-07 20:28 <a href="http://www.blogjava.net/wangbing/archive/2008/10/07/232987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流学习笔记（一）——问题的提出</title><link>http://www.blogjava.net/wangbing/archive/2008/10/03/232235.html</link><dc:creator>wangchangbing</dc:creator><author>wangchangbing</author><pubDate>Fri, 03 Oct 2008 11:06:00 GMT</pubDate><guid>http://www.blogjava.net/wangbing/archive/2008/10/03/232235.html</guid><wfw:comment>http://www.blogjava.net/wangbing/comments/232235.html</wfw:comment><comments>http://www.blogjava.net/wangbing/archive/2008/10/03/232235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangbing/comments/commentRss/232235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangbing/services/trackbacks/232235.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 大家上网经常遇到这样一组测试题，他们都是选择题，并且根据前面选择的结果决定后面继续做那道题目。具体的场景如下：
<p>&nbsp;&nbsp;&nbsp;&nbsp; 当NO1选择了A后，继续NO3；选择了B后继续NO4；选择了C后继续NO5；选择了D后继续NO2。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 当NO2选择了A后，继续NO3；选择了B后继续NO5；选择了C后继续NO7；选择了D后继续NO9。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &#183;&#183;&#183;&#183;&#183;&#183;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这样一个小小的应用可能有50道测试题，全部都是这种IF/ELSE的控制。想想具体的开发流程，发现一大堆的面条都绕在了一起。开发过程异常复杂，后期的维护修改几乎不大可能。最要命的是，如果测试题由50道变成了100道，流程增加了登录用户性别的判断后，升级变得不大可能，只能重新开发应用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 问题已经提出，如何利用工作流完美的解决这个问题？对于工作流的基本概念、设计思路、设计模型和开发等问题一一提出。</p>
 <img src ="http://www.blogjava.net/wangbing/aggbug/232235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangbing/" target="_blank">wangchangbing</a> 2008-10-03 19:06 <a href="http://www.blogjava.net/wangbing/archive/2008/10/03/232235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>