【发布时间】:2018-07-04 19:16:06
【问题描述】:
在我的应用程序中,借助 Spring JMS 集成出站网关将消息发送到 Tibco 队列。我们有配置文件来加载连接工厂和服务器启动期间的所有信息。
但是当我们尝试从 Inbound Gateway 检索消息时,调用会进入 GenericMessagingTemplate 类的 doReceive() 并且不会从该方法返回。
下面是我们应用的配置
网关类为:
@MessagingGateway
public Interface MessageGateway
{
@Gateway(requestChannel="InboundChannel")
public Object listent(@Headers Map<String,Object> cusHeader, @Payload Object obj)
}
下面是配置和注册监听类:
public Class Msgconfig {
@Bean
public MessageChannel InboundChannel(){
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel ="InboundChannel")
public AbstractMessageHandler listenMessage() {
// having the logic of DefaultMessageListenerContainer class to load connection factory and setting the message listener
// Have the logic of ChannelPublishingJmsMessageListener class to set the request channel
}
}
我有自定义入站类,它覆盖了实际用于处理消息的 handleMessageInternal() 方法。
我的客户端应用程序或测试调用将调用 MessageGateway.listen,它必须返回不返回任何内容的 JMS 响应。
谁能帮我解决这个问题
【问题讨论】:
-
您的问题中没有足够的信息让任何人帮助您;您需要提供更多详细信息。使用侦听器容器处理请求似乎很奇怪——它用于异步入站消息传递。您是否尝试过启用调试日志记录并观察消息在应用程序中的流动?听起来没有回复;您可以向网关添加回复超时,以避免线程在
receive()中永远等待。 -
谢谢加里。实际上,作为我实现的一部分,我需要使用入站网关收听消息。在我的情况下,消息已经使用出站网关发送。必须为任何想要使用该消息的客户端定制将使用入站网关处理的消息。希望这能解释我的情况,我需要解决这个问题。同样正如你所说,尝试超时,在这种情况下,它采用了 TemporaryReplyChannel 接收方法,它不返回任何响应
-
如果是请求/响应,为什么不使用 JMS 出站网关?您无需为此编写任何代码。
-
是的,Gary,我们也将请求/响应与出站网关一起使用,但我们有一个用例,我们只想接收或使用消息。因此决定通过配置请求通道和目标名称来使用入站网关。也注意到在这种情况下,它调用的是doSendandReceive方法而不是receive方法。所以坚持如何进行
-
您不能为此使用网关;您应该使用入站通道适配器和
@ServiceActivator在消息到达时调用您的代码。
标签: spring-integration spring-jms