将自定义拦截器与 JTA @Transactional (quarkus-narayana-jta) 结合使用

Use custom interceptor with JTA @Transactional (quarkus-narayana-jta)

我想找到一种方法来应用带有 JTA @Transactional 注释的自定义拦截器。

我有一个 @Transactional 的方法,它是一种业务交易。在那种方法中,我想:

  1. 做一些数据库操作
  2. 使用云消息服务发布一些主题。

如果两者中的任何一个失败,则两者都不应该完成(即它们应该被回滚)。

目前我使用 Google Cloud pubsub 作为消息服务,但是这个库似乎不兼容 JMS 或 JTA。因此,我想知道我是否可以为该库实现自定义拦截器(例如,在事务期间排队消息,并在事务成功提交时发布排队的消息)。

这样做有什么好主意吗?

框架是 Quarkus,JTA 实现目前是 Narayana。

没有。 JTA @Transactional 要求您的消息传递平台具有理想情况下支持 XA API 或至少某种形式的事务语义的事务管理器:begin()、commit() 和 rollback() - begin() 可能不是必需的,但绝对是 rollback() 。

如果您的交易中的第二条消息出现问题,您希望确保第一条消息 'disappears' 就好像它从未发生过一样并回滚整个交易。

但是,截至目前,Google pub/sub 没有事务、事务 ID 或 commit() 和 rollback() 的概念。