gpt4 book ai didi

java - 如何使用wireTap传递 header ?

转载 作者:行者123 更新时间:2023-12-02 09:21:58 25 4
gpt4 key购买 nike

现在我有以下流程:

flow -> flow.channel(some_channel())
.....
.gateway(anotherFlow, idempotentByHeader(OBJECT_ID_HEADER));
<小时/>
Consumer<GatewayEndpointSpec> idempotentByHeader(String objectIdHeader) {
return endpointSpec -> endpointSpec.advice(idempotentByHeaderInterceptor(objectIdHeader)).errorChannel(errorChannel());
}

default IdempotentReceiverInterceptor idempotentByHeaderInterceptor(String header) {
MessageProcessor<String> headerSelector = message -> headerExpression(header).apply(message);
var interceptor = new IdempotentReceiverInterceptor(new MetadataStoreSelector(headerSelector, idempotencyStore()));
interceptor.setDiscardChannel(idempotentDiscardChannel());
return interceptor;
}

这里的问题是:

anotherFlow 已完成 MessageHandler,它是 void,因此 anotherFlow 不会返回任何内容。

我尝试使用以下方法:

 flow -> flow.channel(some_channel())
.....
.wireTap(anotherFlow, idempotentByHeader(OBJECT_ID_HEADER));

但是编译器因为 idempotByHeader 返回类型而提示,所以我尝试执行以下操作:

default Consumer<WireTapSpec> idempotentByHeader(String objectIdHeader) {
return endpointSpec -> endpointSpec.advice(idempotentByHeaderInterceptor(objectIdHeader)).errorChannel(errorChannel());
}

但是 WireTapSpec 没有通知方法。

如何解决?

附注

我能够通过更改 idempotByHeader 的返回类型来编写

            .wireTap(anotherFlow)
.enrich(idempotentByHeader(OBJECT_ID_HEADER));

但现在应用程序无法启动,因为:

Caused by: java.lang.IllegalStateException: If the errorChannel is set, then the requestChannel must not be null
at org.springframework.util.Assert.state(Assert.java:73)
at org.springframework.integration.transformer.ContentEnricher.doInit(ContentEnricher.java:277)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.onInit(AbstractReplyProducingMessageHandler.java:98)
at org.springframework.integration.context.IntegrationObjectSupport.afterPropertiesSet(IntegrationObjectSupport.java:214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799)
... 42 common frames omitted

最佳答案

好的。您忽略了 WireTap 是一个 channel 拦截器这一事实。它不是像网关那样能够接受幂等接收器拦截器的端点

我不确定您使用 idempotByHeaderInterceptor 的目标是什么,但 header 确实在将发送到 WireTap 的消息中传递。因此,您可以访问订阅此 WireTap 的子流中的 header 。

此外,您最新的 enrich() 示例也让我有点困惑。在使用网关之前,您尝试避免通过 idempotByHeaderInterceptor 向该子流发送相同的消息,但现在您无条件地发送到 wireTap,并且只有在您应用之后,幂等ByHeaderInterceptor

那么,您的 idempotbyHeaderInterceptor 的目标是什么以及您希望在何处应用它?

关于java - 如何使用wireTap传递 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58630616/

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