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을 사용하여 오류를 기록하십시오.
추가 정보를 제공하도록 내 질문이 업데이트되었습니다. – crm86
isRunning()은 그것이 연결되었음을 의미하지 않는다. 연결 준비가되었다는 것을 의미한다. 어댑터에 재시도 권고를 구성한 f}을 표시해야합니다. 연결 팩토리에는 열려있는 연결을 나열하는 방법이 있지만 제어 버스에서는 사용할 수 없습니다. –
어쩌면 구성에 뭔가가 누락되었습니다. TcpSendingMessageHandler를 보낸 사람과 tcpRetryAdvice Bean으로 사용하고 있습니다. 두 구성 요소는 EDIT1에 설명되어 있습니다. 이것은 게이트웨이가 아니라 외설 채널입니다. service-activator가 메시지를 가져 와서 TCP – crm86