Я пытаюсь реализовать следующий сценарий с помощью Spring Integration:
Мне нужен клиент для подключения к серверу через TCP IP и ожидания получения сообщений в течение 30 секунд. Мне нужен сервер для отправки от 0 до n сообщений подключенному клиенту. Мне нужен способ запускать и останавливать передачу каналов без потери сообщений. Мне нужно изменить порт, который сервер прослушивает между остановкой и запуском.
Пока это моя конфигурация:
@Configuration
public class TcpConfiguration {
private static Logger LOG = LoggerFactory.getLogger(TcpConfiguration.class);
@Value("${port}")
private Integer port;
@Value("${so-timeout}")
private Integer soTimeout;
@Value("${keep-alive}")
private Boolean keepAlive;
@Value("${send-timeout}")
private Integer sendTimeout;
@Bean
public AbstractServerConnectionFactory getMyConnFactory() {
LOG.debug("getMyConnFactory");
TcpNetServerConnectionFactory factory = new TcpNetServerConnectionFactory(port);
LOG.debug("getMyConnFactory port={}", port);
factory.setSoTimeout(soTimeout);
LOG.debug("getMyConnFactory soTimeout={}", soTimeout);
factory.setSoKeepAlive(true);
LOG.debug("getMyConnFactory keepAlive={}", keepAlive);
return factory;
}
@Bean
public AbstractEndpoint getMyChannelAdapter() {
LOG.debug("getMyChannelAdapter");
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setConnectionFactory(getMyConnFactory());
adapter.setOutputChannel(myChannelIn());
adapter.setSendTimeout(sendTimeout);
LOG.debug("getMyChannelAdapter adapter={}", adapter.getClass().getName());
return adapter;
}
@Bean
public MessageChannel myChannelIn() {
LOG.debug("myChannelIn");
return new DirectChannel();
}
@Bean
@Transformer(inputChannel = "myChannelIn", outputChannel = "myServiceChannel")
public ObjectToStringTransformer myTransformer() {
LOG.debug("myTransformer");
return new ObjectToStringTransformer();
}
@ServiceActivator(inputChannel = "myServiceChannel")
public void service(String in) {
LOG.debug("service received={}", in);
}
@Bean
public MessageChannel myChannelOut() {
LOG.debug("myChannelOut");
return new DirectChannel();
}
@Bean
public IntegrationFlow myOutbound() {
LOG.debug("myOutbound");
return IntegrationFlows.from(myChannelOut())
.handle(mySender())
.get();
}
@Bean
public MessageHandler mySender() {
LOG.debug("mySender");
TcpSendingMessageHandler tcpSendingMessageHandler = new TcpSendingMessageHandler();
tcpSendingMessageHandler.setConnectionFactory(getMyConnFactory());
return tcpSendingMessageHandler;
}
}
Пожалуйста, посоветуйте!
Чтобы сменить сервер port Я бы отключил контекст приложения и перезапустил его после настройки нового порта на удаленном сервере конфигурации. Могу я просто закрыть контекст приложения, не нарушая текущую передачу сообщения? Я не знаю, как обращаться с клиентом только для подключения.