问题描述
我有一个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
(打开,关闭等)。
编辑
只需将此添加到您的一个bean中...
@EventListener
public void connectionEvent(TcpConnectionEvent event) {
...
}