`
jessdy
  • 浏览: 61265 次
  • 性别: Icon_minigender_1
  • 来自: 上海虹口区
社区版块
存档分类
最新评论

在JEE环境下整合Activiti5.8

阅读更多

 

Activiti5的前身是jBPM4,而jBPM5是由Drools Flow演化而来的,因此,对于大部分使用开源流程引擎的人来说,从jBPM3或者4升级到Activiti5比较容易,然而,自从Activiti诞生以来,随之而来的有一堆整合的问题:

 

  • Activiti5采用的持久层是MyBatis,而非行业内标准的JPA接口,而且两者耦合程度相当之高。所以对于采用Hibernate或者JPA作为持久层的系统,官方给出的解决方案就是将JPA和MyBatis捏合在一起,采用JPA的EntityManager来管理事务,其整合程度之恶心令人瞠目。
  • Acitiviti5采用的容器是Spring Container(包括配置文件),虽然官方也提供了脱离Spring容器的示例,但是无论从User Guide还是Example都对Spring提供了更好的支持,随之而来的问题就是,对于采用JEE环境的项目怎么办?这也是本文需要讨论的重点。

 

目前看来要想Use Activiti without Spring基本上有以下几种解决方案,如果大家有更好的解决方案欢迎补充:

 

  1. 将Spring整合进JEE环境,Spring框架本身是提供JEE的整合解决方案的,但是这种方法是无法without spring的,意味着开发者实际上是管理着Spring的容器。此方法究竟在事务上有无问题,我没有验证过。
  2. 采用原始的Process Engine,这种方案是最原始的方法,需要解决的问题是引擎在何时启动,又怎样保证引擎的最小化,如果每个EJB都去实例化一个引擎无疑性能将是低下的,因此对于JEE6的环境,可以采用@Singleton和@LocalBean的Bean对Process Engine进行初始化。

    /**
    * Session Bean implementation class ActivitiStarter
    */
    @Singleton
    @LocalBean
    public class ActivitiStarter {
       
        ProcessEngine processEngine = null;
    
        /**
         * Default constructor. 
         */
        public ActivitiStarter() {
           processEngine = ProcessEngines.getDefaultProcessEngine();
        }
    
    }
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
    
       <jee:jndi-lookup jndi-name="java:MysqlDS" id="dataSource" />
    
       <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
          <property name="dataSource" ref="dataSource" />
          <property name="databaseSchemaUpdate" value="true" />
          <property name="databaseType" value="mysql" />
          <property name="jobExecutorActivate" value="false" />
       </bean>
    </beans>
     
    对于JEE5的环境,也许只能硬编码,写一个多线程的Singleton来对流程引擎进行初始化。

    public class ActivitiStart {
           
           private static ThreadLocal initHolder = new ThreadLocal();
           
           private static ProcessEngine engine;
    
           private static String DB_JNDI = "java:MysqlDS";
    
           public static ProcessEngine getEngineInstance () {
    
                  if (initHolder.get() == null) {
                         synchronized (initHolder) {
                                if (engine == null) {
                                       ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
                                       cfg.setDataSourceJndiName(DB_JNDI);
                                       cfg.setTransactionsExternallyManaged(true);
                                       cfg.setKpbExecutorActivate(true);
                                       engine = cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
                                }
                                initHolder.set(Boolean.TRUE);
                         }                     
                  }
                  return engine;
           }
    }
    这种方法比较原始,可以说基本上流程引擎是用编程式实现的,脱离了容器了,因此需要自己去维护引擎的初始化。 
  3. 最佳的解决方案其实是重写流程的初始化,讲流程引擎完全从Spring容器中脱离出来,放在JEE的容器中。好在已经有人做了这方面的工作
    基本的实现思路是利用jBoss Bean代替Spring Bean

    <deployment xmlns="urn:jboss:bean-deployer:2.0">
    
    	<bean name="ProcessEngineManager"
    		class="com.camunda.fox.activiti.enterprise.service.impl.ProcessEngineManager">
    		<property name="processEngineConfiguration"><inject bean="ProcessEngineConfiguration" /></property>
    		<property name="dataSourceJndiName">java:MysqlDS</property>
    	</bean>
    
    	<bean name="ProcessEngineConfiguration"
    		class="org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration">
    		<property name="transactionManager"><inject bean="RealTransactionManager" /></property>		
    
    		<install method="setTransactionsExternallyManaged"><parameter><value>true</value></parameter></install>
    		<install method="setDatabaseSchemaUpdate"><parameter><value>true</value></parameter></install>
    		<install method="setMailServerHost"><parameter><value>localhost</value></parameter></install>
    		<install method="setMailServerPort"><parameter><value>2525</value></parameter></install>
    		<install method="setJobExecutorActivate"><parameter><value>true</value></parameter></install>
    	</bean>
    </deployment>
     在使用时只需要

    @Stateless
    public class StartProcessEjb implements StartProcessLocal, StartProcessRemote{    
    
    	@EJB RuntimeService runtimeService;    
    
    	public void startProcess() {     
    
    		runtimeService.startProcessInstanceByKey("someProcess");     
    
    	}
    }
     值得注意的是,这里的RuntimeService并不是引擎的原生实现的,而是第三方加载实现的。

 

目前看三种方式各自有利弊,没有哪种算是最完美的解决方案,比较完美的应该算是第三种,但是在事务的处理上,还需要进一步探讨。

第二、第三种方案的源码在附件中都有。

 

  • 2.rar (2.6 MB)
  • 下载次数: 277
  • 3.rar (2.7 MB)
  • 下载次数: 102
分享到:
评论

相关推荐

    带activiti designer基于jee的eclipse4.6

    在"带Activiti Designer基于JEE的Eclipse 4.6"的项目中,重点在于如何利用Eclipse Neon集成Activiti Designer来设计和实施企业级工作流。首先,我们需要了解Activiti本身。Activiti是一个开源的工作流引擎,它实现了...

    Eclipse Jee Oxygen 安装Activiti-5.1.8.0(绕开在线资源下载)

    1.在jee-oxygen\eclipse\configuration\org.eclipse.update 中找到platform.xml,在里面添加 &lt;feature id="org.activiti.designer.feature" version="5.18.0.201508100929" url="features/org.activiti.designer....

    JEE环境变量自动配置

    JEE环境变量自动配置,完全批处理配置,无需而外操作。非常便捷。

    eclipse版本activiti设计器

    Eclipse版本的Activiti设计器是专门针对开发人员设计的,允许他们在熟悉的Eclipse集成开发环境中(IDE)进行流程建模。这个工具极大地提升了流程设计的效率,使得开发者能够更加直观地创建、编辑和管理业务流程。 ...

    eclipse上安装Activiti插件

    本文将详细介绍如何在Eclipse环境中安装Activiti插件。 #### 二、安装前提条件 在安装Activiti插件之前,需要确保以下环境已经准备就绪: 1. **Java环境**:确保系统中已经安装了Java环境,并正确配置了JAVA_HOME等...

    Activiti in Action 源码

    7. **book-jee6**:这可能是关于在Java EE 6环境下使用Activiti的示例,包括EJB、JPA等技术的集成,展示了如何在企业级应用中利用Activiti进行流程自动化。 8. **book-camel**:Apache Camel是一个强大的集成框架,...

    Activiti 5.16

    5. **Docker或部署文件**:可能包含用于在各种环境(如Tomcat或JEE服务器)中部署的配置文件和脚本。 Activiti 5.16.3版本的特性可能包括: 1. **性能提升**:对内部算法和数据结构进行优化,提高流程执行速度。 2...

    jee7-activiti:杰

    JEE 7 Activiti集成 REST端点 GET 返回当前进程数 POST 启动新进程 数据库集成 查看samplebe表,为每个POST在此处添加一个新条目。 打开 包括Activiti用户界面 通过用户任务添加样本 Activiti的程序化引导 添加测试 ...

    eclipse 安装activiti-designer.pdf

    在安装Activiti Designer之前,为了确保安装过程的顺利进行,需要确保下载了相应的jar包,因为断网环境下可能找不到Activiti Designer所需的依赖。将这些jar包放入Eclipse安装目录下的features文件夹内,例如路径为 ...

    在eclipse中安装 Activiti Designer插件

    在线安装Activiti Designer插件是一种简便快捷的方法,适用于网络环境良好的情况。以下是详细的步骤: 1. **启动Eclipse**:首先确保Eclipse已正确安装并运行正常。 2. **打开“帮助”菜单**:点击Eclipse主界面...

    eclipse-jee-2020-12-R-中文版(整合中文包).zip

    《Eclipse JEE 2020-12 R 中文版:打造高效Java开发环境》 Eclipse JEE 2020-12 R 是一个强大的集成开发环境(IDE),专为Java企业级应用开发设计。这个版本是Eclipse的年度发布,集成了最新的技术和优化,旨在提供...

    基于JEE在分布式环境下的底层结构(外文翻译+文献综述)毕业设计—(包含完整源码可运行).rar

    【基于JEE在分布式环境下的底层结构】是一个深入探讨企业级Java应用开发的主题,它涵盖了在分布式系统中如何利用Java Enterprise Edition (JEE) 平台来构建高效、可扩展和可靠的软件架构。JEE是一种标准,用于创建...

    Ubuntu下搭建JEE开发环境.zip

    在Ubuntu操作系统中搭建Java Enterprise Edition (JEE) 开发环境是一项关键的任务,这对于开发者来说是必要的,因为JEE提供了一套全面的框架来构建可扩展、高性能的企业级应用。本教程将详细介绍如何在Ubuntu上安装...

    JEE2实现文件上传

    JEE2 实现文件上传是指在 JEE2 环境中实现文件上传的过程。文件上传是指从客户端将文件发送到服务器端的过程。在 JEE2 中,我们可以使用 Servlet 和 JSP 来实现文件上传。 首先,我们需要了解 HTTP 请求的机制。...

    activiti-5.5

    6. **activiti-cdi** 和 **activiti-jee**:分别对应于CDI(Contexts and Dependency Injection)和Java EE环境的集成,扩展了Activiti在不同企业级平台上的应用范围。 7. **文档**:可能包含用户手册、API参考和...

    RESTlet-jee-2.0.9自用.rar

    Steven中文网志可能是一位博主的个人站点,他在其中分享了对RESTlet在JEE环境下的理解和应用,包括架构设计、性能优化和最佳实践等内容。 "restlet-jee-2.0.9.zip"是RESTlet-jee-2.0.9的源代码或者库文件,可能包含...

    eclipse-jee-mars-R-win32-x86_64 JDK 1.7+.rar

    标题中的“eclipse-jee-mars-R-win32-x86_64”指的是...以上知识点涵盖了Eclipse IDE的基本特性,JEE开发环境的用途,Activiti工作流引擎的功能,以及如何使用压缩包进行安装和利用Eclipse进行企业级开发的便利性。

Global site tag (gtag.js) - Google Analytics