浏览代码

新增事务提交后回调功能

James 1 年之前
父节点
当前提交
b07aa5874f

+ 25 - 0
src/main/java/com/jfinal/plugin/activerecord/Config.java

@@ -33,6 +33,8 @@ public class Config {
 
 	private final ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
 
+	private final ThreadLocal<Runnable> callbackAfterTxCommitTL = new ThreadLocal<>();
+
 	String name;
 	DataSource dataSource;
 
@@ -247,6 +249,29 @@ public class Config {
 			if (conn != null)
 				try {conn.close();} catch (SQLException e) {throw new ActiveRecordException(e);}
 	}
+
+	public void setCallbackAfterTxCommit(Runnable callback) {
+		callbackAfterTxCommitTL.set(callback);
+	}
+
+	public void removeCallbackAfterTxCommit() {
+		callbackAfterTxCommitTL.remove();
+	}
+
+	public void executeCallbackAfterTxCommit() {
+		Runnable runnable = callbackAfterTxCommitTL.get();
+		if (runnable != null) {
+			try {
+				runnable.run();
+			} catch (Exception e) {
+				// commit() 之后的回调异常不向外传播,保障事务主线完结
+				// e.printStackTrace();
+				com.jfinal.log.Log.getLog(Config.class).error(e.getMessage(), e);
+			} finally {
+				callbackAfterTxCommitTL.remove();
+			}
+		}
+	}
 }
 
 

+ 4 - 2
src/main/java/com/jfinal/plugin/activerecord/DbPro.java

@@ -847,10 +847,12 @@ public class DbPro {
 			conn.setTransactionIsolation(transactionLevel);
 			conn.setAutoCommit(false);
 			boolean result = atom.run();
-			if (result)
+			if (result) {
 				conn.commit();
-			else
+				config.executeCallbackAfterTxCommit();
+			} else {
 				conn.rollback();
+			}
 			return result;
 		} catch (NestedTransactionHelpException e) {
 			if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}

+ 3 - 2
src/main/java/com/jfinal/plugin/activerecord/tx/Tx.java

@@ -74,13 +74,13 @@ public class Tx implements Interceptor {
 			try {
 				if (conn.getTransactionIsolation() < getTransactionLevel(config))
 					conn.setTransactionIsolation(getTransactionLevel(config));
-				
+
 				if (txFun == null) {
 				    inv.invoke();
 				} else {
 				    txFun.call(inv, conn);
 				}
-				
+
 				return ;
 			} catch (SQLException e) {
 				throw new ActiveRecordException(e);
@@ -98,6 +98,7 @@ public class Tx implements Interceptor {
 			if (txFun == null) {
 				inv.invoke();
 				conn.commit();
+				config.executeCallbackAfterTxCommit();
 			} else {
 				txFun.call(inv, conn);
 			}