当前位置: 首页 > 知识库问答 >
问题:

如何在使用反应消息传递时传播JTA状态?

韦衡
2023-03-14
@Inject
@Channel("test")
Emitter<String> emitter;

@POST
@Transactional
public Response test() {
    emitter.send("test");
}
@ApplicationScoped
@Connector("test")
public class TestConnector implements OutgoingConnectorFactory {

    @Inject
    TransactionManager tm;

    @Override
    public SubscriberBuilder<? extends Message<?>, Void> getSubscriberBuilder(Config config) {
        return ReactiveStreams.<Message<?>>builder()
            .flatMapCompletionStage(message -> {
                tm.getTransaction(); // = null
                return message.ack();
            })
            .ignore();
    }
}

顺便说一下,在使用@incoming/@outgoing而不是发射器时,我遇到了同样的问题。我已经决定给你们举这个例子,因为它很容易理解和再现。

共有1个答案

罗伟志
2023-03-14

此刻,您需要在消息元数据中传递当前事务。因此,它将传播到不同的下游组件(以及连接器)。

注意,Transaction倾向于附加到请求范围,这意味着在连接器中,使用它可能已经太晚了。因此,确保您的endpoint是异步的,并且仅在发出的消息被确认时才返回。

上下文传播在这种情况下没有帮助,因为底层流是在启动时构建的(在Quarkus中是在构建时),所以没有捕获上下文。

 类似资料:
  • 我有两个通过Kafka交互的微服务,一个发布消息,另一个消费消息。发布者和消费者都运行在Quarkus(1.12.0.final)上,并使用反应消息和兵变。 消费者: 依赖关系:除其他外,包括人工制品 Quarkus-斯莫尔-反应消息-Kafka Quarkus-雷斯特塞西-兵变 Quarkus-Smallrye-Opentracing Quarkus-兵变 opentracing-kafka-c

  • 由于内容脚本在网页而不是扩展程序的上下文中运行,因此它们通常需要某种与扩展程序其余部分进行通信的方式。例如,RSS 阅读器扩展程序可以使用内容脚本来检测页面上 RSS 摘要的存在,然后通知后台页面以显示该页面的操作图标。 扩展及其内容脚本之间的通信使用消息传递来实现。任何一方都可以监听从另一端发送的消息,并在同一通道上进行响应。消息可以包含任何有效的 JSON 对象(空,布尔值,数字,字符串,数组

  • ms tcp nodelay 描述: 在信差的 TCP 会话上禁用 nagle 算法。 类型: Boolean 是否必需: No 默认值: true ms initial backoff 描述: 出错时重连的初始等待时间。 类型: Double 是否必需: No 默认值: .2 ms max backoff 描述: 出错重连时等待的最大时间。 类型: Double 是否必需: No 默认值: 15

  • 消息传递 目录 一次简单的请求 h3Name 长时间保持连接 h3Name 扩展之间的消息传递 h3Name 安全策略 h3Name 范例 h3Name API reference Properties propertyName Methods methodName Events eventName Types id For information on how to use experiment

  • 问题内容: 我有两个视图控制器,一个和两个。我从VC一到VC二。在VC 2上,我选择一些存储在数组中的数据。当我按下导航栏上的“返回”按钮时,我想将该阵列发送回VC One。 使用Swift和Storyboards做到这一点的最佳方法是什么? 谢谢! 问题答案: 如果要使用“完成”和“取消”按钮(有点像选择器)来显示模式视图,则在展开segue方法期间获取值可能是最简单的。 假定您要使用导航控制器

  • 我试图将Firebase云消息集成到我的应用程序中,以便向用户发送通知。当试图启动应用程序,我得到以下错误: 这在这里发生: 在FIRAuthm. 这是我的大多数应用委托的样子: 发生了什么,我如何修复这个错误? 我试着按照这里的指示去做。。。