我有一个服务和两个带有阶段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?
答案 0 :(得分:2)
我认为您的问题可能与Wojtek在此处发布的问题有关: https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2
Spring开发人员对此回答如下:
BEFORE_COMMIT
不是“交易期间的任何时候”。确实是 提交之前。您正在执行的操作是使用事务,就像什么都不需要提交一样。有事。
因此似乎无法链接BEFORE_COMMIT事件,并且也许不支持在该阶段执行另一个事务操作(即使它似乎可行)?
我认为可以更好地记录该领域,因为对于大多数人而言,“提交之前”仅表示“提交某些东西之前”,并且还不清楚调用该事件处理程序时可以执行哪些操作。