我想使用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!");
}
查看EIP上的文档,可以看到有
skipDuplicate
选项。您需要将其设置为false
,让Camel仍然处理重复的消息。