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;
    }
}

TransactionSynchronizationManager TransactionSynchronizationAdapter

时间: 2024-10-08 20:33:54

TransactionSynchronizationManager TransactionSynchronizationAdapter的相关文章

如何将一个操作“绑定到数据库事务上”

摘要 spring-cache简介 基本机制 事务上下文中的问题 将操作绑定到数据库事务上 spring-cache的相关实现 TransactionSynchronizationManager和TransactionSynchronizationAdapter 事务相关操作注册与回调流程 其它应用 摘要 在开发中,我们常常会遇到(或者需要)把一些操作"绑定到数据库事务上".也就是说,如果数据库事务成功提交,则执行这个操作:如果数据库事务回滚,则不执行这个操作(或者执行另一个操作).

Design patterns in Spring Framework

This article is the 4th about design patterns used in Spring framework. It'll present new 3 patterns implemented in this framework. At the begin, we'll discover 2 patterns belonging to the family of structural patterns: adapter and decorator. At the

朱晔和你聊Spring系列S1E6:容易犯错的Spring AOP

标题有点标题党了,这里说的容易犯错不是Spring AOP的错,是指使用的时候容易犯错.本文会以一些例子来展开讨论AOP的使用以及使用过程中容易出错的点. 几句话说清楚AOP 有关必要术语: 切面:Aspect,有的地方也叫做方面.切面=切点+增强,表示我们在什么点切入蛋糕,切入蛋糕后我们以什么方式来增强这个点. 切点:Pointcut,类似于查询表达式,通过在连接点运行查询表达式来寻找匹配切入点,Spring AOP中默认使用AspjectJ查询表达式. 增强:Advice,有的地方也叫做通知

简易版的生产者消费者实现业务异步事务分离

定义一个model类 /** * 版权所有: * 项目名称: * 创建者: * 创建日期: 2018年5月10日 * 文件说明: 见类描述 */ package com.huaxin.acws.component.message.model; import java.util.Date; import java.util.Map; /** * @author * */ public class MessageModel { /** * 事件ID */ private String eventId

一个基于RabbitMQ的可复用的事务消息方案

原文:一个基于RabbitMQ的可复用的事务消息方案 前提# 分布式事务是微服务实践中一个比较棘手的问题,在笔者所实施的微服务实践方案中,都采用了折中或者规避强一致性的方案.参考Ebay多年前提出的本地消息表方案,基于RabbitMQ和MySQL(JDBC)做了轻量级的封装,实现了低入侵性的事务消息模块.本文的内容就是详细分析整个方案的设计思路和实施.环境依赖如下: JDK1.8+ spring-boot-start-web:2.x.x.spring-boot-start-jdbc:2.x.x.

JDBCTemplate在AutoCommit为True时手动控制事务

这是工作中遇到的一个真实问题的处理过程,如果对分析过程不感兴趣,可以直接跳到最后看最终方案. 我们在持久化这一层,并没有用任何的ORM框架(无论是Hibernate还是MyBatis,亦或是DBUtils),而是采用了在JDBCTemplate基础上进行了简单的包装,同时我们也决定将AutoCommit设置为True,在sql语句执行完成后立即提交.这样做相比于@Transactional注解或者通过AOP来控制事务性能更好,也更方便. 在评估了优劣之后,便开始使用这种方式,随之我们也遇到了一个

理解Java ThreadLocal

ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. ThreadLocal很容易让人望文生义,想当然地认为是一个"本地线程".其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些. 当使用ThreadLocal维护变量

ThreadLocal的使用

<一>方法: void set(Object value)设置当前线程的线程局部变量的值. public Object get()该方法返回当前线程所对应的线程局部变量. public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法. 需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度. protected Object initia

Spring事务的来龙去脉

引言 Spring是一个IOC框架,在IOC框架的基础上,提供了DAO集成,AOP事务控制,JNDI等等一系列的高级功能,个人觉得,在Spring中最值得称道的不仅仅它是一个非入侵的IOC容器,而在于其神奇的声明事务以及异常处理: Jdbc事务实现 为什么要使用事务,银行转账的例子都用烂了,这里就不再累赘,JDBC的本地事务利用Connention.setAutoCommit()的方法来保证的. public boolean updateAMoney(Conn){ ...... } public