如何在 Spring 集成中使用相同的消息通道进行发送和接收



我正在创建一个连接到服务器套接字的客户端。服务器直接回复并关闭套接字本身。

以下代码通常有效。意思是:我可以看到输出打印到控制台。

@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);。然后,默认情况下,网关只会将输出发送回消息模板。

最新更新