gpt4 book ai didi

java - 拆分器返回空数组列表 Spring 集成

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:27 25 4
gpt4 key购买 nike

我们有一个案例,在我们的 spring 集成拆分器逻辑中,它可以返回一个空的 ArrayList 从而不提供要路由的数据。当拆分器返回空的 ArrayList 时,我们应该如何处理这种情况并将其重新路由到不同的 channel 。

更新:

如 Artem 所示,我已经创建了一个自定义建议并成功完成了重新路由,但是仍然存在两个问题,其中第二个描述的是列出的阻止程序问题

我现在上的课如下

public class EmptyListRequestHandlerAdvice extends AbstractRequestHandlerAdvice {

private final MessagingTemplate messagingTemplate = new MessagingTemplate();

public EmptyListRequestHandlerAdvice(MessageChannel emptyListChannel) {
this.messagingTemplate.setDefaultChannel(emptyListChannel);
}

@Override
protected Object doInvoke(ExecutionCallback callback, Object target,
Message<?> message) throws Exception {
Object result = callback.execute();

if (result==null) {
this.messagingTemplate.convertAndSend(new ArrayList<InventoryHotel>());
}

return result;
}

每当拆分器返回一个新的空数组列表时,“callback.execute()”的结果为空。但是,每当拆分器返回的数组列表不为空时,返回的结果都是 org.springframework.integration.util 类型。 FunctionIterator 而不是集合类型。知道是否有可能在这两种情况下都返回一个集合而不是 null 或函数迭代器吗?至少避免获取函数迭代器并获取数组列表。

此外,当一个有效的 channel 名称被设置为构造函数并且一条消息通过该 channel 发送到转换器方法时,转换器方法成功执行但是当它返回一个值时会发生以下错误

org.springframework.messaging.MessagingException: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
at org.springframework.integration.dispatcher.AbstractDispatcher.wrapExceptionIfNecessary(AbstractDispatcher.java:133)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:120)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:255)

关于为什么会发生这种情况以及如何解决它的任何建议。

问候,米琳达

最佳答案

好吧,你可以用 <request-handler-advice-chain> 克服它对于 <splitter>当然还有一些定制 AbstractRequestHandlerAdvice :

public class EmptyListRequestHandlerAdvice extends AbstractRequestHandlerAdvice {

private final MessagingTemplate messagingTemplate = new MessagingTemplate();

public EmptyListRequestHandlerAdvice(MessageChannel emptyListChannel) {
this.messagingTemplate.setDefaultChannel(emptyListChannel);
}

@Override
protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception {
Collection<?> result = (Collection<?>) callback.execute();
if (result.isEmpty) {
this.messagingTemplate.convertAndSend(result);
}
return result;
}

}

更新

有了那个类,你可以像这样使用它:

<splitter>
<request-handler-advice-chain>
<beans:bean class="com.my.proj.int.EmptyListRequestHandlerAdvice">
<beans:constructor-arg ref="emptyListChannel"/>
</beans:bean>
</request-handler-advice-chain>
</splitter>

<channel id="emptyListChannel"/>

更新 2

Any idea on if it is possible to get a collection returned in both cases instead of null or function iterator?

不,这是不可能的。它是分离器的内部逻辑,并且它的原因是 handleRequestMessage产生 Iterator有一个streaming拆分过程增益。目前尚不清楚您拥有 Collection 的原因是什么,因为拆分器总是会产生多条消息,并且迭代逻辑对您是隐藏的。

从您的第一个要求开始,您要求将空列表发送到不同 channel 的解决方案。所以,我不明白为什么迭代器逻辑会对您产生影响。

no output-channel or replyChannel header available

你真的应该这样做:

this.messagingTemplate.send(MessageBuilder.withPayload(new ArrayList<InventoryHotel>())
.copyHeaders(message.getHeaders().build());

有了基于该 requestMessage 的新消息,您将复制其所有 header ,因此 replyChannel标题也在那里。

关于java - 拆分器返回空数组列表 Spring 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466512/

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