最近在项目中使用activiti工作流,但是发现在自己人为制造一个错误后,nutz捕捉到了异常,启动了事务回滚,但是activiti表内数据却没有回滚成功,怀疑是activiti没有成功注入nutz事务,请问一下大佬有遇到过类似问题吗?
Trans.exec(new Atom() {
@Override
public void run() {
try {
//获取bpmn文件的输入流
InputStream inputStream = tf.getInputStream();
//开始部署工作流
System.out.println(tf.getSubmittedFileName());
Deployment deployment = processEngine.getRepositoryService().createDeployment().name(expendClassifyName+"费用申请流程")
.addInputStream(tf.getSubmittedFileName(), inputStream).deploy();
System.out.println(1/0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
@wendal 请问一下具体是怎么做的?研究了一天,没什么进展呀,兽总
@wendal 好,我去找找
@wendal 搞定了。谢谢我兽总
@zhangkaidsy 怎样搞定的?分享一下?
@wendal 还是有问题的,nutz的数据库操作和activiti的数据库操作不是一个连接,回滚还是失败
@wendal 兽总,你那还有没有其他的资料说到过这个问题的呀?
@wendal 兽总,那如何获取nutz正在使用的连接?
@wendal 问题已经解决了,具体的解决步骤需要私发给你吗?兽总
@wendal 我新写了两个类,类的代码直接贴到帖子里也行
CustomJdbcTransaction.java类代码:
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.session.TransactionIsolationLevel;
import org.apache.ibatis.transaction.jdbc.JdbcTransaction;
import org.nutz.trans.Trans;
import com.sys.util.nutz.NutzUtil;
public class CustomJdbcTransaction extends JdbcTransaction{
private static final Log log = LogFactory.getLog(CustomJdbcTransaction.class);
public CustomJdbcTransaction(Connection connection) {
super(connection);
}
public CustomJdbcTransaction(DataSource ds,
TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
super(ds, desiredLevel, desiredAutoCommit);
}
@Override
protected void openConnection() throws SQLException {
// super.openConnection();
//connection = NutzUtil.getConnection();
connection = Trans.getConnectionAuto(NutzUtil.getDataSource());
if (log.isDebugEnabled()) {
log.debug("{CustomJdbcTransaction } Openning JDBC Connection"+connection.hashCode()+"[]"+autoCommmit);
}
// connection = dataSource.getConnection();
if (level != null) {
connection.setTransactionIsolation(level.getLevel());
}
setDesiredAutoCommit(autoCommmit);
}
@Override
public void close() throws SQLException {
if (log.isDebugEnabled()) {
log.debug("{CustomJdbcTransaction } closing JDBC Connection"+connection.hashCode());
}
// super.close();
}
@Override
public void commit() throws SQLException {
// TODO Auto-generated method stub
// super.commit();
}
@Override
public void rollback() throws SQLException {
// TODO Auto-generated method stub
// super.rollback();
}
}
CustomJdbcTransactionFactory.java类代码:
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.jdbc.JdbcTransactionFactory;
public class CustomJdbcTransactionFactory extends JdbcTransactionFactory {
@Override
public void setProperties(Properties props) {
super.setProperties(props);
}
@Override
public Transaction newTransaction(Connection conn) {
// return super.newTransaction(conn);
return new CustomJdbcTransaction(conn);
}
@Override
public Transaction newTransaction(DataSource ds,
TransactionIsolationLevel level, boolean autoCommit) {
// return super.newTransaction(ds, level, autoCommit);
return new CustomJdbcTransaction(ds, level, autoCommit);
}
}
然后在activiti-engine.js配置文件内添加如下配置:
jdbcTransactionFactory : {
type : "com.sys.activiti.transaction.CustomJdbcTransactionFactory"
}
最后在processEngineSpec 中引用jdbcTransactionFactory 就大功告成了
processEngineSpec : {
type : "com.sys.org.nutz.integration.activiti.ActivitiProcessEngineConfiguration",
factory: "$conf#make",
args : ["com.sys.org.nutz.integration.activiti.ActivitiProcessEngineConfiguration", "activiti."],
fields : {
dataSource : {refer:"dataSource"},
expressionManager : {refer:"nutzExpressionManager"},
transactionFactory : {refer:"jdbcTransactionFactory"}
}
}
@wendal 就是以上这些内容
CustomJdbcTransaction.java类代码:
package com.sys.activiti.transaction;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.session.TransactionIsolationLevel;
import org.apache.ibatis.transaction.jdbc.JdbcTransaction;
import org.nutz.trans.Trans;
import com.sys.util.nutz.NutzUtil;
public class CustomJdbcTransaction extends JdbcTransaction{
private static final Log log = LogFactory.getLog(CustomJdbcTransaction.class);
public CustomJdbcTransaction(Connection connection) {
super(connection);
}
public CustomJdbcTransaction(DataSource ds,
TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
super(ds, desiredLevel, desiredAutoCommit);
}
@Override
protected void openConnection() throws SQLException {
// super.openConnection();
//connection = NutzUtil.getConnection();
connection = Trans.getConnectionAuto(NutzUtil.getDataSource());
if (log.isDebugEnabled()) {
log.debug("{CustomJdbcTransaction } Openning JDBC Connection"+connection.hashCode()+"[]"+autoCommmit);
}
// connection = dataSource.getConnection();
if (level != null) {
connection.setTransactionIsolation(level.getLevel());
}
setDesiredAutoCommit(autoCommmit);
}
@Override
public void close() throws SQLException {
if (log.isDebugEnabled()) {
log.debug("{CustomJdbcTransaction } closing JDBC Connection"+connection.hashCode());
}
// super.close();
}
@Override
public void commit() throws SQLException {
// TODO Auto-generated method stub
// super.commit();
}
@Override
public void rollback() throws SQLException {
// TODO Auto-generated method stub
// super.rollback();
}
}
CustomJdbcTransactionFactory.java类代码:
package com.sys.activiti.transaction;
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.jdbc.JdbcTransactionFactory;
public class CustomJdbcTransactionFactory extends JdbcTransactionFactory {
@Override
public void setProperties(Properties props) {
super.setProperties(props);
}
@Override
public Transaction newTransaction(Connection conn) {
// return super.newTransaction(conn);
return new CustomJdbcTransaction(conn);
}
@Override
public Transaction newTransaction(DataSource ds,
TransactionIsolationLevel level, boolean autoCommit) {
// return super.newTransaction(ds, level, autoCommit);
return new CustomJdbcTransaction(ds, level, autoCommit);
}
}
然后在activiti-engine.js配置文件内添加如下配置:
jdbcTransactionFactory : {
type : "com.sys.activiti.transaction.CustomJdbcTransactionFactory"
}
最后在processEngineSpec 中引用jdbcTransactionFactory 就大功告成了
processEngineSpec : {
type : "com.sys.org.nutz.integration.activiti.ActivitiProcessEngineConfiguration",
factory: "$conf#make",
args : ["com.sys.org.nutz.integration.activiti.ActivitiProcessEngineConfiguration", "activiti."],
fields : {
dataSource : {refer:"dataSource"},
expressionManager : {refer:"nutzExpressionManager"},
transactionFactory : {refer:"jdbcTransactionFactory"}
}
}
@wendal 失误,改正过来了