Spring Integration TCP 不发送消息

问题描述

我一直在尝试使用 Spring Integration TCP 创建消费者和生产者。我在侦听部分取得了一些成功(我正常收到了 telnet 发送的消息),但是当我尝试向终端客户端发送相同的消息时,没有任何反应。

这些是我的课程:

@EnableIntegration
@IntegrationComponentScan
@Configuration
public class TcpIntegration {

  @Value("${tcp.port}")
  private Integer port;

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

  @Bean
  @ServiceActivator(inputChannel="toTcp")
  public TcpsendingMessageHandler tcpOutGate(AbstractClientConnectionFactory connectionFactory) {
    TcpsendingMessageHandler gate = new TcpsendingMessageHandler();
    gate.setConnectionFactory(connectionFactory);
    return gate;
  }

  @Bean
  public TcpReceivingChannelAdapter tcpInGate(AbstractServerConnectionFactory connectionFactory)  {
    TcpReceivingChannelAdapter inGate = new TcpReceivingChannelAdapter();
    inGate.setConnectionFactory(connectionFactory);
    inGate.setoutputChannel(fromTcp());
    return inGate;
  }

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

  @Bean
  public AbstractClientConnectionFactory clientCF() {
    return new TcpNetClientConnectionFactory("localhost",this.port);
  }

  @Bean
  public AbstractServerConnectionFactory serverCF() {
    return new TcpNetServerConnectionFactory(this.port);
  }
}

TcpListener

@MessageEndpoint
@AllArgsConstructor
public class TcpListener {

  private final Gateway gateway;

  @ServiceActivator(inputChannel = "fromTcp")
  public void convert(String payload) {
    System.out.println(payload);
    gateway.viaTcp(payload);
  }
}

为什么它不起作用?

解决方法

您需要通过设置 ip_connnetionId 标头来告诉适配器在哪个套接字上发送消息。

  @ServiceActivator(inputChannel = "fromTcp")
  public void convert(String payload,@Header(IpHeaders.CONNECTION_ID String cid) {
    System.out.println(payload);
    gateway.viaTcp(payload,cid);
  }
  @MessagingGateway(defaultRequestChannel="toTcp")
  public interface Gateway {
    @Gateway(@GatewayHeader(IPHeaders.CONNECTION_ID,"#args[1]"))
    String viaTcp(String in,String cid);
  }

编辑

我的语法有点不对;这是一个工作示例...

@SpringBootApplication
public class So65597331Application {

    public static void main(String[] args) {
        SpringApplication.run(So65597331Application.class,args);
    }

    @MessagingGateway(defaultRequestChannel = "toTcp")
    public interface Gate {
        @Gateway(payloadExpression = "#args[0]",headers = @GatewayHeader(name = IpHeaders.CONNECTION_ID,expression = "#args[1]"))
        String viaTcp(String in,String cid);
    }

    @Bean
    @ServiceActivator(inputChannel = "toTcp")
    public TcpSendingMessageHandler tcpOutGate(AbstractServerConnectionFactory connectionFactory) {
        TcpSendingMessageHandler gate = new TcpSendingMessageHandler();
        gate.setConnectionFactory(connectionFactory);
        return gate;
    }

    @Autowired
    private Gate gateway;

    @ServiceActivator(inputChannel = "fromTcp")
    public void convert(String payload,@Header(IpHeaders.CONNECTION_ID) String cid) {
        System.out.println(payload);
        gateway.viaTcp(payload,cid);
    }

    @Bean
    public TcpReceivingChannelAdapter tcpInGate(AbstractServerConnectionFactory connectionFactory) {
        TcpReceivingChannelAdapter inGate = new TcpReceivingChannelAdapter();
        inGate.setConnectionFactory(connectionFactory);
        inGate.setOutputChannel(fromTcp());
        return inGate;
    }

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

    @Bean
    public AbstractServerConnectionFactory serverCF() {
        return new TcpNetServerConnectionFactory(1234);
    }

}
$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
foo
foo
Connection closed by foreign host.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...