小菜毛毛技术分享

与大家共同成长

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

目录

简 述

使 用jbpm-starters-kit-3.1.4生成数据库表及安装eclipse图形化配置插件

部 署jbpmjar包和moudlejar

部 署hbm文件到项目

设 置大字段string-max

配 置configrationtemplate

过 滤器的设置与建立

编 写发布流程定义xml的人机页面及程序

写 在最后


简述

Jbpm工作流框架与现有ssh框架的集成工作其 实很简单,但国内外的资料太小,所以会在集成时走入太多误区,本文是在struts1.2,spring2.5,hibernate3.2上集成成功的详细步骤。其中解决了,jbpm的访问数据库session与原有hibernatesession不同的问 题,string-max大字段问题。完成了流程部署web及后台程序。利用spring-modules-0.8当中的spring31做为集成 的桥梁(其实它已经做好了集成,但文档和实例实在是太简单)。

使用jbpm-starters-kit-3.1.4生成数据库表及安装eclipse图形化配置插件

1下载jbpm-starters-kit-3.1.4到其网站,包含所有需要的工具及jar包。

2数据库的安装以oracle为例,其它 数据库可按此例修改。

2.1创建所需用户及表空间,如果有了用户和表空间就不需要了。

2.2 找到jbpm-starters-kit-3.1.4文件夹,在其下的jbpm文件夹的下级文件夹lib中加入oracle的驱动包ojdbc14.jar.

2.3 jbpm"src"resources文件夹下建立oracle文件夹,"jbpm"src"resources"hsqldb里的create.db.hibernate.propertiesidentity.db.xml文件copy到刚刚建立的oracle文件夹当中.

2.4 修改create.db.hibernate.properties文件,修改目标数据库的连接属性如下:

# these properties are used by the build script to create

# a hypersonic database in the build/db directory that contains

# the jbpm tables and a process deployed in there

hibernate.dialect=org.hibernate.dialect.OracleDialect

hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver

hibernate.connection.url=jdbc:oracle:thin:@10.62.1.12:1521:oracle

hibernate.connection.username=dpf

hibernate.connection.password=dpf

hibernate.show_sql=true

hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider

2.5 修改jbpm"src"config.files"hibernate.cfg.xml文件,同样是配置数据库的连接属性如下:


    <!-- jdbc connection properties -->

    <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>

    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

    <property name="hibernate.connection.url">jdbc:oracle:thin:@10.62.1.12:1521:oracle</property>

    <property name="hibernate.connection.username">dpf</property>

    <property name="hibernate.connection.password">dpf</property>

<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

2.6 修改jbpm"build.deploy.xml文件.找到create.db项并进行如下修改:

 <!-- ============== -->

 <!-- === SERVER === -->

 <!-- ============== -->

 <target name="create.db" depends="declare.jbpm.tasks, db.clean, db.start" description="creates a hypersonic database with the jbpm tables and loads the processes in there">

    <jbpmschema actions="create"

                cfg="${basedir}/src/config.files/hibernate.cfg.xml"

                properties="${basedir}/src/resources/oracle/create.db.hibernate.properties"/>

    <loadidentities file="${basedir}/src/resources/oracle/identity.db.xml"

                cfg="${basedir}/src/config.files/hibernate.cfg.xml"

                properties="${basedir}/src/resources/oracle/create.db.hibernate.properties"/>

    <ant antfile="build.xml" target="build.processes" inheritall="false" />

    <deployprocess cfg="${basedir}/src/config.files/hibernate.cfg.xml"

                   properties="${basedir}/src/resources/oracle/create.db.hibernate.properties">

      <fileset dir="build" includes="*.process" />

    </deployprocess>

    <antcall target="db.stop" />

 </target>

2.7 配置ant,jbpm目录执行 ant create.db –buildfile build.deploy.xml命令。

会有一些小错误的提示,没有关系数据库的表已经建立完成。

2.8 eclipse的图形化配置插件安装文件可以到jbpm-starters-kit-3.1.4"jbpm-designer"

jbpm-gpd-feature"eclipse下找到,需注意版本。

部署jbpmjar包和moudlejar

1 把如下jar包放入"WEB-INF"lib文件夹下,spring-modules-jbpm31.jar可以在

spring-modules-0.8下找到,其它的都属于jbpm工具包。

bsh-1.3.0.jar

bsf.jar

spring-modules-jbpm31.jar

jbpm-webapp-3.1.4.jar

jbpm-identity-3.1.4.jar

jbpm-3.1.4.jar

部署hbm文件到项目

1 jbpm文件夹中找到所有 的*.hbm.xml数据库映射文件。放到项目的一个文件夹当中。本例放到"com"gresoft"security"model"hbm文件夹中。并且在hibernatesessionfactory建立时,设置为相关路径配置。

2 此文件需在spring管理的hibernate配置文件下修改,本例为

dataAccessContext-hibernate.xml,如下:

<!--Hibernate SessionFatory-->

    <bean id="sessionFactory"

       class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

       <property name="dataSource" ref="dataSource" />

       <property name="annotatedClasses">

           <list>

           </list>

       </property>

       <property name="hibernateProperties">

           <props>

              <prop key="hibernate.dialect">

                  org.hibernate.dialect.Oracle9Dialect

              </prop>

              <prop key="hibernate.show_sql">true</prop>

              <prop key="hibernate.cache.provider_class">

                  org.hibernate.cache.EhCacheProvider

              </prop>

              <prop key="hibernate.cache.use_query_cache">true</prop>

           </props>

       </property>

      

       <property name="typeDefinitions">

       <ref bean="jbpmTypes" />

       </property> 

       <property name="mappingDirectoryLocations">

           <list>

              <value>

                  classpath*:/com/gresoft/security/model/hbm/

              </value>            

           </list>

       </property>

    </bean>

设置大字段string-max

1 此文件需在spring管理的hibernate配置文件下修改,本例为

dataAccessContext-hibernate.xml,如下:

<!-- 处理大字 段 -->

    <bean id="jbpmTypes" class="org.springframework.orm.hibernate3.TypeDefinitionBean">

       <property name="typeName" value="string_max" />

       <property name="typeClass" value="org.jbpm.db.hibernate.StringMax" />

    </bean>

配置configrationtemplate

说明:jbpmConfiguration是根据springmodules所 提供的

LocalJbpmConfigurationFactoryBean进行配置,其集成好对jbpmConfiguration的管理。在系统使用时JbpmConfiguration需调用jbpmTemplatejbpmTemplate.getJbpmConfiguration()方法得到。

1 此文件需在spring管理的hibernate配置文件下修改,本例为

dataAccessContext-hibernate.xml,如下:

<!-- jBPM configuration--> 

    <bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean"> 

        <property name="sessionFactory" ref="sessionFactory" /> 

        <property name="configuration" value="classpath:/datasql/jbpm.cfg.xml" /> 

    </bean> 

   

    <!-- jBPM template --> 

    <bean id="jbpmTemplate" class="org.springmodules.workflow.jbpm31.JbpmTemplate"> 

        <constructor-arg index="0" ref="jbpmConfiguration" />  

</bean> 

2 增加类路 径中jbpm.cfg.xml文件,可以根据

jbpm-starters-kit-3.1.4"jbpm"src"java.jbpm"org"jbpm"default.jbpm.cfg.xml

复制后修改。本例放到/datasql/jbpm.cfg.xml下。上面配置文件有相关配置。全部内容如下:

<jbpm-configuration>

<!— - 增加如下内容 - à

 <jbpm-context>

    <service name="persistence"> 

            <factory> 

                <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory"> 

                    <field name="isTransactionEnabled"> 

                        <false /> 

                    </field> 

                    <field name="isCurrentSessionEnabled"> 

                       <true />   

                    </field> 

                </bean> 

            </factory> 

        </service> 

    <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />

    <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />

    <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />

    <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />

 </jbpm-context>

 <!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar -->

<!-- 不再使用<string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" />-->  

 <string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" />

 <string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" />

 <string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" />

 <string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" />

 <string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" />

 <string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" />

 <string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" />

 <long   name="jbpm.msg.wait.timout" value="5000" singleton="true" />

 <int    name="jbpm.byte.block.size" value="1024" singleton="true" />

 <string name="mail.smtp.host" value="localhost" />

 <bean   name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl" singleton="true" />

 <bean   name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" />

 <bean   name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" />

</jbpm-configuration>

过滤器的设置与建立

过滤器的建立是为了保证一个session的正常工 作。

1 web.xml中的修改

本例中描述如下:

    <!-- 注入jbpm过滤器,使用统一的Session -->

    <filter>

    <filter-name>JbpmContextFilter</filter-name> 

    <filter-class>com.gresoft.components.jbpm.JbpmContextHolder</filter-class>

    </filter>

2建立对应的类文件

本例中描述如下:

package com.gresoft.components.jbpm;

import java.io.IOException;

import java.io.Serializable;

import java.security.Principal;

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 org.jbpm.JbpmConfiguration;

import org.jbpm.JbpmContext;

import org.springframework.web.context.WebApplicationContext;

public class JbpmContextHolder implements Filter, Serializable {

         private static final long serialVersionUID = 1L;

         String jbpmConfigurationResource = null;

         String jbpmContextName = null;

         boolean isAuthenticationEnabled = true;

         public void init(FilterConfig filterConfig) throws ServletException {

                   // get the jbpm configuration resource

                   this.jbpmConfigurationResource = filterConfig

                                     .getInitParameter("jbpm.configuration.resource");

                   // get the jbpm context to be used from the jbpm configuration

                   this.jbpmContextName = filterConfig

                                     .getInitParameter("jbpm.context.name");

                   if (jbpmContextName == null) {

                            jbpmContextName = JbpmContext.DEFAULT_JBPM_CONTEXT_NAME;

                   }

                   // see if authentication is turned off

                   String isAuthenticationEnabledText = filterConfig

                                     .getInitParameter("authentication");

                   if ((isAuthenticationEnabledText != null)

                                     && ("disabled".equalsIgnoreCase(isAuthenticationEnabledText))) {

                            isAuthenticationEnabled = false;

                   }

         }

         public void doFilter(ServletRequest servletRequest,

                            ServletResponse servletResponse, FilterChain filterChain)

                            throws IOException, ServletException {

                   String actorId = null;

                   // see if we can get the authenticated swimlaneActorId

                   if (servletRequest instanceof HttpServletRequest) {

                            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

                            Principal userPrincipal = httpServletRequest.getUserPrincipal();

                            if (userPrincipal != null) {

                                     actorId = userPrincipal.getName();

                            }

                   }

                   JbpmContext jbpmContext = getJbpmConfiguration(servletRequest)

                                     .createJbpmContext(jbpmContextName);

                   try {

                            if (isAuthenticationEnabled) {

                                     jbpmContext.setActorId(actorId);

                            }

                            filterChain.doFilter(servletRequest, servletResponse);

                   } finally {

                            jbpmContext.close();

                   }

         }

         /*

          * spring获取JbpmConfigurationbean加载方式

          */

         protected JbpmConfiguration getJbpmConfiguration(

                            ServletRequest servletRequest) {

                   WebApplicationContext webApplicationContext = (WebApplicationContext) ((HttpServletRequest) servletRequest)

                                     .getSession()

                                     .getServletContext()

                                     .getAttribute(

                                                        WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

                   JbpmConfiguration jbpmConfiguration = (JbpmConfiguration) webApplicationContext

                                     .getBean("jbpmConfiguration");

// 得到业务Bean(在这里是你需要 注入的bean)

                   System.out.println("------------------------------------------------------------------------------------------");

                   System.out.println("jbpmconfiguration对象化=" + jbpmConfiguration.toString());

                   System.out.println("------------------------------------------------------------------------------------------");

                   return jbpmConfiguration;

         }

        

         public void destroy() {

         }

}

编写发布流程定义xml的人机页面及程序

1  JSP页面使用struts1.2,spring2.0,hibernate3.2框架。此为流程发布页面。

<%@ page contentType="text/html;charset=UTF-8"%>

<html>

<head>

 </head>

<body>

<form action="项目名/jbpmtest.do?method=deploy" name="formupload" method="post" enctype="multipart/form-data">

       请选择要发布的流程文件<input name="workflowfile" type="file" id="workflowfile" > 

       <input type="submit" name="submit">

</form>

</body>

</html>

2 后台对应类

/*******************************************************************************

 * 文件名: JbpmAction.java<br>

 * 版本: <br>

 * 描述: <br>

 * 版权所有: <br>

 * //////////////////////////////////////////////////////// <br>

 * 创建者: 沙振中 <br>

 * 创建日期: Dec 27, 2007 <br>

 * 修改者: <br>

 * 修改日期: <br>

 * 修改说明: <br>

 ******************************************************************************/

package com.gresoft.security.web;

import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.DynaBean;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.upload.FormFile;

import org.jbpm.JbpmContext;

import org.jbpm.graph.def.ProcessDefinition;

import org.springmodules.workflow.jbpm31.JbpmTemplate;

import com.gresoft.commons.core.web.StrutsAction;

public class JbpmAction extends StrutsAction {

         private static Log log = LogFactory.getLog(JbpmAction.class);

         private JbpmTemplate jbpmTemplate;

         public void setjbpmTemplate(JbpmTemplate jbpmTemplate) {

                   this.jbpmTemplate = jbpmTemplate;

         }

    /**

     * 进入上传流程主页面

     * @param mapping

     * @param form

     * @param request

     * @param response

     * @return

     */

    public ActionForward index(ActionMapping mapping, ActionForm form,

                            HttpServletRequest request, HttpServletResponse response) {   

                   return mapping.findForward("delpoyindex");

         }

   

    /**

     * 上传流程文件

     * @param mapping

     * @param form

     * @param request

     * @param response

     * @return

     */

    public ActionForward deploy(ActionMapping mapping, ActionForm form,

                            HttpServletRequest request, HttpServletResponse response)throws Exception {        

             DynaBean dy = (DynaBean) form;

                   FormFile file = (FormFile) dy.get("workflowfile");

                           

                  InputStream is = file.getInputStream();

                   JbpmContext jbpmContext = jbpmTemplate.getJbpmConfiguration().createJbpmContext();

                   ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);

                   //利用容器的方法将流程定义数据部署到 数据库上

        jbpmContext.deployProcessDefinition(processDefinition);

        // 关闭 jbpmContext

        jbpmContext.close();

                  

        // 提交到数据库当中,使用统一的session

                   jbpmTemplate.getHibernateTemplate().flush();

                   log.info("流程部署成功!");

                   return mapping.findForward("delpoyindex");

         }

     

}

注:相关ssh配置文件的设置需根 据自己实际项目为准。

写在最后

通过上述集成的工作,可以使你的项目中很好的集成jbpmJbpm流程的设置需根据实际业务相绑定。现在我们就可以在项目当中应用工作流了。

posted on 2010-03-31 12:17 小菜毛毛 阅读(4892) 评论(0)  编辑  收藏 所属分类: JBPM

只有注册用户登录后才能发表评论。


网站导航: