本文主要解释了TransactionLevereventListener的工作方式?哪些场景适合?与EventListener不同。
这是业务场景。如果我们有需求,则用户将在成功创建后向用户发送电子邮件。这里有两件事要做:
对于这种需求,我们可能无需考虑以下实施。
为用户创建存储库
以上实现是最容易实现的,但是此实现是有问题的。LET对此功能创建用户的核心的思考,发送电子邮件是副作用(发送电子邮件不会影响用户的创建)。如果将这两个操作放在一次交易中?这是正常的。但是以下两个场景是不可接受的:
尽管这些情况的概率很小,但它是我们自己所需的程序猿的无能。我们必须对我们写的业务负责。
好吧,我们对上述实施进行了重建,解开了创建用户的业务代码并发送电子邮件,并将使用Spring Application事件的使用解开。
修改后的服务就是这样
从上面的代码中,我们知道Uservice依赖两个豆类:
请注意,此类只是一个简单的POJO对象。自春季4.2以来,我们可以在不继承ApplicationEvent的情况下发布任何对象。弹簧将它们包装到PayloadApplicationEvent中。
我们需要一个活动的听众来处理上述活动。
通过上面的重构,我们将删除用户的业务代码并发送电子邮件,但是是否解决了上述问题?答案是否定的,尽管我们以EventListener的方式决定了业务代码,但是底部仍在同一交易中执行(有人可能想询问您是否将@ASYNC添加到异步执行的侦听器方法中?当然,它不能在成功创建用户后必须发送电子邮件,并且有这里的业务依赖),这意味着以上两种情况仍会发生。因此,问题是,是否有解决方案?
当然,您可以用@transactionaleventlistener替换@EventListener。结果是在创建用户并提交交易后发送电子邮件通知。
TransActionLealeventListener是EventListener的增强。可以触发注释方法以在交易的不同阶段执行。如果事件未在主动交易中发布,除非明确设置fallbackexection()徽标,否则该事件将被丢弃;事件将被丢弃;如果交易正在运行,则该事件会根据其交易程序处理。
注意:您可以通过注释 @order来对所有侦听器进行排序,以确保他们按照自己的设置顺序执行它们。
让我们首先看看什么是事务相:
这种转变之后就是这样
好吧,现在我们可以确保我们的业务正常运行,并且通过发送电子邮件而不会影响创建用户。LET仔细研究TransActionLealeventListener的表现。
下面给出了弹簧的处理源代码,每个人都会一目了然地看到:
说明上述代码:
现在存储了TransActionsynchronizing,时间触发何时会执行?
以After_commit为例(类似于其他阶段),请参阅此代码:
抽象PlatFormTransactionManager类
然后查看TriggrafterCommit的实现
这里
看到它,首先获取所有Transactionsynchronization,然后调用其后电脑方法来真正开始处理事件。
现在我们总结一下。如果您遇到这样的业务,则需要在提交A交易后执行B操作,然后TrassActionLealeventListener是一个不错的选择。在这里需要注意的一个点是:当B操作具有数据更改并耐用,并希望能够耐用,并希望在操作的after_commit阶段执行,然后您需要将B事务声明为propagation_requires_new.new.this,这是因为在操作交易后,可以激活交易资源。如果B操作使用默认的propagation_required,它将直接添加到操作A的操作中,但是此时交易A将不会再次提交。更改。解决方案是将操作B的操作清楚地设置为Quards__requires_new。