如果事件是从另一个侦听器发布的,则TransactionalEventListener将被忽略

时间:2018-06-01 18:51:56

标签: java spring spring-data-jpa spring-transactions

我有一个服务和两个带有阶段BEFORE_COMMIT的TransactionalEventListener,一个侦听EventA,另一个侦听EventB。服务发布EventA - >调用EventAListener并发布另一个事件 - EventB。不调用EventBListener并忽略该事件。 示例代码:

tweepy.error.TweepError: Failed to send request: HTTPSConnectionPool(host='api.twitter.com', port=443): Max retries exceeded with url: /1.1/statuses/home_timeline.json (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)'),))

执行服务方法后,数据库中有2行 - "实体"和" entityA"。
替代EventAListener版本的工作方式相同。
将EventBListener fallbackExecution设置为' true'不做任何更改 - 不调用EventBListener。
将EventBListener阶段更改为AFTER_COMMIT有效 - 处理EventB,但在另一个事务中处理。

为什么不处理EventB?

1 个答案:

答案 0 :(得分:2)

我认为您的问题可能与Wojtek在此处发布的问题有关: https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

Spring开发人员对此回答如下:

  

BEFORE_COMMIT不是“交易期间的任何时候”。确实是 提交之前。您正在执行的操作是使用事务,就像什么都不需要提交一样。有事。

因此似乎无法链接BEFORE_COMMIT事件,并且也许不支持在该阶段执行另一个事务操作(即使它似乎可行)?

我认为可以更好地记录该领域,因为对于大多数人而言,“提交之前”仅表示“提交某些东西之前”,并且还不清楚调用该事件处理程序时可以执行哪些操作。