gpt4 book ai didi

java - Spring : IdempotentReceiverInterceptor can only be used on MessageHandlers?

转载 作者:行者123 更新时间:2023-11-30 10:42:24 25 4
gpt4 key购买 nike

我正在尝试使用 IdempotentReceiverInterceptor 来防止我的集成流发出它已经生成的消息。但是,IdempotentReceiverInterceptor#invoke 似乎只需要扩展 MessageHandler(在一定程度上)的组件或具有名为“handleMessage”的方法的组件,该方法的第一个参数是消息。我想对消息进行重复数据删除,如果失败,则执行一些额外的处理。

我的问题有两个:

  • 为什么这个建议不应该被允许用于任何原因?成分; Transformer、GenericHandler 等?
  • 因为它只允许在 MessageHandler(s) 或任何具有 handleMessage 方法的东西上运行,所以我尝试使用 AbstractReplyProducingMessageHandler(因为我需要进行额外的处理),但这也不起作用。

我觉得我误解了 IdempotentReceiverInterceptor 的正确使用,我应该能够在几乎任何组件上使用它,但实现似乎与我不一致。我应该如何使用它是错误的还是我使用错误?我知道我可能只是将 MetadataStoreSelector 作为过滤器放入流程中,但我正在尝试按照 SI 的建议进行操作。

感谢任何帮助。这是我期望工作的示例流程。

return IntegrationFlows
.from(messageProducer)
.<String, UUID>transform(s -> UUID.fromString(s))
.claimCheckOut(messageStore)
.handle(
new AbstractReplyProducingMessageHandler() {

@Override
protected Object handleRequestMessage(final Message<?> requestMessage) {
return requestMessage;
}

},
spec -> {
spec.advice(idempotentReceiverInterceptor);
})
// do some more stuff
.transform(transformer)
.handle(loggingHandler)
.get();

这是显示它没有的日志消息

This advice org.springframework.integration.handler.advice.IdempotentReceiverInterceptor can only be used for MessageHandlers; an attempt to advise method 'toString' in 'org.springframework.integration.handler.AbstractReplyProducingMessageHandler$AdvisedRequestHandler' is ignored

编辑:对于那些来这里寻找解决方案的人来说,这几乎就是我最终所做的

return IntegrationFlows
.from(messageProducer)
.<String, UUID>transform(s -> UUID.fromString(s))
.claimCheckOut(messageStore)
.filter(metadataStoreSelector)
// do some more stuff
.transform(transformer)
.handle(loggingHandler)
.get();

最佳答案

根据Reference Manual :

This is an AOP Advice, which is applied to the MessageHandler.handleMessage() method and can filter a request message or mark it as a duplicate, according to its configuration.

源代码说:

boolean isMessageHandler = invocationThis != null && invocationThis instanceof MessageHandler;
boolean isMessageMethod = method.getName().equals("handleMessage")
&& (arguments.length == 1 && arguments[0] instanceof Message);

换句话说只有MessageHandler IdempotentReceiverInterceptor 可能会影响实现.

就是一个。

你担心Transformer , GenericHandler不求返回。框架以特定的 MessageHandler 结束。无论如何包装,例如ServiceActivatingHandler , MessageTransformingHandler等等。所有这些只是因为它就像 Spring Integration 中的契约(Contract):channel -> endpoint -> messageHandler .

那是两个。

IdempotentReceiverInterceptor 的主要前提是将逻辑准确地应用于消费者端点(请参阅其文档),您不能从 spec.advice() 中使用它,因为这正是 handleRequestMessage() ,如你所料。但这不适用于 IdempotentReceiverInterceptor .

是的...不幸的是,没有通过 Java DSL 样式使用它的简单方法。虽然你可以通过消息 channel 区分你的流量并提取@ServiceActivator ( @Transformer ) 连同 @IdempotentReceiver分开@Service ,直到我们找到“原始”Java 配置的解决方案。

欢迎提出 JIRA票就此事。我想ConsumerEndpointFactoryBean应该区分IdempotentReceiverInterceptor来自 advice 中的所有其他人并将其正确应用于 handleMessage最后。因此,您预期的配置将起作用。

感谢您发现这一点!

关于java - Spring : IdempotentReceiverInterceptor can only be used on MessageHandlers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38150360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com