Я использовал
TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory(host, port);
для TcpOutboundGateway, обычно TcpOutboundGateway работает с запросом / ответом, но в моем случае я расширяю TcpOutboundGateway для получения произвольных сообщений с MessageChannel. Вот почему я подумал, что мне следует использовать
cf.setLeaveOpen(true)
, чтобы соединение оставалось открытым.
Хотя я начал использовать эту опцию, спустя долгое время, когда я снова позвонил на tcp-сервер, я получил исключение например,
org.springframework.integration.MessageTimeoutException: Истекло время ожидания ответа
, но я не понял, почему я беру эту ошибку, потому что я установил «истина» на держать соединение открытым в моей фабрике соединений.
THEN
Я сделал несколько запросов в Google, и предполагалось использовать CachingClientConnectionFactory, я понимаю, что по умолчанию это single-use = true и не должно изменяться это false, но тогда я предполагаю, что соединение будет открываться и закрываться в каждой моей транзакции ответа на запрос, так что это препятствие для получения произвольных данных с сервера без какого-либо запроса от клиента?
OR
Как я должен поддерживать открытое соединение между клиентом и сервером? следует ли использовать
cf.setSoKeepAlive (true)?
, чтобы соединение оставалось открытым?
cf.setSoKeepAlive (true) и cf.setLeaveOpen (true)
одинаковы друг с другом?
EDIT
Также, когда я использую cf.setSoKeepAlive (true), через 1 час у меня тоже возникает такое же исключение.
Полный код:
private MessageChannel createNewSubflow(Message<?> message) {
String host = (String) message.getHeaders().get("host");
Integer port = (Integer) message.getHeaders().get("port");
boolean hasThisConnectionIrregularChannel = message.getHeaders().containsKey("irregularMessageChannelName");
Assert.state(host != null && port != null, "host and/or port header missing");
String flowRegisterKey;
if (hasThisConnectionIrregularChannel) {
flowRegisterKey = host + port + ".extended";
} else {
flowRegisterKey = host + port;
}
TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory(host, port);
CachingClientConnectionFactory ccf = new CachingClientConnectionFactory(cf, 20);
ccf.setSoKeepAlive(true);
ByteArrayCrLfSerializer byteArrayCrLfSerializer = new ByteArrayCrLfSerializer();
byteArrayCrLfSerializer.setMaxMessageSize(1048576);
ccf.setSerializer(byteArrayCrLfSerializer);
ccf.setDeserializer(byteArrayCrLfSerializer);
TcpOutboundGateway tcpOutboundGateway;
if (hasThisConnectionIrregularChannel) {
String unsolicitedMessageChannelName = (String) message.getHeaders().get("irregularMessageChannelName");
DirectChannel directChannel = getBeanFactory().getBean(unsolicitedMessageChannelName, DirectChannel.class);
tcpOutboundGateway = new ExtendedTcpOutboundGateway(directChannel);
} else {
tcpOutboundGateway = new TcpOutboundGateway();
}
tcpOutboundGateway.setRemoteTimeout(20000);
tcpOutboundGateway.setConnectionFactory(ccf);
IntegrationFlow flow = f -> f.handle(tcpOutboundGateway);
IntegrationFlowContext.IntegrationFlowRegistration flowRegistration =
this.flowContext.registration(flow)
.addBean(ccf)
.id(flowRegisterKey + ".flow")
.register();
MessageChannel inputChannel = flowRegistration.getInputChannel();
this.subFlows.put(flowRegisterKey, inputChannel);
return inputChannel;
}