【问题标题】:Spring Integration TCP doesn't send messagesSpring Integration TCP不发送消息
【发布时间】:2021-01-06 14:11:06
【问题描述】:

我一直在尝试使用 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);
  }
}

为什么它不起作用?

【问题讨论】:

    标签: tcp spring-integration spring-integration-ip


    【解决方案1】:

    您需要通过设置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.
    

    【讨论】:

    • 谢谢加里,但它不起作用。我添加了这些参数,但结果是一样的。我在服务器上收到消息,但它没有发送到 telnet 客户端。
    • 语法不正确;请参阅the documentation。此外,出站适配器需要使用服务器工厂而不是客户端工厂 - 请参阅我的答案的编辑。
    • 有效!我的主要错误在于连接类型,您对我说应该是服务器而不是客户端工厂。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2017-04-28
    • 2018-07-15
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多