spring消息头:DestinationResolver需要解析目标名称

时间:2015-10-30 11:44:55

标签: java spring-integration

我对spring TcpOutboundGatewayMessage配置有疑问。

我需要通过tcp出站网关发送tcp消息,实际上我不需要像Bean那样,我想在每次需要发送消息时创建它。我想严格使用网关,因为我也希望得到一个答案:

//objects clientConnectionFactory and receiveChannel are created above
TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(clientConnectionFactory);
tcpOutboundGateway.setRequiresReply(true);
tcpOutboundGateway.setReplyChannel(receiveChannel);
tcpOutboundGateway.setRequestTimeout(10000);
tcpOutboundGateway.setSendTimeout(10000);

然后我通过网关发送消息:

MessageBuilder<byte[]> mb = MessageBuilder.withPayload(myBytes);
//I need to set this header, otherwise I receive an exception 
//no output-channel or replyChannel header available
mb.setHeader(MessageHeaders.REPLY_CHANNEL, "receiveChannel");
Message<byte[]> message = mb.build();

clientConnectionFactory.start();
tcpOutboundGateway.handleMessage(message);
clientConnectionFactory.stop();

然后我收到以下异常:

Caused by: java.lang.IllegalStateException: DestinationResolver is required to resolve destination names

我觉得这个邮件标题有问题,但我无法理解。你知道吗,我怎么能正确设置它?

1 个答案:

答案 0 :(得分:0)

  

我想在每次需要发送消息时创建它。

这似乎有点过分;对于像这样的应用程序使用Spring Integration位的原因并不是很清楚。

如果您解释用例,可能有人可以提供更好的解决方案。

那说......

//I need to set this header, otherwise I receive an exception 
//no output-channel or replyChannel header available
mb.setHeader(MessageHeaders.REPLY_CHANNEL, "receiveChannel");

将其设置为String是需要解析器的原因;它必须是可用于将其解析为频道的频道或解析器。

您不必在标题中输入,可以使用

QueueChannel channel = new QueueChannel();
tcpOutboundGateway.setOutputChannel(channel();
...
Message<?> = channel.receive(TIMEOUT);

如果没有replyChannel属性,则只需要outputChannel标头。