2016-05-03 1 views
1

Ich verwende TcpInBoundGateWay, um Nachrichten von Remote-Clients zu empfangen. Problem ist jedoch, dass Clients ihre IPs in regelmäßigen Abständen ändern.So wenn einer der Clients über IP 'X' kommuniziert, dann hat das Gateway eine Verbindung mit dieser IP, wenn die IP dieses Clients von "X" zu "Y" geändert wird, dann wird eine neue Verbindung mit dieser IP zur selben Zeit hergestellt, zu der die alte Verbindung mit IP 'X' aktiv ist. So, jetzt habe ich etwa 10-15 Client mit diesem Gateway kommunizieren, aber wenn ich tun netstat -all gibt es als 2000-2500 Verbindung mit diesem Port eingerichtet.TcpInboundGateway: So schließen Sie eine bestehende Verbindung mit dem Remote-Client

Gibt es eine Möglichkeit, so dass ich diese alte Verbindung beenden kann?

@SpringBootApplication 
@IntegrationComponentScan 
public class SpringIntegrationApplication extends SpringBootServletInitializer{ 

    DataOperations dataOperations =new DataOperations(); 

    @Value("${TCP_PORT}") 
    private Integer TCP_PORT; 

    public static void main(String[] args) throws IOException { 
     ConfigurableApplicationContext ctx = SpringApplication.run(SpringIntegrationApplication.class, args);  
     System.in.read(); 
     ctx.close(); 
    } 


    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(SpringIntegrationApplication.class); 
    } 

    private static Class<SpringIntegrationApplication> applicationClass = SpringIntegrationApplication.class; 


    @Bean 
    TcpNetServerConnectionFactory cf(){ 
     TcpNetServerConnectionFactory connectionFactory=new TcpNetServerConnectionFactory(8765); 

     connectionFactory.setSingleUse(true); 

     return new TcpNetServerConnectionFactory(TCP_PORT); 
    } 

    @Bean 
    TcpInboundGateway tcpGate(){ 

     TcpInboundGateway gateway=new TcpInboundGateway(); 
     gateway.setConnectionFactory(cf()); 
     gateway.setRequestChannel(requestChannel()); 
     gateway.setRequestTimeout(20000); 
     return gateway; 
    } 

    @Bean 
    public MessageChannel requestChannel(){ 

     return new DirectChannel(); 
    } 
} 

Liste der Verbindung von netstat commnd

tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 106.221.201.180:15076 ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 27.58.41.100:41965  ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 106.221.136.178:39192 ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 106.221.135.124:2271 ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 27.58.57.252:31644  ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 27.58.33.219:32134  ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 106.221.218.22:17275 ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 27.58.172.42:30130  ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 27.58.21.127:16998  ESTABLISHED 
tcp6  0  0 ip-XXX-XX-X-XXX.u:10189 27.58.60.160:51374  ESTABLISHED 

Antwort

2

Diese Kunden schlecht benommen werden.

Sie können connectionFactory.setSoTimeout(...) und die Verbindung wird geschlossen, wenn in dieser Anzahl von Millisekunden keine Daten empfangen werden.

Alternativ dazu wird connectionFactory.setSoKeepAlive(true) das Betriebssystem (oder genauer gesagt den TCP-Stack) dazu veranlassen, Pings zu senden, um diese toten Verbindungen zu erkennen und sie zu schließen. Die tatsächliche Zeit zwischen den Keepalives wird auf der Betriebssystemebene konfiguriert, sie muss jedoch auf dem Socket aktiviert werden, was diese Option tut.

Siehe die javadocs for Socket.

Google SO_TIMEOUT und SO_KEEPALIVE für weitere Informationen.

EDIT

explizit eine Verbindung zu schließen, hat die Verbindung Fabrik ein Verfahren ...

/** 
* Close a connection with the specified connection id. 
* @param connectionId the connection id. 
* @return true if the connection was closed. 
*/ 
public boolean closeConnection(String connectionId) { ... } 

... können Sie von der Client eine bestimmte Verbindung ID aus einer Nachricht erhalten (in der Kopfzeile ip_connectionId) oder wenn die Verbindung über die TcpConnectionOpenEvent geöffnet wird. Sie können auch eine Liste der derzeit geöffneten Verbindungs-IDs abrufen:

/** 
* Returns a list of (currently) open {@link TcpConnection} connection ids; allows, 
* for example, broadcast operations to all open connections. 
* @return the list of connection ids. 
*/ 
public List<String> getOpenConnectionIds() { ... } 
+0

ok ... lassen Sie mich mit Ihrem Fix überprüfen. – MasterCode

+0

gibt es eine benutzerdefinierte Möglichkeit, bestimmte Verbindung zu beenden – MasterCode

+0

Die Verbindungsfactory hat eine Methode (siehe die Bearbeitung meiner Antwort). –

Verwandte Themen