Spring集成TCP

dpl*_*esa 4 java spring tcp spring-integration

我想设置弹簧TCP服务器,客户端应用程序。我需要为收到的邮件服务器侦听的端口,例如,6666和客户端不同的端口上发送消息,例如7777我都跟着文档,但是我坚持的问题,即客户期望接收到响应,但实际上,另一端只会接收来自客户端的消息,并且不会发送任何响应。所以,基本上,我不断收到此错误:

o.s.i.ip.tcp.TcpOutboundGateway          : Tcp Gateway exception

org.springframework.integration.MessageTimeoutException: Timed out waiting for response
Run Code Online (Sandbox Code Playgroud)

我发现这个答案类似的问题,所以我想答案在我的代码整合。这是我的Config类:

@EnableIntegration
@IntegrationComponentScan
@Configuration
public class Config {

private int port = 6666;

@MessagingGateway(defaultRequestChannel = "toTcp")
public interface Gateway {
    String viaTcp(String in);
}

@Bean
@ServiceActivator(inputChannel = "toTcp")
public TcpOutboundGateway tcpOutGate(AbstractClientConnectionFactory connectionFactory) {
    TcpOutboundGateway gate = new TcpOutboundGateway();
    gate.setConnectionFactory(connectionFactory);
    gate.setOutputChannelName("resultToString");
    gate.setRequiresReply(false);

   return gate;
}

@Bean
public TcpInboundGateway tcpInGate(AbstractServerConnectionFactory connectionFactory) {
    TcpInboundGateway inGate = new TcpInboundGateway();
    inGate.setConnectionFactory(connectionFactory);
    inGate.setRequestChannel(fromTcp());

    return inGate;
}

@Bean
public ByteArrayRawSerializer serializer() {
    return new ByteArrayRawSerializer();
}

@Bean
public MessageChannel fromTcp() {
    return new DirectChannel();
}

@MessageEndpoint
public static class Echo {

    @Transformer(inputChannel = "fromTcp", outputChannel = "toEcho")
    public String convert(byte[] bytes) {
        return new String(bytes);
    }

    @ServiceActivator(inputChannel = "toEcho")
    public String upCase(String in) {
        System.out.println("Server received: " + in);
        return in.toUpperCase();
    }

    @Transformer(inputChannel = "resultToString")
    public String convertResult(byte[] bytes) {
        return new String(bytes);
    }

}

@Bean
public AbstractClientConnectionFactory clientCF() {
    TcpNetClientConnectionFactory tcpNet = new TcpNetClientConnectionFactory("localhost", 7777);
    tcpNet.setDeserializer(serializer());
    tcpNet.setSerializer(serializer());
    tcpNet.setSingleUse(true);
    tcpNet.setTaskExecutor(new NullExecutor());
    return tcpNet;
}

@Bean
public AbstractServerConnectionFactory serverCF() {
    TcpNetServerConnectionFactory tcp = new TcpNetServerConnectionFactory(this.port);
    tcp.setSerializer(serializer());
    tcp.setDeserializer(serializer());
    return tcp;
}


public class NullExecutor implements Executor {

    public void execute(Runnable command) {}
}
Run Code Online (Sandbox Code Playgroud)

}

这是我如何使用客户端发送消息:

@Autowired
private Gateway gateway;
gateway.viaTcp("Some message");
Run Code Online (Sandbox Code Playgroud)

我怎样才能安装客户端,因此它不会等待响应?

Gar*_*ell 5

请参阅参考手册

网关用于请求/答复交互,通道适配器用于单向交互。

使用TcpSendingMessageHandlerTcpReceivingChannelAdapter代替入站和出站网关。