请求的第二个会话上的Spring Integration TCP客户端连接问题

问题描述

我有一个Spring Integration + spring批处理需求,我必须与远程服务器建立TCP客户端连接,并发送包含从spring批处理中处理的数千条记录的请求。我正在使用MessageBuilder作为有效负载和消息通道来发送数据。我们发送所有记录,然后发送对响应消息有效负载的请求,以开始从服务器接收响应。服务器使用响应数据进行响应,该响应数据使用转换器进行处理,并添加到queuechannel中以供以后读取。

@Configuration
@EnableIntegration
public class GatewayConfig {

    private static final Logger logger = LoggerFactory.getLogger(GatewayConfig.class);
    @Autowired
    private GatewayProperties properties;
    
    /**Abstract class for client connection factories.
     * 
     * @return AbstractClientConnectionFactory
     * @throws Exception 
     */
    
    @Bean
    public AbstractClientConnectionFactory clientCF() {
        AbstractClientConnectionFactory factory = new TcpNetClientConnectionFactory( "138.25.189.110",5030);
        factory.setSoKeepAlive(true);
        factory.setDeserializer(new ByteArraySingleTerminatorSerializer((byte) 13));
        return factory;
    }
    
    
    
    /**
     * Receives messages over TCP.
     * Specify the MessageChannel to which produced Messages should be sent.
     * @param connectionFactory
     * @return TcpReceivingChannelAdapter
     */
    @Bean
    public TcpReceivingChannelAdapter inboundAdapterClient(@Qualifier("clientCF")AbstractClientConnectionFactory connectionFactory) {
        TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
    //  adapter.setOutputChannelName(GatewayConstants.AGGREGATOR_PRE_INPUT_CHANNEL);
        adapter.setOutputChannelName(GatewayConstants.PRETRANSFORM_CHANNEL);
        adapter.setErrorChannelName(GatewayConstants.TCP_ERROR);
        adapter.setClientMode(true);
        adapter.setConnectionFactory(connectionFactory);
        return adapter;
    }

    
    @Bean(GatewayConstants.RECEIVE_CHANNEL_NAME)
    public QueueChannel receivingChannel() {
        
        return new QueueChannel();
    }
    
    @Bean
    @Transformer(inputChannel = GatewayConstants.PRETRANSFORM_CHANNEL,outputChannel = GatewayConstants.RECEIVE_CHANNEL_NAME)
    public Pretransform pretransformMet() {
        return new Pretransform();
    }
    
    
    /**
     * Sends messages over TCP
     * @param connectionFactory
     * @return
     */
    @Bean
    @ServiceActivator(inputChannel = GatewayConstants.SEND_TO_VENDOR_CHANNEL_NAME)
    public TcpSendingMessageHandler messageHandlerClient(@Qualifier("clientCF")AbstractClientConnectionFactory connectionFactory) {
        TcpSendingMessageHandler sendingHandler = new TcpSendingMessageHandler();
        sendingHandler.setConnectionFactory(connectionFactory);
        sendingHandler.setClientMode(true);
        
        return sendingHandler;
    }
    
    /**
     * 
     * @return
     */
    @Bean(GatewayConstants.TCP_ERROR)
    public MessageChannel tcpErrrorChannel() {
        return new DirectChannel();
    }
    
    @Bean(GatewayConstants.PRETRANSFORM_CHANNEL)
    public MessageChannel preReceiveChannel() {
        return new DirectChannel();
    }
    
    @Bean(GatewayConstants.BATCH_SEND_CHANNEL_NAME)
    public MessageChannel sendchannel() {
        return new DirectChannel();
    }
    
    /**
     * 
     * @return
     */
    @Bean(GatewayConstants.SEND_TO_VENDOR_CHANNEL_NAME)
    public MessageChannel sendToVendorChannel() {
        return new DirectChannel();
    }

批处理作业每天午夜运行。在启动/部署应用程序之后,将发送请求并成功接收到响应,但是第二天服务器未接收到任何数据。发送请求时,没有tcp连接异常,但服务器端未收到任何数据。

我什至将singleuse设置为true,但是由于运行时异常,客户端无法将sing use设置为true。在发送请求之前和接收响应之后,无论何时建立连接并建立tcp连接状态,有什么方法可以记录? 感谢您的帮助,并在此先感谢您。

解决方法

您可以添加一个ApplicationListener bean(或@EventListener方法)以接收各种TcpConnectionEvent(打开,关闭等)。

请参见the documentation

编辑

只需将此添加到您的一个bean中...

@EventListener
public void connectionEvent(TcpConnectionEvent event) {
    ...
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...