我对spring TcpOutboundGateway
和Message
配置有疑问。
我需要通过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
我觉得这个邮件标题有问题,但我无法理解。你知道吗,我怎么能正确设置它?
答案 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
标头。