当前位置: 首页 > news >正文

网站建设心得体会及总结google官网

网站建设心得体会及总结,google官网,成都专业vi设计公司,wordpress漏洞复现在事务还没有执行完消息就已经发出去了, 导致后续的一些数据或逻辑上的问题产生。场景如下:异步-记录日志:当事务提交后,再记录日志。发送mq消息:只有业务数据都存入表后,再发mq消息。方案1. 利用TransactionSynchroni…
在事务还没有执行完消息就已经发出去了, 导致后续的一些数据或逻辑上的问题产生。

场景如下:

  • 异步-记录日志:当事务提交后,再记录日志。

  • 发送mq消息:只有业务数据都存入表后,再发mq消息。

方案1. 利用TransactionSynchronizationManager的registerSynchronization()方法注册TransactionSynchronization实现类

我们只需要在执行的事务方法中, 添加如下代码, 就可以完成在事务提交后的逻辑处理了

// TransactionSynchronizationAdapter是TransactionSynchronization的默认实现
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic void afterCommit() {// 事务提交后需要执行的业务逻辑: 发消息, 日志...}
});

原理:

Spring 事务的扩展 – TransactionSynchronization

事务操作的时候它的当前线程还保存了 TransactionSynchronization 对象。而这个对象伴随着 Spring 对 事务处理的各个生命周期都会有相应的扩展

public interface TransactionSynchronization extends Flushable {/** 事务提交状态 */int STATUS_COMMITTED = 0;/** 事务回滚状态 */int STATUS_ROLLED_BACK = 1;/**系统异常状态 */int STATUS_UNKNOWN = 2;void suspend();void resume();void flush();// 事务提交之前void beforeCommit(boolean readOnly);// 事务成功或者事务回滚之前void beforeCompletion();// 事务成功提交之后void afterCommit();// 操作完成之后(包含事务成功或者事务回滚)void afterCompletion(int status);}

事务的事务扩展项目中的应用场景是当订单成功之后,发送一条消息到 MQ 当中去。由于事务是和数据库连接相绑定的,如果把发送消息和数据库操作放在一个事务里面。当发送消息时间过长时会占用数据库连接,所以就要把数据库操作与发送消息到 MQ 解耦开来。可以利用 TransactionSynchronization#afterCommit 的这个方法,当数据成功保存到数据库并且事务提交了就把消息发送到 MQ 里面。

@Transactional
public void finishOrder(Order order){// 修改订单成功updateOrderSuccess(order);// 发送消息到 MQTransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){@Overridepublic void afterCommit() {mqService.send(order);}});
}

当事务成功提交之后,就会把消息发送给 MQ,并且不会占用数据库连接资源。

方式二、Spring 事务扩展 – @TransactionalEventListener

在 Spring framework 4.2 之后还可以使用@TransactionalEventListener处理数据库事务提交成功后再执行操作。这种方式比 TransactionSynchronization 更加优雅。它的使用方式如下:

@Autowired
private ApplicationEventPublisher publisher;@Override
@Transactional(rollbackFor = Exception.class)
public void add(AdvanceChargeApplyAddInput input) {this.save(advanceChargeApply);// 发送事件publisher.publishEvent(advanceChargeApply);
}
// 响应事件, 事务提交后执行
@TransactionalEventListener
public void handle(PayloadApplicationEvent<AdvanceChargeApply> event) {System.out.println("TransactionalEventListener 事务提交后执行");
}

也可以自定义事件源和事件监听:

     @Transactionalpublic void finishOrder(Order order){// 修改订单成功updateOrderSuccess(order);// 发布 Spring Event 事件applicationEventPublisher.publishEvent(new MyAfterTransactionEvent(order));}@Slf4j@Componentprivate static class MyTransactionListener {@Autowiredprivate MqService mqService;@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)private void onHelloEvent(MyAfterTransactionEvent event) {Order order = event.getOrder();mqService.send(order);}}// 定一个事件,继承自ApplicationEvent private static class MyAfterTransactionEvent extends ApplicationEvent {private Order order;public MyAfterTransactionEvent(Object source, Order order) {super(source);this.order = order;}public Order getOrder() {return order;}}

它的实现原理是当 Spring Bean 的方法标注了通过 TransactionalEventListenerFactory#createApplicationListener创建 ApplicationListenerMethodTransactionalAdapter 然后在事件回调当中创建 TransactionSynchronization的实现类TransactionSynchronizationEventAdapter。并且通过 TransactionSynchronizationManager.registerSynchronization

把 TransactionSynchronizationEventAdapter 注册到当前线程当中。

TransactionSynchronizationEventAdapter
     private static class TransactionSynchronizationEventAdapter extends TransactionSynchronizationAdapter {private final ApplicationListenerMethodAdapter listener;private final ApplicationEvent event;private final TransactionPhase phase;public TransactionSynchronizationEventAdapter(ApplicationListenerMethodAdapter listener,ApplicationEvent event, TransactionPhase phase) {this.listener = listener;this.event = event;this.phase = phase;}@Overridepublic int getOrder() {return this.listener.getOrder();}@Overridepublic void beforeCommit(boolean readOnly) {if (this.phase == TransactionPhase.BEFORE_COMMIT) {processEvent();}}@Overridepublic void afterCompletion(int status) {if (this.phase == TransactionPhase.AFTER_COMMIT && status == STATUS_COMMITTED) {processEvent();}else if (this.phase == TransactionPhase.AFTER_ROLLBACK && status == STATUS_ROLLED_BACK) {processEvent();}else if (this.phase == TransactionPhase.AFTER_COMPLETION) {processEvent();}}protected void processEvent() {this.listener.processEvent(this.event);}}
http://www.tj-hxxt.cn/news/38543.html

相关文章:

  • 网站关键词从哪改怎么制作网站详细流程
  • 励志网站织梦源码aso投放平台
  • 网络营销外包都选异变网络sem对seo的影响有哪些
  • 网站开发技术合同杭州网站关键词排名
  • 重庆公司公章图片怀化网站seo
  • .net 获取网站域名网上开店如何推广自己的网店
  • 打开建设银行网站个人外包接单平台
  • 专业做网站流程优化seo网站
  • 大陆手机如何安装台湾app广东seo网站推广
  • 济南专业网站开发公司电商seo与sem是什么
  • 静态网页怎么做网站windows优化大师收费
  • 旅游网站建设初衷厦门seo外包平台
  • 海口网红打卡旅游景点网站seo优化
  • 网站如何更换图片今天上海重大新闻事件
  • 电子商务网站的定义酒店推广渠道有哪些
  • 做网站用的图片分辨率重庆森林经典台词 凤梨罐头
  • 宁波网络推广系统seo网站关键词优化方式
  • 网站开发需要java吗seo关键词排名优化手机
  • 购物网站开发论文手机百度app免费下载
  • 专业建设规划ppt做整站优化
  • 做网站买域名要买几个后缀最安全自媒体营销方式有哪些
  • 如何做网站霸屏市场调查报告模板及范文
  • 网站建设一般多少钱一年在线推广企业网站的方法
  • 网站下面的站长统计很逗专业代写软文
  • 网页制作与网站建设宝典(第2版)网站权重怎么看
  • 做网站PAAS系统佛山seo代理计费
  • 合肥最新通知今天合肥百度推广排名优化
  • 网站制作怎么做让点击高免费seo工具
  • 上海网站排名优化公司软文怎么写
  • 几个网站一个空间 怎么做邮箱预防电信网络诈骗