网站建设颊算十堰网站建设怎么样
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:47
当前位置: 首页 > news >正文
网站建设颊算,十堰网站建设怎么样,dede网站源码下载,建设一个网站的方法使用背景
在业务中#xff0c;经常会有这样的需求#xff0c;在数据库事务提交之后#xff0c;发送异步消息或者进行其他的事务操作。
例如当用户注册成功之后#xff0c;发送激活码#xff0c;如果用户注册后就执行发送激活码#xff0c;但是在用户保存时出现提交事务…使用背景
在业务中经常会有这样的需求在数据库事务提交之后发送异步消息或者进行其他的事务操作。
例如当用户注册成功之后发送激活码如果用户注册后就执行发送激活码但是在用户保存时出现提交事务异常数据库进行回滚用户实际没有注册成功但是用户却收到了激活码此时正确的是应该在用户注册保存事务提交完成之后然后发送激活码。 标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作
使用注解TransactionalEventListener
demo展示
事务监听器
Component
public class TransactionListener {TransactionalEventListener(phase TransactionPhase.AFTER_COMMIT)public void handler(TransactionEvent transactionEvent) {System.out.println(transactionEvent.getSource());}
}业务代码
Override
Transactional(rollbackFor Exception.class,propagation Propagation.REQUIRED)
public void saveUser() {User user new User();userMapper.insert(user);eventPublisher.publishEvent(newTransactionEvent(事务提交后发布事件1));
}标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作
源码解析
EventListenerMethodProcessor
EventListenerMethodProcessor用来解析带有带有EventListener注解的方法。遍历类上的方法判断工厂是否支持用对应的工厂生成监听器。 private void processBean(final String beanName, final Class? targetType) {if (!this.nonAnnotatedClasses.contains(targetType) AnnotationUtils.isCandidateClass(targetType, EventListener.class) !isSpringContainerClass(targetType)) {//…if (CollectionUtils.isEmpty(annotatedMethods)) {//…}else {// Non-empty set of methodsConfigurableApplicationContext context this.applicationContext;Assert.state(context ! null, No ApplicationContext set);ListEventListenerFactory factories this.eventListenerFactories;Assert.state(factories ! null, EventListenerFactory List not initialized);for (Method method : annotatedMethods.keySet()) {for (EventListenerFactory factory : factories) {if (factory.supportsMethod(method)) {Method methodToUse AopUtils.selectInvocableMethod(method, context.getType(beanName));ApplicationListener? applicationListener factory.createApplicationListener(beanName, targetType, methodToUse);if (applicationListener instanceof ApplicationListenerMethodAdapter) {((ApplicationListenerMethodAdapter) applicationListener).init(context, this.evaluator);}context.addApplicationListener(applicationListener);break;}}}if (logger.isDebugEnabled()) {logger.debug(annotatedMethods.size() EventListener methods processed on bean beanName : annotatedMethods);}}}}TransactionalEventListenerFactory仅支持TransactionalEventListener注解生成ApplicationListenerMethodTransactionalAdapter的对象。
public class TransactionalEventListenerFactory implements EventListenerFactory, Ordered {private int order 50;public TransactionalEventListenerFactory() {}public void setOrder(int order) {this.order order;}public int getOrder() {return this.order;}public boolean supportsMethod(Method method) {return AnnotatedElementUtils.hasAnnotation(method, TransactionalEventListener.class);}public ApplicationListener? createApplicationListener(String beanName, Class? type, Method method) {return new ApplicationListenerMethodTransactionalAdapter(beanName, type, method);}
}在AbstractTransactionManagementConfiguration会引入TransactionalEventListenerFactory。 Bean(name {org.springframework.transaction.config.internalTransactionalEventListenerFactory})Role(2)public static TransactionalEventListenerFactory transactionalEventListenerFactory() {return new TransactionalEventListenerFactory();}标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作
ApplicationListenerMethodTransactionalAdapter
发布事件主要是创建了TransactionSynchronization注册到了TransactionSynchronizationManager public void onApplicationEvent(ApplicationEvent event) {if (TransactionSynchronizationManager.isSynchronizationActive() TransactionSynchronizationManager.isActualTransactionActive()) {TransactionSynchronization transactionSynchronization this.createTransactionSynchronization(event);TransactionSynchronizationManager.registerSynchronization(transactionSynchronization);} else if (this.annotation.fallbackExecution()) {if (this.annotation.phase() TransactionPhase.AFTER_ROLLBACK this.logger.isWarnEnabled()) {this.logger.warn(Processing event as a fallback execution on AFTER_ROLLBACK phase);}this.processEvent(event);} else if (this.logger.isDebugEnabled()) {this.logger.debug(No transaction is active - skipping event);}}标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作
事务提交
TransactionSynchronizationUtils#invokeAfterCompletion事务提交会遍历TransactionSynchronization执行afterCompletion方法 public static void invokeAfterCompletion(Nullable ListTransactionSynchronization synchronizations, int completionStatus) {if (synchronizations ! null) {Iterator var2 synchronizations.iterator();while(var2.hasNext()) {TransactionSynchronization synchronization (TransactionSynchronization)var2.next();try {synchronization.afterCompletion(completionStatus);} catch (Throwable var5) {logger.error(TransactionSynchronization.afterCompletion threw exception, var5);}}}ApplicationListenerMethodTransactionalAdapter.TransactionSynchronizationEventAdapter#afterCompletion调用事件监听器的processEvent方法会反射调用被TransactionalEventListener修饰的方法。 public void afterCompletion(int status) {if (this.phase TransactionPhase.AFTER_COMMIT status 0) {this.processEvent();} else if (this.phase TransactionPhase.AFTER_ROLLBACK status 1) {this.processEvent();} else if (this.phase TransactionPhase.AFTER_COMPLETION) {this.processEvent();}}protected void processEvent() {this.listener.processEvent(this.event);}标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作
使用TransactionSynchronizationManager 和 TransactionSynchronizationAdapter
demo展示
Autowired
private UserDao userDao;
Autowired
private JmsProducer jmsProducer;public User saveUser(User user) {// 保存用户userDao.save(user);final int userId user.getId();// 兼容无论是否有事务if(TransactionSynchronizationManager.isActualTransactionActive()) {TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {Overridepublic void afterCommit() {jmsProducer.sendEmail(userId);}});} else {jmsProducer.sendEmail(userId);}
}标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作 标题复制10行并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作【Spring事务】Spring事务事件控制解决业务异步操作并且每行大于10个字符【Spring事务】Spring事务事件控制解决业务异步操作
- 上一篇: 网站建设加入购买按钮惠州网站建设效果
- 下一篇: 网站建设价格报价长春哪家网站做的好
相关文章
-
网站建设加入购买按钮惠州网站建设效果
网站建设加入购买按钮惠州网站建设效果
- 技术栈
- 2026年03月21日
-
网站建设加盟模式郑州有哪些搞网站开发的公司
网站建设加盟模式郑州有哪些搞网站开发的公司
- 技术栈
- 2026年03月21日
-
网站建设季度考核评价工作总结seo网站优化培训怎么做
网站建设季度考核评价工作总结seo网站优化培训怎么做
- 技术栈
- 2026年03月21日
-
网站建设价格报价长春哪家网站做的好
网站建设价格报价长春哪家网站做的好
- 技术栈
- 2026年03月21日
-
网站建设价格多少钱WordPress对接阿里云cdn
网站建设价格多少钱WordPress对接阿里云cdn
- 技术栈
- 2026年03月21日
-
网站建设简述工程与建设期刊
网站建设简述工程与建设期刊
- 技术栈
- 2026年03月21日
