2016-06-13 7 views
1

を閉じて、私は次のようにTCP channel.The構成を介してリモートクライアントからの要求(パケット)を受信し、私のアプリで春の統合TcpInboundGatewayを使用しています:私の1として春の統合TcpInboundGateway:TcpNetServerConnectionFactory:サーバソケットが例外

@Bean 
    ByteArrayCrLfSerializer ser() 
    { 
     return new ByteArrayCrLfSerializer(); 
    } 

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

     connectionFactory.setSingleUse(true); 
     connectionFactory.setSerializer(ser()); 
     connectionFactory.setDeserializer(ser()); 


     return connectionFactory; 
    } 

    @Bean 
    TcpInboundGateway tcpGate(){ 

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

    @Bean 
    public MessageChannel requestChannel(){ 

     return new DirectChannel(); 
    } 

をマルチスレッドをサポートする知識しかし、多くのリクエストが同時に発生すると、アプリケーションはエラーメッセージに続いて動作を停止します。

2016-06-13 06:12:52.330 INFO 1431 --- [pool-2-thread-1] .s.i.i.t.c.TcpNetServerConnectionFactory : Server Socket closed 

多数の要求を同時に処理するマルチスレッドをサポートするための設定がありません。

+1

このエラーメッセージは、接続ファクトリまたはインバウンドゲートウェイで 'stop()'を呼び出したことを意味します。 AFAIKは、サーバーソケットがその状態になる唯一の方法です。マルチスレッドを処理するために特別なことは何もありません。 –

+0

私はstop()を呼び出すのではなく、socket.The上記のエラーメッセージの数が多いときはいつでも新しいリクエストを受け入れません。 – MasterCode

+0

ソケットを高速で開く場合は、バックログを増やすことをお勧めします。サーバーソケットを閉じる必要はありません。接続が拒否されただけです。 –

答えて

1

StackTraceが十分ではありません...その理由は、下流プロセスがすべての着信メッセージに追いつくことができない場合のgateway.setRequestTimeout(TIMEOUT);です。無限にすることを検討してください。

サービスを見て、マルチスレッドが正しく機能しない理由を理解してみてください。

関連する問題