我正在创建一个连接到服务器套接字的客户端。服务器直接回复并关闭套接字本身。
以下代码通常有效。意思是:我可以看到输出打印到控制台。
@Service
public class MyService {
@Autowired
@Qualifier("clientChannel")
private MessageChannel clientChannel;
public void send() {
Message<?> msg = MessageBuilder.withPayload("testn").build();
Message<?> rsp = new MessagingTemplate(clientChannel).sendAndReceive(msg);
}
}
@Component
public class MyConfig {
@Bean
public AbstractClientConnectionFactory clientFactory() throws Exception {
TcpConnectionFactoryFactoryBean f = new TcpConnectionFactoryFactoryBean();
f.setType("client");
f.setHost(host);
f.setPort(port);
f.setUsingNio(true);
f.setSingleUse(true);
f.setSoTimeout(timeout);
f.setDeserializer(new ByteArrayRawSerializer());
return fact;
}
@Bean
@ServiceActivator(inputChannel = "clientChannel")
public TcpOutboundGateway outGateway(AbstractClientConnectionFactory factory,
@Qualifier("replayChannel") MessageChannel chan) throws Exception {
TcpOutboundGateway g = new TcpOutboundGateway();
g.setConnectionFactory(factory);
g.setReplyChannel(chan);
return g;
}
@ServiceActivator(inputChannel = "replyChannel")
public void replyHandler(byte[] in) {
System.out.println("replyHandler:"+new String(in));
}
@Bean
public MessageChannel clientChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel replyChannel() {
return new DirectChannel();
}
}
问题:我想删除replyChannel
并使用clientChannel
接收msg.sendAndReceive()
的响应。
@Bean
@ServiceActivator(inputChannel = "clientChannel")
public TcpOutboundGateway outGateway(AbstractClientConnectionFactory factory,
@Qualifier("clientChannel") MessageChannel chan) throws Exception {
TcpOutboundGateway g = new TcpOutboundGateway();
g.setConnectionFactory(factory);
g.setReplyChannel(chan);
return g;
}
但这行不通。处决永远悬在TcpOutboundGateway
里,永远不会回来。但是为什么?
在调试模式下,我可以看到一遍又一遍地打印以下内容:
DEBUG o.s.i.i.t.TcpOutboundGateway: second chance
如果我使用要摆脱的replyChannel
,则不会打印此内容。
回答我自己的问题:完全省略g.setReplyChannel(chan);
。然后,默认情况下,网关只会将输出发送回消息模板。