`
yang52081
  • 浏览: 25280 次
  • 性别: Icon_minigender_1
  • 来自: 湖南省岳阳
社区版块
存档分类
最新评论

JBPM3.2与Spring结合时任务调度的实现

    博客分类:
  • Java
阅读更多
Jbpm3.1.x的时候,如果我们要实现Jbpm与Spring结合使用需要借助于SpringModule中spring-modules-jbpm31.jar来实现。目前Jbpm的最新版本是3.2.1,对于这一版本如果我们要实现其与Spring结合使用,同样我们也可以借助SpringModule中spring-modules-jbpm31.jar来实现。
首先我们需要下载spring-modules-0.8工程包文件(下载地址:http://springmodules.dev.java.net),下载后我们只需要工程包里的spring-modules-jbpm31.jar把它放在我们Web应该的WEB-INF/lib目录下,我们知道该包是为Jbpm3.1准备的,但在Jbpm3.2中我们还是可以借助该包实现与Spring结合。
打开WEB应该里的web.xml文件,加上Jbpm3.2任务调试的Servlet,配置信息如下:
<!-- JbpmJobExecutorServlet -->
<servlet>
<servlet-name>JobExecutorServlet</servlet-name>
<servlet-class>
org.jbpm.job.executor.JobExecutorServlet
</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>JobExecutorServlet</servlet-name>
<url-pattern>/jobs</url-pattern>
</servlet-mapping>
Jbpm3.2中任务调度的配置和Jbpm3.1.x中任务调度配置方法与原理基本相同。在Jbpm3.1.x中任务调度我们可以认为就是一个后台线程在不停的监听着timer(jbpm_timer表),如果有需要触发的timer生成了,就按照timer的属性定时或者循环触发它。Jbpm3.1.x中我们是按下面的方法配置任务调度的servlet的:
<servlet>
<servlet-name>SchedulerServlet</servlet-name>
<servlet-class>
org.jbpm.scheduler.impl.SchedulerServlet
</servlet-class>
<init-param>
<param-name>interval</param-name>
<param-value>5000</param-value>
</init-param>
<init-param>
<param-name>historyMaxSize</param-name>
<param-value>50</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SchedulerServlet</servlet-name>
<url-pattern>/jbpmscheduler</url-pattern>
</servlet-mapping>

在Jbpm3.2中已经取消了jbpm_timer表,取而代之的是jbpm_job表。也就是说我们可以理解成后台有一个线程在不停的监听着jbpm_job表,如果有需要触发的timer生成了,就按照timer的属性定时或者循环触发它。比较一下两个不同版本的的配置3.1.x里用的是org.jbpm.scheduler.impl.SchedulerServlet,而3.2里用的是org.jbpm.job.executor.JobExecutorServlet这是最明显的不同之处,另外关于扫描表的周期值等相关参数3.1.x是直接设置在servlet里,而3.2里则是配置在jbpm.cfg.xml里:
  <bean name="jbpm.job.executor" class="org.jbpm.job.executor.CustomJobExecutor">
    <field name="jbpmConfiguration"><ref bean="jbpmConfiguration" /></field>
    <!--field name="jbpmConfiguration"><ref bean="jbpmConfiguration" /></field-->
    <field name="name"><string value="JbpmJobExector" /></field>
    <field name="nbrOfThreads"><int value="1" /></field>
    <field name="idleInterval"><int value="5000" /></field>
    <field name="maxIdleInterval"><int value="3600000" /></field> <!-- 1 hour -->
    <field name="historyMaxSize"><int value="20" /></field>
    <field name="maxLockTime"><int value="600000" /></field> <!-- 10 minutes -->
    <field name="lockMonitorInterval"><int value="60000" /></field> <!-- 1 minute -->
    <field name="lockBufferTime"><int value="5000" /></field> <!-- 5 seconds -->
  </bean>

到这里为止Jbpm的任务的Servlet配置已经完成了,如果直接使用hibernate.cfg.xml来连接数据库的话那我们上面的配置就够了。如果我们使用Spring,那还有一些工作要完成。接下来要看一下怎么去在Spring中配置Jbpm。
首先我们要在Spring的配置文件里配置好Hibernate的SessionFacotry等相关信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/configs/jdbc.properties</value>
</list>
</property>
</bean>

<!-- configuration datasource -->

<!—配置数据源-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<!—利用数据源配置Hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>

<!—-设置Jbpm中cfg.xml文件的映射,这里从jbpm-jpdl.jar里读取cfg.xml文件-->
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/jbpm-jpdl.jar</value>
</list>
</property>

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
</props>
</property>
</bean>
</beans>
接下来我们要把spring-modules-jbpm31.jar中提供的JbpmConfiguration配置进去:
<!-- jBPM configuration -->
<bean id="jbpmConfiguration"
class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
<property name="sessionFactory" ref="sessionFactory" />
<property name="configuration" value="classpath:jbpm.cfg.xml" />
<property name="createSchema" value="false" />
</bean>

<bean id="jbpmTemplate"
class="org.springmodules.workflow.jbpm31.JbpmTemplate">
<constructor-arg index="0" ref="jbpmConfiguration" />
</bean>
这里我们把spring-modules-jbpm31.jar中提供的JbpmTemplate配置进去,这里需要解释一下JbpmTemplate是在Spring中访问Jbpm相关方法的接口对象,利用JbpmTemplate我们可以快速操作Jbpm里提供的方法接口:
public ProcessInstance findProcessInstance(final Long processInstanceId) {
  return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
     public Object doInJbpm(JbpmContext context) {
      // do something
      ...
      return context.getGraphSession().loadProcessInstance(processInstanceId.longValue());
     }
  });
}
接下来我们可以启动工程测试一下,启动过程中我们发现有异常抛出来,告诉我们说找不到hibernate.cfg.xml文件,同时我们也看到该错误是由org.jbpm.job.executor.JobExecutorServlet该类抛出来的,为了修正该错误我们对其修改如下:
package org.jbpm.job.executor;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jbpm.JbpmConfiguration;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springmodules.workflow.jbpm31.JbpmTemplate;

public class JobExecutorServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

JbpmConfiguration jbpmConfiguration;
//修改了JobExecutorServlet里获取JbpmConfiguration的方式
public void init() throws ServletException {
JbpmTemplate jbpmTemplate = (JbpmTemplate) WebApplicationContextUtils
.getWebApplicationContext(this.getServletContext()).getBean(
"jbpmTemplate");
jbpmConfiguration = jbpmTemplate.getJbpmConfiguration();
jbpmConfiguration.startJobExecutor();
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h2>JBoss jBPM Scheduler Servlet</h2><hr />");
Collection threads = jbpmConfiguration.getJobExecutor().getThreads()
.values();
Iterator iter = threads.iterator();
while (iter.hasNext()) {
Thread thread = (Thread) iter.next();
out.println("<h4>" + thread.getName() + "</h4>");
out.println("<b>isAlive</b>:" + thread.isAlive());
}
out.println("</body>");
out.println("</html>");
}
}
在红色的代码块里,我们修改了JobExecutorServlet里获取JbpmConfiguration的方式。
再次启动工程,还是有异常发生,主要原因是JobExecutorServlet里获取了JbpmConfiguration对象后调用了startJobExecutor方法:
  public void startJobExecutor() {
    getJobExecutor().start();
  }

  public synchronized JobExecutor getJobExecutor() {
    if (jobExecutor==null) {
      try {
        jobExecutor = (JobExecutor) this.objectFactory.createObject("jbpm.job.executor");
      } catch (ClassCastException e) {
        throw new JbpmException("jbpm configuration object under key 'jbpm.job.executor' is not a "+JobExecutor.class.getName(), e);
      }
    }
    return jobExecutor;
  }
深入其代码,我们明白了它报错的原因是JobExecutor是从jbpm.cfg.xml里来的:
<bean name="jbpm.job.executor" class="org.jbpm.job.executor.JobExecutor">
    <field name="jbpmConfiguration"><ref bean="jbpmConfiguration" /></field>
    <field name="name"><string value="JbpmJobExector" /></field>
    <field name="nbrOfThreads"><int value="1" /></field>
    <field name="idleInterval"><int value="5000" /></field>
    <field name="maxIdleInterval"><int value="3600000" /></field> <!-- 1 hour -->
    <field name="historyMaxSize"><int value="20" /></field>
    <field name="maxLockTime"><int value="600000" /></field> <!-- 10 minutes -->
    <field name="lockMonitorInterval"><int value="60000" /></field> <!-- 1 minute -->
    <field name="lockBufferTime"><int value="5000" /></field> <!-- 5 seconds -->
  </bean>
我们看到里面有“<field name="jbpmConfiguration"><ref bean="jbpmConfiguration" /></field>”因为我们没有采用Hibernate.cfg.xml,所以在JobExecutor得不到jbpmConfiguration对象所致,因此我们需要在调用JobExecutor时对JobExecutor里的jbpmConfiguration进行初始化,这里我们选择对JobExecutor类进行扩展,而不是对其进行修改,扩展的代码类如下:
package org.jbpm.job.executor;

import org.jbpm.JbpmConfiguration;

public class CustomJobExecutor extends JobExecutor{
public static JbpmConfiguration jbpmConfig;
public synchronized void start() {
jbpmConfiguration = jbpmConfig;
super.start();
}
public static void setJbpmConfiguration(JbpmConfiguration config){
jbpmConfig=config;
}
}
同时对JobExecutorServlet做修改,主要目的是在该servlet进行初始化时为CustomJobExecutor类的jbpmConfig进行初始化。代码如下:

package org.jbpm.job.executor;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jbpm.JbpmConfiguration;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springmodules.workflow.jbpm31.JbpmTemplate;

public class JobExecutorServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

JbpmConfiguration jbpmConfiguration;
//修改了JobExecutorServlet里获取JbpmConfiguration的方式
public void init() throws ServletException {
JbpmTemplate jbpmTemplate = (JbpmTemplate) WebApplicationContextUtils
.getWebApplicationContext(this.getServletContext()).getBean(
"jbpmTemplate");
jbpmConfiguration = jbpmTemplate.getJbpmConfiguration();
CustomJobExecutor.setJbpmConfiguration(jbpmConfiguration);
jbpmConfiguration.startJobExecutor();
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h2>JBoss jBPM Scheduler Servlet</h2><hr />");
Collection threads = jbpmConfiguration.getJobExecutor().getThreads()
.values();
Iterator iter = threads.iterator();
while (iter.hasNext()) {
Thread thread = (Thread) iter.next();
out.println("<h4>" + thread.getName() + "</h4>");
out.println("<b>isAlive</b>:" + thread.isAlive());
}
out.println("</body>");
out.println("</html>");
}
}

再次启动工程,一切正常,没有异常发生,证明我们的修改工作达到的预期的效果。
4
7
分享到:
评论
1 楼 flying_all 2009-02-24  
错了。怎么能踩呢。我在我的工程中成功了。只是我用的是struts2.在serlvet的拦截器中把JobExecutorServlet 中init的代码执行了一次。就可以用了。

相关推荐

    jBPM3.2.rar_JBPM3.2_jbpm_jbpm 3.2_jbpm3_jbpm3.2教程

    **jbPM 3.2 知识点详解** jbPM,全称为Java Business Process Management,是一个开源的工作流管理系统,主要用于企业级应用中的业务流程管理。jbPM 3.2是该系统的一个版本,它提供了丰富的功能,包括流程设计、...

    jbpm3.2开发总结.pdf

    首先,了解jbpm3.2需要掌握Java语言,J2EE技术栈,特别是Hibernate,因为在jbpm3.2中,流程定义、任务实例等数据的持久化是通过Hibernate来实现的。同时,了解Eclipse开发环境以及jbpm-gpd(jBPM Graphical Process ...

    JBPM3.2工作流开发指南

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

    jbpm3.2表说明

    jbpm3.2表说明 很详细 1.1 JBPM_PROCESSDEFINITION:流程模版表 关系表 外键存在表 外键名称 外键存在表字段 存在原因 可能 关系 JBPM_NODE JBPM_NODE FK_PROCST_SBPRCDEF SUBPROCESSDEFINITION_ 子流程的...

    spring2_struts2_jbpm3.2.rar_jbpm struts2_jbpm-demo_jbpm3 spring_

    通过与Spring的集成,我们可以利用Spring的IoC管理JBPM的bean,实现流程服务的自动化管理和调度。 整合这三个框架的关键在于它们之间的接口和配置。在Spring中,我们可以创建一个Service Bean来调用JBPM的工作流API...

    JBPM3.2 表初始化,流程发布

    **JBPM3.2 表初始化与流程发布详解** JBPM(Java Business Process Management)是一款开源的工作流管理系统,主要用于业务流程的建模、部署、执行和监控。在JBPM3.2版本中,用户需要对数据库进行初始化,以便正确...

    jbpm3.2 .jar

    如果你遇到了使用jbpm3.2时的错误或性能问题,这个更新包可能包含了解决方案。 jbpm框架的核心特性包括: 1. **流程建模**:使用JPDL进行流程建模,支持流程图的可视化编辑。 2. **流程实例管理**:跟踪和管理每个...

    JBPM3.2 表初始化,流程发布第一课

    1. 数据库准备:JBPM3.2需要与数据库进行交互来存储流程实例、任务和变量等信息。因此,首先需要确保已经配置好与JBPM兼容的数据库,并创建相应的数据库表。JBPM提供了SQL脚本,用于在MySQL、Oracle、PostgreSQL等...

    jBPM 3.2 最新学习文档

    jBPM 3.2使用JPA(Java Persistence API)来保存和恢复工作流实例的状态,这意味着它可以轻松地与各种数据库系统集成,保证了数据的一致性和可靠性。同时,jBPM还提供了工作流审计功能,记录了流程实例的完整生命...

    [原创]jBPM 3.2 学习笔记

    用erstudio v7.1查看 博文链接:https://evanz.iteye.com/blog/106101

    jbpm3.2.x开发所需jar包

    **jbpm3.2.x 开发环境搭建及关键...总的来说,Jbpm3.2.x开发所需的jar包集合,是实现业务流程管理的关键元素。通过理解这些jar包的作用,并正确集成它们,开发者可以有效地利用Jbpm构建高效、可扩展的企业级流程应用。

    JBPM3.2 源码

    【JBPM3.2 源码】是一个与业务流程管理(Business Process Management)相关的开源项目,主要关注于流程定义、执行以及监控。JBPM是一个功能丰富的BPM平台,允许开发者设计、部署和执行业务流程。它使用了Java语言,...

    jbpm4.3与spring整合

    在企业级应用开发中,流程管理引擎JBPM(JBoss Business Process Management)与Spring框架的结合使用是常见的一种技术方案。JBPM是一个灵活、强大的业务流程管理工具,而Spring框架则以其优秀的依赖注入(DI)和...

    jbpm3.2 简单的请假流程

    在本场景中,我们关注的是jbpm3.2版本的一个简单的请假流程示例。jbpm3.2是jbpm项目早期的一个稳定版本,它提供了一个强大的框架,允许开发者创建、部署和执行业务流程。 jbpm的请假流程示例通常会展示如何通过jbpm...

    jbpm3.2 mysql修改可用建表语句

    jbpm3.2 mysql修改可用建表语句 在mysql命令行下使用:source D:1.sql

    spring整合JPBM3.2

    在Jbpm3.2中,任务调度的实现与3.1.x版本有所不同。在3.1.x中,任务调度通过后台线程监控`jbpm_timer`表,当发现需要触发的定时器时,会根据定时器的属性进行触发。而在3.2中,`jbpm_timer`表被`jbpm_job`表取代,...

    jBPM4与Spring整合的2种方式

    2. **配置jbpmContext**:创建一个jbpmContext的bean,它会自动配置jBPM4所需的服务,并与Spring的bean管理相结合。 3. **使用JBPM4Template**:Spring-JBPM4提供了JBPM4Template类,它可以简化与jBPM4的交互,如...

    深入浅出jBPM3.2.part1

    JBPM3.2,扫描版本,还算很清晰,虽然比较老,但是用来学习下还算不错,而且是中文,此文件因为太大,所以分为两个压缩包压缩,都已全部上传,请全部下载再解压缩。

Global site tag (gtag.js) - Google Analytics