zoukankan      html  css  js  c++  java
  • TransactionSynchronizationManager TransactionSynchronizationAdapter

    public class TransactionSynchronizer {
        private final static Logger logger = LoggerFactory.getLogger(TransactionSynchronizer.class);
    
        public static void afterCommit(final Runnable runnable) {
            if (TransactionSynchronizationManager.isActualTransactionActive()) {
                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                    @Override
                    public void afterCommit() {
                        runnable.run();
                    }
                });
            } else {
                //directly call
                runnable.run();
            }
        }
    
        @SuppressWarnings("unchecked")
        public static <T> Future<T> afterCommit(final Callable<T> callable) {
            final TransactionFuture<T> future = new TransactionFuture<>();
            if (TransactionSynchronizationManager.isActualTransactionActive()) {
                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                    @Override
                    public void afterCommit() {
                        try {
                            future.put(callable.call());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            } else {
                //directly call
                try {
                    future.put(callable.call());
                } catch (Exception e) {
                    future.cancel(true);
                }
            }
            return future;
        }
    
        /**
         * after commit or rollback
         */
        public static void afterCompletion(final Runnable runnable) {
            if (TransactionSynchronizationManager.isActualTransactionActive()) {
                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                    @Override
                    public void afterCompletion(int status) {
                        runnable.run();
                    }
                });
            } else {
                //directly call
                runnable.run();
            }
        }
    
        @SuppressWarnings("unchecked")
        public static <T> Future<T> afterCompletion(final Callable<T> callable) {
            final TransactionFuture<T> future = new TransactionFuture<>();
            if (TransactionSynchronizationManager.isActualTransactionActive()) {
                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                    @Override
                    public void afterCompletion(int status) {
                        try {
                            future.put(callable.call());
                        } catch (Exception e) {
                            logger.error("error calling callable.", e);
                            future.cancel(true);
                        }
                    }
                });
            } else {
                //directly call
                try {
                    future.put(callable.call());
                } catch (Exception e) {
                    logger.error("error calling callable.", e);
                    future.cancel(true);
                }
            }
            return future;
        }
    }
  • 相关阅读:
    非常实用的原创小工具:EasyIP
    ORACLE日期时间函数大全
    Windows 下单机最大TCP连接数
    如何自动以管理员身份运行.NET程序?
    ExecuteScalar 返回值问题
    Assembly类
    .Net字符串驻留池
    进程Process
    C#连接Oracle数据库(直接引用dll使用)
    谈Linux与Windows的比较
  • 原文地址:https://www.cnblogs.com/zhonghan/p/3842499.html
Copyright © 2011-2022 走看看