Camel幂等消费者检测到重复消息时如何返回不同的http响应码?

问题描述 投票:0回答:1

我想使用camel幂等消费者来确保消息只被消费一次。如果消息重复,我想返回状态 409,否则返回 204。

我的问题是,虽然代码在运行

direct:hello
路线时工作正常,但仅运行一次,这表明
MemoryIdempotentRepository
正在工作。但它没有给我 409 响应代码。

首次发送消息时,它会正确记录

Exchange Properties: ${exchange.properties}
Hello World!"
。当同一条消息第二次到达时,它甚至不会记录
Exchange Properties: ${exchange.properties}
Duplicate message detected!
。它也不抛出任何异常。

当消息已经被消费时,如何让它返回不同的http状态代码?

  @Override
  public void configure() {

    onException(Exception.class)
      .log("Exception occurred: ${exception.message}")
      .handled(true);

    from("platform-http:/api/hello?httpMethodRestrict=PUT")
      .idempotentConsumer(header("MessageId"))
        .idempotentRepository(new MemoryIdempotentRepository())
      .log("Exchange Properties: ${exchange.properties}")
      .choice()
        .when(exchangeProperty(Exchange.DUPLICATE_MESSAGE).isEqualTo(Boolean.TRUE))
          .log("Duplicate message detected!")
          .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(HttpServletResponse.SC_CONFLICT))
        .otherwise()
          .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(HttpServletResponse.SC_NO_CONTENT))
          .to("direct:hello")
      .end();

    from("direct:hello")
      .log("Hello World!");
  }
java spring-boot apache-camel
1个回答
0
投票

查看EIP上的文档,可以看到有

skipDuplicate
选项。您需要将其设置为
false
,让Camel仍然处理重复的消息。

© www.soinside.com 2019 - 2024. All rights reserved.