2016-08-26 7 views
2

TCP接続ファクトリの例外を処理したいと思います。抽象接続ファクトリでSpring統合TCP工場のエラー処理

:この接続はTcpSendingMessageHandlerとTcpReceivingChannelAdapterの両方に注入され

@Bean 
public AbstractClientConnectionFactory clientFactory() { 
    TcpNetClientConnectionFactory factory = new TcpNetClientConnectionFactory(host, Integer.parseInt(port)); 
    factory.setSoKeepAlive(Boolean.parseBoolean(keepAlive)); 
    factory.setSoTimeout(timeout); 
    factory.setSoReceiveBufferSize(Integer.parseInt(bufferSize)); 
    factory.setSoSendBufferSize(Integer.parseInt(bufferSize)); 
    return factory; 
} 

は豆を分離しました。 TcpConnectionExceptionEvent、TcpConnectionCloseEventとTcpConnectionOpenEvent:

@Bean 
public TcpReceivingChannelAdapter tcpIn() { 
... 
receiver.setConnectionFactory(clientFactory()); 
... 
} 

@Bean 
@ServiceActivator(...) 
public TcpSendingMessageHandler tcpOut() { 
... 
sender.setConnectionFactory(clientFactory()); 
... 
} 

は私のようないくつかのApplicatioListenersを持っています。

@EventListener 
public void handleTcpConnectionCloseEvent(TcpConnectionExceptionEvent event){ 
... 
} 

しかし、私は開かれた接続が閉じられました時に、TcpConnectionExceptionEventが発売されましたが、接続がでも開かれていなかったではないときに検出しました。 “connection refused”の問題やその他のTCPエラーはどのように扱うことができますか?

コントロールバスを使用して接続を開始/停止することはできますか?私が送ります:

Message operation = MessageBuilder.withPayload("@clientFactory.isRunning()").build(); 
boolean sent = operationChannel.send(operation); 

これは、応答が受信されなかったため、動作していないしているようだとアプリケーションのみを圧倒参照を探して「連続」のコールを作成します。 clientFactory豆が存在する(context.getBeanDefinitionNames()でチェック)

さらに、再接続を試行する最大再試行回数を設定できますか?

編集(アドバイスを再試行):私は私のtcp発信チャネルにtcpRetryAdviceを追加しましたが、clientFactory()は(“connection refused”)retryAdviceで定義されたポリシーに従っていないので、私はまだ混乱しています。どのように私は現在のattempsを制御することができ、最終的にメッセージが配信されたら?

@Bean 
@ServiceActivator(inputChannel = "tcpSender", adviceChain = "tcpRetryAdvice") 
public TcpSendingMessageHandler tcpOut(AbstractClientConnectionFactory connectionFactory) { ... } 

@Bean 
public RequestHandlerRetryAdvice tcpRetryAdvice() { 

SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
    retryPolicy.setMaxAttempts(2); 

ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); 
    backOffPolicy.setInitialInterval(3000); 
    backOffPolicy.setMaxInterval(10000); 
    backOffPolicy.setMultiplier(2); 

RetryTemplate retryTemplate = new RetryTemplate();  
    retryTemplate.setRetryPolicy(retryPolicy); 
    retryTemplate.setBackOffPolicy(backOffPolicy); 

RequestHandlerRetryAdvice tcpRetryAdvice = new RequestHandlerRetryAdvice(); 
    tcpRetryAdvice.setRetryTemplate(retryTemplate); 

    // This allows fail-controlling 
    tcpRetryAdvice.setRecoveryCallback(new ErrorMessageSendingRecoverer(failMessageChannel())); 

    return tcpRetryAdvice; 
} 

編集(ControlBus):私は、TCP(はconnectionFactory)が消費さJMSを離れて落とさないために接続されているときに知っておく必要があるため

私はちょうどTCPにメッセージの送信を停止しようとしていますメッセージ。

編集(豆用のログインエラー)すべての

まず、私が持っている:

tcpRetryAdvice.setRecoveryCallback(new ErrorMessageSendingRecoverer(failMessageChannel())); 

これは例外をトレースするOKですが、私はメッセージが送信されません得ることができますか?

errorChannelにエラーが送信されましたが、clientFactory() beanが"connecton refused"例外を発生させたときに、スタックトレース全体が表示されています。私はこれを避けたい:

[ERROR][TcpSendingMessageHandler] - [TcpSendingMessageHandler.java:80] - 26/08/2016 
       20:40:57.424 - Error creating connection 
java.net.ConnectException: Connection refused: connect 
    at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at java.net.Socket.connect(Socket.java:538) 
    at java.net.Socket.<init>(Socket.java:434) 
    at java.net.Socket.<init>(Socket.java:211) 
    .... 

私はちょうど欲しい:

In my error channel: Message not delivered <Failed to obtain a connection; nested exception is java.net.ConnectException: Connection refused: connect> 

私はfailChannel()へのコールバックを送信していると私は、スタックトレースを表示したくありません。理想的には、私はコールバックを管理したい。ソケットの再接続を待つためにメッセージを保存せずにメッセージを取得し、errorChannelでエラーを記録します。

答えて

1

新規TcpConnectionFailedEventは、recently addedであった。

4.3.2次週以降にリリースされるはずです。最初に4.3.2.BUILD-SNAPSHOTバージョンを使用して試すことができます。

アウトバウンドアダプタにretry adviceを追加できます。

私は制御バスについて何を言っているのか分かりません。

+0

私は質問を更新して詳細を提供しました。 – crm86

+0

'isRunning()'はそれが接続されているという意味ではなく、接続準備ができているという意味です。アダプターの再試行アドバイスの構成方法を示す必要があります。接続ファクトリには開いている接続をリストするメソッドがありますが、コントロールバスでは使用できません。 –

+0

設定に何か不足しているかもしれませんが、TcpSendingMessageHandlerを送信者とtcpRetryAdvice Beanとして持っているだけです。両方のコンポーネントはEDIT1で説明されています。これはゲートウエイではなく、ただのチャンネルです。サービスアクティベータはメッセージを取得し、TCP – crm86

関連する問題