2016-05-03 14 views
1

TcpInBoundGateWayを使用してリモートクライアントからメッセージを受信して​​います。ただし、クライアントは定期的にIPを変更しています。クライアントの1人がIP 'X'そのクライアントのIPが「X」から「Y」に変更され、同時にそのIPとの新しい接続が確立され、同時にIP「X」との古い接続がアクティブである場合、ゲートウェイはそのIPとの接続を有する。だから私はこのゲートウェイに通信する約10-15クライアントがありますが、もし私がnetstat -allを行う場合、それはそのポートと確立された2000から2500の接続を提供します。TcpInboundGateway:リモートクライアントとの既存の接続を閉じる方法

古い接続を終了できる方法はありますか? netstatからの接続の

@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(); 
    } 
} 

リストは、これらのクライアントがひどく振る舞っている

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 

答えて

2

commnd。

connectionFactory.setSoTimeout(...)とすることができ、そのミリ秒でデータが受信されない場合は接続が切断されます。

また、は、オペレーティングシステム(またはより適切にはTCPスタック)にpingを送信して、これらの接続を検出して終了させます。キープアライブ間の実際の時間はオペレーティングシステムレベルで設定されますが、ソケットで有効にする必要があります。これはこのオプションの機能です。

javadocs for Socketを参照してください。

詳細については、GoogleのSO_TIMEOUTとSO_KEEPALIVEをご覧ください。

EDIT

明示的に接続を閉じるには、接続ファクトリメソッドを持っている...

/** 
* 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) { ... } 

...あなたは、クライアントからのメッセージから特定の接続IDを取得することができますすることができます(ヘッダip_connectionId)、またはTcpConnectionOpenEventを介して接続が開かれているとき。現在開かれている接続IDのリストを取得することもできます。

/** 
* 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 ...あなたの修正内容を確認してください。 – MasterCode

+0

特定の接続を終了するカスタム方法はありますか? – MasterCode

+0

接続ファクトリにはメソッドがあります(私の答えに編集を参照)。 –

関連する問題