【问题标题】:Why are ID and TIMESTAMP declared as transient headers in Spring Integration?为什么在 Spring Integration 中将 ID 和 TIMESTAMP 声明为瞬态标头?
【发布时间】:2018-05-26 15:33:28
【问题描述】:

我正在尝试通过 Spring Integration 的 AMQP 入站/出站适配器发送/接收消息,而我面对的是this problem

在找到 Gary 的回答 here 后,我开始调查我的应用是否正确设置了消息 ID。事实上,它是自动处理的here

制作人看起来像this

我故意发送错误消息,在消费者端我看到它的消息转换器失败here

在那之后,消息被重新排队并再次无休止地重新处理。

在调试这个问题时,我注意到发送和接收消息的 ID 总是不同的。

进一步调试此事件后,得知Spring核心消息传递框架提供的标准ID字段标记为transient和transient headers are never getting mapped

有问题吗?

  • 为什么框架不能自动将MessageHeaders.ID映射到AmqpHeaders.MESSAGE_ID
  • 我是否应该将自定义标头字段指定为 ID 并实施 MessageKeyGenerator
  • 顺便说一句,我将如何使用新的 Java DSL 来做到这一点?

非常感谢!

干杯, 拉斯洛


更新:在无限循环中重新处理失败消息的原因是由其他原因引起的。

我已经设法解决了这个问题,方法是将 defaultRequeueRejected(false) 添加到 AMQP 入站适配器的侦听器容器配置中。

@Bean
public IntegrationFlow webhookInboundFlow(
    ConnectionFactory connectionFactory, ObjectMapper objectMapper,
    HeaderValueRouter webhookInboundRouter) {

  return IntegrationFlows
      .from(Amqp.inboundAdapter(connectionFactory, FORGETME_WEBHOOK_QUEUE_NAME)
          .configureContainer(s -> s.defaultRequeueRejected(false))
      )
      .log(INFO)
      .transform(new ObjectToJsonNodeTransformer(objectMapper))
      .route(webhookInboundRouter)
      .get();
}

【问题讨论】:

    标签: spring spring-integration spring-messaging spring-integration-dsl spring-integration-amqp


    【解决方案1】:

    为什么框架不能自动将 MessageHeaders.ID 映射到 AmqpHeaders.MESSAGE_ID?

    这不是一个坏主意,至少作为一种选择。随时打开“改进”JIRA Issue

    Spring AMQP 的AbstractMessageConverter 有一个属性createMessageIds 可以生成消息id 头;这独立于 Spring 集成。

    所以通常情况下,如果您需要消息 id 标头,您可以在出站适配器的 RabbitTemplate 上设置该属性。

    【讨论】:

    • 感谢加里的快速回复!我尝试注册一个自定义 Jackson2JsonMessageConverter 并设置该属性 (createMessageIds)。确实生成了消息 ID。 Altought 破坏了传入消息的反序列化,所以我不得不回滚。因为我也需要时间戳,所以我将使用覆盖的 DefaultAmqpHeaderMapper 并且还会打开一个改进票。
    • 默认消息转换器是SimpleMessageConverter,它只能处理byte[]StringSerializable 有效负载。如果您在生产者端使用 Jackson,那么在消费者端也需要它。您可以在生产者端使用 header-enricher 将时间戳复制到自定义标头。
    • 再次感谢加里!我没有想到使用标题丰富器的可能性。我会走那条路,而不是调整标题映射器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2012-09-09
    • 2010-09-10
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多