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基本上有以下几种解决方案,如果大家有更好的解决方案欢迎补充:
- 将Spring整合进JEE环境,Spring框架本身是提供JEE的整合解决方案的,但是这种方法是无法without spring的,意味着开发者实际上是管理着Spring的容器。此方法究竟在事务上有无问题,我没有验证过。
- 采用原始的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;
}
}
这种方法比较原始,可以说基本上流程引擎是用编程式实现的,脱离了容器了,因此需要自己去维护引擎的初始化。
- 最佳的解决方案其实是重写流程的初始化,讲流程引擎完全从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并不是引擎的原生实现的,而是第三方加载实现的。
目前看三种方式各自有利弊,没有哪种算是最完美的解决方案,比较完美的应该算是第三种,但是在事务的处理上,还需要进一步探讨。
第二、第三种方案的源码在附件中都有。
分享到:
相关推荐
在"带Activiti Designer基于JEE的Eclipse 4.6"的项目中,重点在于如何利用Eclipse Neon集成Activiti Designer来设计和实施企业级工作流。首先,我们需要了解Activiti本身。Activiti是一个开源的工作流引擎,它实现了...
1.在jee-oxygen\eclipse\configuration\org.eclipse.update 中找到platform.xml,在里面添加 <feature id="org.activiti.designer.feature" version="5.18.0.201508100929" url="features/org.activiti.designer....
JEE环境变量自动配置,完全批处理配置,无需而外操作。非常便捷。
Eclipse版本的Activiti设计器是专门针对开发人员设计的,允许他们在熟悉的Eclipse集成开发环境中(IDE)进行流程建模。这个工具极大地提升了流程设计的效率,使得开发者能够更加直观地创建、编辑和管理业务流程。 ...
本文将详细介绍如何在Eclipse环境中安装Activiti插件。 #### 二、安装前提条件 在安装Activiti插件之前,需要确保以下环境已经准备就绪: 1. **Java环境**:确保系统中已经安装了Java环境,并正确配置了JAVA_HOME等...
7. **book-jee6**:这可能是关于在Java EE 6环境下使用Activiti的示例,包括EJB、JPA等技术的集成,展示了如何在企业级应用中利用Activiti进行流程自动化。 8. **book-camel**:Apache Camel是一个强大的集成框架,...
5. **Docker或部署文件**:可能包含用于在各种环境(如Tomcat或JEE服务器)中部署的配置文件和脚本。 Activiti 5.16.3版本的特性可能包括: 1. **性能提升**:对内部算法和数据结构进行优化,提高流程执行速度。 2...
JEE 7 Activiti集成 REST端点 GET 返回当前进程数 POST 启动新进程 数据库集成 查看samplebe表,为每个POST在此处添加一个新条目。 打开 包括Activiti用户界面 通过用户任务添加样本 Activiti的程序化引导 添加测试 ...
在安装Activiti Designer之前,为了确保安装过程的顺利进行,需要确保下载了相应的jar包,因为断网环境下可能找不到Activiti Designer所需的依赖。将这些jar包放入Eclipse安装目录下的features文件夹内,例如路径为 ...
《Eclipse JEE 2020-12 R 中文版:打造高效Java开发环境》 Eclipse JEE 2020-12 R 是一个强大的集成开发环境(IDE),专为Java企业级应用开发设计。这个版本是Eclipse的年度发布,集成了最新的技术和优化,旨在提供...
在线安装Activiti Designer插件是一种简便快捷的方法,适用于网络环境良好的情况。以下是详细的步骤: 1. **启动Eclipse**:首先确保Eclipse已正确安装并运行正常。 2. **打开“帮助”菜单**:点击Eclipse主界面...
【基于JEE在分布式环境下的底层结构】是一个深入探讨企业级Java应用开发的主题,它涵盖了在分布式系统中如何利用Java Enterprise Edition (JEE) 平台来构建高效、可扩展和可靠的软件架构。JEE是一种标准,用于创建...
Eclipse Mars.2 Release (4.5.2) 是一个流行的集成开发环境(IDE),而activiti-designer是基于Eclipse平台的Activiti工作流引擎的可视化设计工具,版本为5.18.0。本安装资料将详细介绍如何在Eclipse Mars.2中安装和...
在Ubuntu操作系统中搭建Java Enterprise Edition (JEE) 开发环境是一项关键的任务,这对于开发者来说是必要的,因为JEE提供了一套全面的框架来构建可扩展、高性能的企业级应用。本教程将详细介绍如何在Ubuntu上安装...
JEE2 实现文件上传是指在 JEE2 环境中实现文件上传的过程。文件上传是指从客户端将文件发送到服务器端的过程。在 JEE2 中,我们可以使用 Servlet 和 JSP 来实现文件上传。 首先,我们需要了解 HTTP 请求的机制。...
6. **activiti-cdi** 和 **activiti-jee**:分别对应于CDI(Contexts and Dependency Injection)和Java EE环境的集成,扩展了Activiti在不同企业级平台上的应用范围。 7. **文档**:可能包含用户手册、API参考和...
Steven中文网志可能是一位博主的个人站点,他在其中分享了对RESTlet在JEE环境下的理解和应用,包括架构设计、性能优化和最佳实践等内容。 "restlet-jee-2.0.9.zip"是RESTlet-jee-2.0.9的源代码或者库文件,可能包含...