Ich habe einen TCP-Client, der mit Spring Integration TCP gebaut wurde und der Server unterstützt eine Keep Alive-Nachricht (Ping/Pong-Stil). Die Verbindungen wurden mit einer CachingClientConnectionFactory
konfiguriert und ich möchte diese Serverfunktion nutzen. Hier ist meine Bean-Konfiguration:Wie wird eine Keep Alive-Verbindung auf einer TCP-Verbindung mithilfe der Federintegration implementiert?
private static final int SERIALIZER_HEADER_SIZE = 2;
/**
* Serializer used by connection factory to send and receive messages
*/
@Bean
public ByteArrayLengthHeaderSerializer byteArrayLengthHeaderSerializer() {
return new ByteArrayLengthHeaderSerializer(SERIALIZER_HEADER_SIZE);
}
@Bean
public AbstractClientConnectionFactory tcpClientConnectionFactory() {
TcpNetClientConnectionFactory connFactory =
new TcpNetClientConnectionFactory(props.getUrl(), props.getPort());
connFactory.setSerializer(byteArrayLengthHeaderSerializer());
connFactory.setDeserializer(byteArrayLengthHeaderSerializer());
connFactory.setSoTimeout(props.getSoTimeout());
if (props.isUseSSL()) {
connFactory.setTcpSocketFactorySupport(new DefaultTcpNetSSLSocketFactorySupport(() -> {
return SSLContext.getDefault();
}));
}
return connFactory;
}
/**
* Connection factory used to create TCP client socket connections
*/
@Bean
public AbstractClientConnectionFactory tcpCachedClientConnectionFactory() {
CachingClientConnectionFactory cachingConnFactory =
new CachingClientConnectionFactory(tcpClientConnectionFactory(), props.getMaxPoolSize());
cachingConnFactory.setConnectionWaitTimeout(props.getMaxPoolWait());
return cachingConnFactory;
}
die Lösung hier Configure keep alive to keep connection alive all the time geschrieben Verwendung von I die Verbindung geöffnet halten kann, aber ich wollte auch Einfluss auf diesem Server nehmen Alive-Nachrichten halten und diese Nachrichten von Zeit zu Zeit zu überprüfen, zu senden, wenn die Verbindung ist noch am Leben. Dies kann die Leistung auf der Clientseite verbessern, da keine neue Verbindung neu hergestellt/erstellt werden muss, wenn der Socket geschlossen wurde.
Basierend darauf hat jemand einen Vorschlag, wie man dies mithilfe der Federintegration implementieren kann?
Es ist nicht klar, was Sie genau meinen. Sie können 'soKeepAlive' auf 'true' setzen, damit das Betriebssystem die Sockets durch Senden von Pings offen hält. Wenn Sie 'soTimeout 'nicht setzen, bleibt der Socket unbegrenzt offen. –
Der Server erwartet etwas wie KEEP_ALIVE_REQUEST und sendet ein KEEP_ALIVE_RESPONSE zurück. Bei meiner Frage ging es darum, die Verbindung offen zu halten, aber basierend auf Ihrer Antwort können 'soKeepAlive' und' soTimeout' zusammen den Trick machen. –
Update: @GaryRussell Der Server schließt den Socket nach 30 Sekunden Inaktivität. Hat die Frühjahrsintegration auf dieser Grundlage ein Feature, mit dem ich diese spezifischen Keep Alive-Nachrichten (im Hintergrund) senden könnte, damit der Client-Socket wiederverwendet werden könnte? –