文档章节

Jfinal与Activiti整合事务方案

超龍
 超龍
发布于 2017/09/03 09:35
字数 708
阅读 471
收藏 0

activiti基于spring的事务集成,网上的资料很多。这里省略1000字。

但是,有的项目并没有使用spring,那怎么控制事务呢?

比如jfinal框架与Activiti整合。

先写一个插件:ActivitiPlugin

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;

import com.jfinal.plugin.IPlugin;
import com.jfinal.plugin.activerecord.DbKit;

public class ActivitiPlugin implements IPlugin{

private static ProcessEngine processEngine = null;
private static ProcessEngineConfiguration processEngineConfiguration = null;
private boolean isStarted = false;
@Override
public boolean start(){
try {
createProcessEngine();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}

@Override
public boolean stop() {
ProcessEngines.destroy();
isStarted = false;
return true;
}

private Boolean createProcessEngine() throws Exception{
if (isStarted) {
return true;
}
StandaloneProcessEngineConfiguration conf = (StandaloneProcessEngineConfiguration) ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
conf.setDataSource(DbKit.getConfig().getDataSource());
conf.setEnableDatabaseEventLogging(false);
conf.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_TRUE);//更新
// conf.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE);//重置数据库!!!调试用!!!请勿打开!!!
conf.setDbHistoryUsed(true);
// conf.setTransactionsExternallyManaged(true); // 使用托管事务工厂
conf.setTransactionFactory(new ActivitiTransactionFactory());
UuidGenerator uuidG = new UuidGenerator();
conf.setIdGenerator(uuidG);
ActivitiPlugin.processEngine = conf.buildProcessEngine();
isStarted = true;
//开启流程引擎
System.out.println(“启动流程引擎…….”);
return isStarted;
}

// 开启流程服务引擎
public static ProcessEngine buildProcessEngine() {
if (processEngine == null)
if (processEngineConfiguration != null) {
processEngine = processEngineConfiguration.buildProcessEngine();
}
return processEngine;
}

ActivitiTransactionFactory:

import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.session.TransactionIsolationLevel;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;

public class ActivitiTransactionFactory implements TransactionFactory {

@Override
public void setProperties(Properties props) {
}

@Override
public Transaction newTransaction(Connection conn) {
return new ActivitiTransaction(conn);
}

@Override
public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {
return new ActivitiTransaction(ds, level, autoCommit);
}
}

UuidGenerator:

import java.util.UUID;

import org.activiti.engine.impl.cfg.IdGenerator;

public class UuidGenerator implements IdGenerator {

@Override
public String getNextId() {
return UUID.randomUUID().toString().replace(“-“, “”);
}

}

ActivitiTransactionFactory:

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.ibatis.session.TransactionIsolationLevel;
import org.apache.ibatis.transaction.Transaction;

import com.jfinal.plugin.activerecord.DbKit;
public class ActivitiTransaction implements Transaction {

protected Connection connection;
protected DataSource dataSource;
protected TransactionIsolationLevel level;
protected boolean autoCommmit;

public ActivitiTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
dataSource = ds;
level = desiredLevel;
autoCommmit = desiredAutoCommit;
}

public ActivitiTransaction(Connection connection) {
this.connection = connection;
}

/**
* 重写了openConnection()方法,获取数据库连接是我业务打开的那个连接
*/

@Override
public Connection getConnection() throws SQLException {
if (connection == null) {
openConnection();
}
return connection;
}

/**
* 连接关闭close(),提交commit(),回滚rollback() ,
* 全部注释了。对数据库连接的操作都有我业务来控制,不让activiti控制了
*/

@Override
public void commit() throws SQLException {
}

@Override
public void rollback() throws SQLException {
}

@Override
public void close() throws SQLException {
if(connection!=null){
DbKit.getConfig().close(connection);
}
}

protected void openConnection() throws SQLException {
connection = DbKit.getConfig().getConnection();
if (level != null) {
connection.setTransactionIsolation(level.getLevel());
}
}
}

Jfinal配置,在configPlugin方法里面写:

/**
* 配置插件
*/
public void configPlugin(Plugins me) {
//me.add(new EhCachePlugin()); //缓存
// 配置druid数据库连接池插件
DruidPlugin druidPlugin = createDruidPlugin();
druidPlugin.set(2, 2, 200);//设置最大连接数
// 配置Oracle驱动
druidPlugin.setDriverClass(“oracle.jdbc.driver.OracleDriver”);
druidPlugin.addFilter(new StatFilter());
// 指定连接验证语句(用于保存数据库连接池), 这里不加会报错误:invalid oracle validationQuery. select
// 1, may should be : select 1 FROM DUAL
druidPlugin.setValidationQuery(“select 1 FROM DUAL”);
WallFilter wall = new WallFilter();
// 设计数据库类型
wall.setDbType(JdbcConstants.ORACLE);
druidPlugin.addFilter(wall);
me.add(druidPlugin);

// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
// 配置属性名(字段名)大小写不敏感容器工厂
// arp.setContainerFactory(new CaseInsensitiveContainerFactory());
arp.setContainerFactory(new PropertyNameContainerFactory());
// 配置Oracle方言
arp.setDialect(new OracleDialect());
// arp.setTransactionLevel(8);
arp.setShowSql(true);
arp.setBaseSqlTemplatePath(PathKit.getRootClassPath());
arp.addSqlTemplate(“global.sql”);
// 所有映射在 MappingKit 中自动化搞定
//_MappingKit.mapping(arp);
me.add(arp);

// 配置工作流引擎
ActivitiPlugin ap = new ActivitiPlugin();
me.add(ap);
SqlReporter.setLog(true);
// 用于缓存session模块的redis服务
RedisPlugin sessionRedis = new RedisPlugin(“session”, PropKit.get(“sessionRedis”).trim());
me.add(sessionRedis);

}

上面我用的是druid连接池。

需要注意的是:me.add(arp);必须在me.add(ap);之前,否则会有空指针报错!

© 著作权归作者所有

共有 人打赏支持
超龍
粉丝 1
博文 30
码字总数 8618
作品 0
朝阳
Jfinal集成Spring插件

最近公司使用Jfinal开发项目,不知道什么原因Jfinal和其他的几个插件集成的时候,事物管理并不那么随心,所以就选择了Spring作为Jfinal的插件来管理事物.废话不多说,直接上代码. IocKit.java S...

方宏春
09/14
0
0
JFinal整合CKFinder

使用JFinal对之前的系统进行重构,老系统使用了CKEditor+CKFinder编辑器,发现在web.xml中配置ConnectorServlet会被JFinalFilter过滤处理,而且使用JFinal之后也不想在web.xml中增加额外的配...

pandyyan
2013/05/13
0
0
JFinal-Beetl-Shiro(JdbcRealm)-例子

JFinal-Shiro-JDBC-Demo http://git.oschina.net/yinjun622/JFinal-Shiro-JDBC-Demo 简单实现@JFinal与Shiro整合例子 1、工程通过Eclipse直接导入,部署到tomcat中; 2、新建jfinalshiro数据......

leon_rock
2014/02/27
0
12
最近在做的一件事件编写JFinal教程《Jfinal极速开发实战》

从8月1号开始,整整一个月,初稿完成,朋友帮我第一次文字校对完成,现在正在根据波总的意见修改一些jfinal的设计原则说明 Jfinal、JfinalUIB学习交流QQ群:309647612 已经完成,前四章免费阅...

littleant
2015/08/20
0
12
jfinal框架增加微信jsapi支持

部分手机在图片上传的时候,调取不到sd卡相册或其他图片,为了解决这个兼容性问题,同一个页面使用了两种图片上传方案。 html5 :图片编码成base64 ,发送到后台,解码存储。这种方法用于解决...

YangTao
2015/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部