2016-08-26 3 views
2

TCP 연결 팩토리 예외를 처리하고 싶습니다. 추상적 접속 공장스프링 통합 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 메시지 전송을 중지하려고

메시지. 이것은 OK입니다

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

예외를 추적하지만 어떻게 메시지가 전송되지 얻을 수 :

편집 (콩에 대한 로깅 오류) 모든

첫째,이?

그런 다음 errorChannel으로 전송 된 오류가 있지만 clientFactory() 빈이 "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

신품 TcpConnectionFailedEventrecently added이었다.

4.3.2 다음 주에 발표되어야합니다. 먼저 4.3.2.BUILD-SNAPSHOT 버전을 사용하여 시험해 볼 수 있습니다.

아웃 바운드 어댑터에 retry advice을 추가 할 수 있습니다.

컨트롤 버스에 대한 귀하의 의견을 잘 모릅니다.

+0

추가 정보를 제공하도록 내 질문이 업데이트되었습니다. – crm86

+0

isRunning()은 그것이 연결되었음을 의미하지 않는다. 연결 준비가되었다는 것을 의미한다. 어댑터에 재시도 권고를 구성한 f}을 표시해야합니다. 연결 팩토리에는 열려있는 연결을 나열하는 방법이 있지만 제어 버스에서는 사용할 수 없습니다. –

+0

어쩌면 구성에 뭔가가 누락되었습니다. TcpSendingMessageHandler를 보낸 사람과 tcpRetryAdvice Bean으로 사용하고 있습니다. 두 구성 요소는 EDIT1에 설명되어 있습니다. 이것은 게이트웨이가 아니라 외설 채널입니다. service-activator가 메시지를 가져 와서 TCP – crm86

관련 문제