工作流activiti-02事物控制、流程引擎创建
使用activiti中有个很重要的问题就是需要保证事物的控制
activiti使用的是mybatis作为orm技术 封装了一系列的操作数据库操作 这也就是大家调用的api 操作的数据库表都是activit自带的数据表 一般情况下使用spring整合
activiti的事物是很强大的 但是往往就不能如愿 因为公司使用的都是自己的框架不能利用spring来整合事物。
通过java程序来控制activiti的事物
activiti的事物依赖于TransactionFactory 在创建流程引擎ProcessEngine来指定事物工厂,其原因分析如下:
创建流程引擎: ProcessEngine processEngine = conf.buildProcessEngine() ;
conf为StandaloneProcessEngineConfiguration的对象其buildProcessEngine方法如下:
public ProcessEngine buildProcessEngine() {
init();
return new ProcessEngineImpl(this);
}
//调用init方法
protected void init() {
initHistoryLevel();
initExpressionManager();
initVariableTypes();
initBeans();
initFormEngines();
initFormTypes();
initScriptingEngines();
initBusinessCalendarManager();
initCommandContextFactory();
initTransactionContextFactory();
initCommandExecutors();
initServices();
initIdGenerator();
initDeployers();
initJobExecutor();
initMailScanner();
initDataSource();
initTransactionFactory();
initSqlSessionFactory();
initSessionFactories();
initJpa();
initDelegateInterceptor();
initEventHandlers();
}
其中初始化了很多信息,可以依次看看源码 其中initTransactionFactory()方法代码如下:
// myBatis SqlSessionFactory ////////////////////////////////////////////////
protected void initTransactionFactory() {
if (transactionFactory==null) {
if (transactionsExternallyManaged) {
transactionFactory = new ManagedTransactionFactory();
} else {
transactionFactory = new JdbcTransactionFactory();
}
}
}
其中transactionFactory为 protected TransactionFactory transactionFactory; 类中的属性
由代码可知 如果transactionFactory不为空则事物工厂为JdbcTransactionFactory的实例化对象
那么设置StandaloneProcessEngineConfiguration的transactionFactory的值为一JdbcTransactionFactory对象即可
代码如下:创建一个servlet监听器 在容器启动的时候创建一个流程引擎 (需要配置web.xml文件)
/**********************************************************************
* <pre>
* FILE : MyServletListener.java
* CLASS : MyServletListener
*
* AUTHOR : Liaokailin
*
* FUNCTION :
*
*
* Contact: Sina L凯林
*
*======================================================================
* CHANGE HISTORY LOG
*----------------------------------------------------------------------
* MOD. NO.| DATE | NAME | REASON | CHANGE REQ.
*----------------------------------------------------------------------
* |2014年1月17日|Liaokailin| Created |
* DESCRIPTION:
* </pre>
***********************************************************************/
package com.infodms.dms.actions; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration; import com.infodms.dms.db.DBManager;
import com.infodms.dms.utils.DmsActivitiTransactionFactory; public class MyServletListener implements ServletContextListener { @Override
public void contextDestroyed(ServletContextEvent arg0) {
ProcessEngines.destroy();
} @Override
public void contextInitialized(ServletContextEvent arg0) {
StandaloneProcessEngineConfiguration conf = (StandaloneProcessEngineConfiguration) ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
conf.setDataSource(DBManager.getDataSource()).setDatabaseSchemaUpdate("true").setDbHistoryUsed(true) ;
conf.setTransactionFactory(new DmsActivitiTransactionFactory()) ;
ProcessEngine processEngine = conf.buildProcessEngine() ; }
}
conf.setTransactionFactory(new DmsActivitiTransactionFactory()) ;设置事物
DmsActivitiTransactionFactory代码如下:
/**********************************************************************
* <pre>
* FILE : DmsActivitiTransactionFactory.java
* CLASS : DmsActivitiTransactionFactory
*
* AUTHOR : Liaokailin
*
* FUNCTION :
*
*
* Contact: Sina L凯林
*
*======================================================================
* CHANGE HISTORY LOG
*----------------------------------------------------------------------
* MOD. NO.| DATE | NAME | REASON | CHANGE REQ.
*----------------------------------------------------------------------
* |2014年1月21日|Liaokailin| Created |
* DESCRIPTION:
* </pre>
***********************************************************************/
package com.infodms.dms.utils; import java.sql.Connection;
import java.util.Properties; import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import com.infoservice.po3.core.context.DBService; public class DmsActivitiTransactionFactory extends JdbcTransactionFactory { @Override
public Transaction newTransaction(Connection conn, boolean autoCommit) {
System.out.println("开启新的事物");
return new DmsActitiviTransaction(conn,autoCommit) ;
//return (Transaction) DBService.getInstance().getTransaction() ;
} @Override
public void setProperties(Properties props) {
super.setProperties(props);
} }
DmsActitiviTransaction 代码如下:
/**********************************************************************
* <pre>
* FILE : DmsActitiviTransaction.java
* CLASS : DmsActitiviTransaction
*
* AUTHOR : Liaokailin
*
* FUNCTION :
*
*
* Contact: Sina L凯林
*
*======================================================================
* CHANGE HISTORY LOG
*----------------------------------------------------------------------
* MOD. NO.| DATE | NAME | REASON | CHANGE REQ.
*----------------------------------------------------------------------
* |2014年1月21日|Liaokailin| Created |
* DESCRIPTION:
* </pre>
***********************************************************************/
package com.infodms.dms.utils; import java.sql.Connection;
import java.sql.SQLException; import org.apache.ibatis.transaction.jdbc.JdbcTransaction; import com.infodms.dms.db.DBManager;
import com.infoservice.po3.core.context.DBService; public class DmsActitiviTransaction extends JdbcTransaction {
private static Connection conn = null ;
public DmsActitiviTransaction(Connection connection,
boolean desiredAutoCommit) {
//connection.setAutoCommit(desiredAutoCommit);
super(connection, desiredAutoCommit);
try {
connection.setAutoCommit(desiredAutoCommit);
} catch (SQLException e) {
e.printStackTrace();
} } @Override
public Connection getConnection() {
/*DBService d = DBService.getInstance() ;
d.loadConf("/DataAccessContext.xml");
return d.getConnection() ;*/
// return DBService.getInstance().getConnection() ;
try {
if(conn==null){
synchronized (DmsActitiviTransaction.class) {
conn = DBManager.getConnection() ;
}
}
return conn ;
} catch (Exception e) {
System.out.println("获取链接失败:"+e);
return null ;
}
} @Override
public void close() throws SQLException {
/* if(conn!=null&&!conn.isClosed()){
conn.close();
}*/
System.out.println("activit:close()");
} @Override
public void commit() throws SQLException {
/*if(conn!=null&&!conn.isClosed()){
conn.commit();
}*/
System.out.println("activit:commit()");
} @Override
protected void resetAutoCommit() {
System.out.println("resetAutoCommit()");
/*try {
if (conn != null && !conn.isClosed()) {
conn.setAutoCommit(false);
}
} catch (SQLException e) {
e.printStackTrace(); }*/
} @Override
public void rollback() throws SQLException {
/*if(conn!=null&&!conn.isClosed()){
conn.rollback();
}*/
System.out.println("activit:rollback()");
} @Override
protected void setDesiredAutoCommit(boolean arg0) {
System.out.println("setDesiredAutoCommit:"+arg0);
} }
其中DBManager
/**********************************************************************
* <pre>
* FILE : DBManager.java
* CLASS : DBManager
*
* AUTHOR : Liaokailin
*
* FUNCTION :
*
*
* Contact: Sina L凯林
*
*======================================================================
* CHANGE HISTORY LOG
*----------------------------------------------------------------------
* MOD. NO.| DATE | NAME | REASON | CHANGE REQ.
*----------------------------------------------------------------------
* |2014年1月22日|Liaokailin| Created |
* DESCRIPTION:
* </pre>
***********************************************************************/
package com.infodms.dms.db; import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; import com.infoservice.po3.core.context.DBInfo; public class DBManager {
public static DataSource dataSource = null ;
public static Connection conn = null ;
public static DataSource getDataSource(){
if(dataSource==null){
synchronized (DBManager.class) {
Resource resource = new ClassPathResource("/DataAccessContext.xml");
BeanFactory springBeanFactory = new XmlBeanFactory(resource);
DBInfo dbInfo = ((DBInfo)springBeanFactory.getBean("DBInfo"));
dataSource = (DataSource)springBeanFactory.getBean(dbInfo.getDefDataSource());
System.out.println("获取数据源");
}
}else{
System.out.println("默认数据源调用");
} return dataSource ;
} public static Connection getConnection() throws SQLException{
if(conn!=null&&!conn.isClosed()){
System.out.println("获取默认连接"); }else{
synchronized (DBManager.class) {
System.out.println("获取连接");
conn = getDataSource().getConnection() ;
}
}
return conn ;
} public static void startTransaction(Connection connection) throws SQLException {
System.out.println("开启事物");
connection.setAutoCommit(false);
} public static void endTransaction(Connection connection) throws SQLException{
System.out.println("提交事物 ");
connection.commit();
connection.setAutoCommit(true);
} public static void rollBack(Connection connection) throws SQLException{
System.out.println("回滚事物");
connection.rollback();
}
}
调用的使用DBManager就ok了
工作流activiti-02事物控制、流程引擎创建的更多相关文章
- 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解
流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...
- activiti入门2流程引擎的API和服务基础
RepositoryService : 管理和控制发布包和流程定义(包含了一个流程每个环节的结构和行为)的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部和特定 ...
- activiti入门2流程引擎API和服务基础设施
RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...
- 流程引擎的API和服务基础
RepositoryService : 管理和控制 发布包 和 流程定义(包含了一个流程每个环节的结构和行为) 的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部 ...
- (2)java程序走一遍工作流activiti
工作流从流程定义到创建一个流程实例完成执行步骤 使用activi-designer创建一个流程定义(.bpmn结尾的文件) 将定义好的流程定义和生成的png图片通过RepositoryService( ...
- Camunda 流程引擎的一种 Adapter 层实现
上一篇说明了选择 Camunda 的理由.这一篇说明如何实现适配层. 当前还没有专门写一篇对 Camunda 各个功能的详细介绍.如果要获得比较直观的感受,可以下载 Modeler 或者使用在线版的 ...
- 从零开始学习和改造activiti流程引擎的13天,自己记录一下
day#1(11.13) 尝试通过spring boot 集成最新版activiti 7,但是苦于官方的文档基本为空,无法完成spring boot的配置,最终按照activiti 6的文档,手工初始 ...
- 开源流程引擎osworkflow、jbpm、activiti、flowable、camunda哪个好?
市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.其中:Jbpm4.Activiti.Flowable.camunda四个框架同宗同源, ...
- activiti学习3:流程引擎对象和流程引擎配置对象
目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...
随机推荐
- 从MVC框架看MVC架构的设计(转)
尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...
- fastjson将bean转成字符串时首字母变小写问题
一个项目需求要求返回值为JSON格式,且大多数字段是首字母大写,还有些是类似N_TX这样的格式,在输出这样的结果时遇到了问题,由于时间紧,就直接拷贝需要的结果字段建立JavaBean类,本以为最后直接 ...
- Delphi TcxTreeList 怎们显示下拉列表
TcxTreeList 怎们显示下拉列表, 操作如下: 1.定义一个TStringlist中存储你的信息. 2.然后选定在TcxTreeList的哪个列要变成TCombobox, 如下图: 3. ...
- throw new DataException("检查服务器是否存在失败:" + ex);
try { } catch (Exception ex) { LogHelper.Error(" ...
- 使用 Make 命令构建网站
网站开发正变得越来越专业,涉及到各种各样的工具和流程,迫切需要构建自动化. 所谓”构建自动化”,就是指使用构建工具,自动实现”从源码到网页”的开发流程.这有利于提高开发效率.改善代码质量. 本文介绍如 ...
- Xcode HeaderDoc 教程(2)
Code Snippets,让一切变得更简单: 这真的非常easy,不是吗?但还能更简单一些吗? 本站以前介绍过 code snippets.请看这里. Code snippets 在 Xcode 中 ...
- 【开源项目】Android 手写记事 App(半成品)
该项目已上传到 CSDN 的 Git 平台中 项目地址:https://code.csdn.net/gd920129/whiteboard GIT SSH:git@code.csdn.net:gd92 ...
- Robotium -- 针对apk包的测试
在使用Robotium测试的时候,有时候,测试人员并没有代码权限,而Robotium也可以在只有apk文件进行测试,下面就介绍一下这个过程. 1.设置环境变量 安装jdk环境和sdk环境 2.安装签名 ...
- Android入门之ActionBar实现Tab导航
效果图: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...
- swift实现ios类似微信输入框跟随键盘弹出的效果
封面(图文无关) 为什么要做这个效果 在聊天app,例如微信中,你会注意到一个效果,就是在你点击输入框时输入框会跟随键盘一起向上弹出,当你点击其他地方时,输入框又会跟随键盘一起向下收回,二者完全无缝连 ...