文档章节

Jfinal与Activiti整合事务方案

超龍
 超龍
发布于 2017/09/03 09:35
字数 708
阅读 593
收藏 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 官方文档可以多一点 和其它框架的整合文档吗?

@JFinal 你好,想跟你请教个问题:该怎么形容我的心情尼?很纠结,写了一大段,我还是删了,重新简短点说,虽然感觉对你提这个要求有点不切实际,就是jfinal和第3方面框架的整合文档==0,给人...

熊猫你好
2017/03/21
260
2
jfinal+activiti

@JFinal 你好,想跟你请教个问题:最近 公司项目需要用到工作流activiti,请问jfinal可以整合activiti吗?有没有这样的案例

zhaorg
2015/06/05
2.2K
2
JFinal 怎么自己活得数据库Connection对象?我需要把工作流事务整合到JFinal

@JFinal 你好,我有下面这个需求,想了很久但问题还没有解决: JFinal 怎么自己活得数据库Connection对象?我需要把工作流事务整合到JFinal。 我的想法是,通过JFinal自带的事务控制,将工作...

蓝水晶飞机
2016/04/06
874
2
Jfinal与activiti整合方案

@JFinal 你好,想跟你请教个问题:Jfinal2.0以后去掉了spring的集成,那在2.0以上的版本中可以再用spring的相关包吗,因为需要集成工作流引擎,所以在考虑怎样和JFinal整合...

ilalice
2016/07/14
2.6K
5
JFinal OA的相关问题

JFinal OA我也在本地跑了下,但是有两个问题求助大家: JFinal OA的前端框架有没有EXT版本? JFinal OA的流程组件能否集成activiti ?

部分红薯进城
2013/07/05
995
3

没有更多内容

加载失败,请刷新页面

加载更多

SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
32分钟前
1
0
IntelliJ IDEA 第一个 Scala 程序

IntelliJ 安装完成 Scala 插件后,你需要尝试使用 IntelliJ 来创建并且运行第一个程序。 通常这个程序只是简单的输出 Hello World。 创建一个新工程 在文件下面选择新建,然后选择创建工程。...

honeymose
37分钟前
1
0
mysql分表,分区的区别和联系

一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同...

吴伟祥
39分钟前
0
0
csapp 习题 - 如何实现异或 exclusive-or

阅读 csapp v3 时,练习题 2.13 很有意思。练习题描述如下。 位设置是对于参数 mask 中每一个为 1 的位,那么参数 x 中相应位则被设置为 1 ;位清除是对于参数 mask 中每一个为 1 的位,那么...

ylme
昨天
5
0
Amino——产品迭代

兴趣部落产品迭代 时间 版本号 更新内容 备注 2019年1月2日 v3.1.1 支持定制部落首页的内容tab,酋长可以将精华、相册、分类添加到部落首页啦。 支持申请酋长,酋长可以直接推送优质话题,快...

铸剑为犁413
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部