봄 통합 흐름은 가입자를 잃는다

ioreskovic :

나는 SI 어떤 소비하는 흐름이 org.springframework.web.reactive.socket.WebSocketMessage, 인 Netty의를 사용하여 그것의 페이로드를 처리 포함 그것으로 몇 가지 작업을 수행합니다 ByteBuf. 어떤 점에서 예외가 내 흐름에서 발생

org.springframework.messaging.MessageHandlingException : 에러 메시지 핸들러 발생 [_org.springframework.integration.errorLogger.handler]; 중첩 예외 io.netty.util.IllegalReferenceCountException이다 refCnt 0 
    org.springframework.integration.support.utils.IntegrationUtils.wrapInHandlingExceptionIfNecessary (IntegrationUtils.java:184) ~ [스프링 일체형 코어 -시 5.0.5.RELEASE.jar ! / : 5.0.5.RELEASE] 
    org.springframework.integration.handler.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java:175)에서 ~ [스프링 일체형 코어 - 5.0.5.RELEASE.jar /! 5.0.5. RELEASE]  
    org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler (BroadcastingDispatcher.java:224)에서 ~ [스프링 통합 코어 - 5.0.5.RELEASE.jar / :! 5.0.5.RELEASE]
    org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch (BroadcastingDispatcher.java:180)에서 ~ [스프링 통합 코어 - 5.0.5.RELEASE.jar / :! 5.0.5.RELEASE]
    org.springframework.integration.channel.AbstractSubscribableChannel.doSend에서 (AbstractSubscribableChannel.java:73) ~ : [봄 - 통합 코어 5.0.5.RELEASE.jar /! 5.0.5.RELEASE] 
    org.springframework.integration에서. : channel.AbstractMessageChannel.send (AbstractMessageChannel.java:445) ~ [5.0.5.RELEASE 스프링 통합 코어 5.0.5.RELEASE.jar /!] 
    org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:47 AT) ~ [점프 ! 메시징 5.0.6.RELEASE.jar / : 5.0.6.RELEASE] 
    org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:181 AT) ~ [ ! 5.0.6.RELEASE.jar / 점프 메시징 : 5.0.6.RELEASE]
    : org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:160) ~ [5.0.6.RELEASE! 스프링 메시징 5.0.6.RELEASE.jar /]에서 
    io.netty.buffer.AbstractByteBuf에서 .ensureAccessible (AbstractByteBuf.java:1417) ~ [그물코 버퍼-4.1.24.Final.jar /! 4.1.24.Final]
    org.springframework.messaging.core.AbstractMessageSendingTemplate.send에서 (AbstractMessageSendingTemplate.java:108) ~ : [봄 메시징 5.0.6.RELEASE.jar /! 5.0.6.RELEASE] 
    org.springframework.integration.channel에서. MessagePublishingErrorHandler.handleError (MessagePublishingErrorHandler.java:93) ~ [스프링 통합 코어 - 5.0.5.RELEASE.jar / :! 5.0.5.RELEASE는] 
... 
io.netty.util.IllegalReferenceCountException :에 의한 refCnt : 0 
    : io.netty.buffer.AbstractByteBuf.checkIndex (AbstractByteBuf.java:1356) ~ [! 4.1.24.Final 그물코 버퍼-4.1.24.Final.jar /]에서 
    의 io.netty.buffer.AbstractByteBuf.getInt (AbstractByteBuf.java:417) ~ [그물코 버퍼-4.1.24.Final.jar /! 4.1.24.Final] 
    io.netty.buffer.ByteBufUtil.hashCode에서 ( ByteBufUtil.java:175) ~ [그물코 버퍼-4.1.24.Final.jar /! 4.1.24.Final] 
    io.netty.buffer.AbstractByteBuf.hashCode에서 (AbstractByteBuf.java:1315) ~ [그물코 버퍼 -4.1.24.Final.jar /! 4.1.24.Final] 
    org.springframework.core.io.buffer.NettyDataBuffer.hashCode (NettyDataBuffer.java:288)에서 ~ [스프링 코어 5.0.6.RELEASE. 병 /! 5.0.6.RELEASE] 
    org.springframework.web.reactive.socket.WebSocketMessage.hashCode (WebSocketMessage.java:134)에서 ~ [스프링 webflux-5.0.6.RELEASE.jar /! 5.0.6 .RELEASE] 
    java.lang.Object.toString (Object.java:236) ~에서 [: 1.8.0_161]
    [? : 1.8.0_161] java.lang.String.valueOf (String.java:2994) ~에서 
    java.lang.StringBuilder.append에서 (StringBuilder.java:131) ~ [: 1.8.0_161]

그 후, 모든 바이너리 웹 소켓 메시지를 처리하면 다음과 같은 예외와 함께 실패합니다 :

2018-11-26T10 : 38 : 29,133 ERROR --- [-server-는 epoll-7] osihLoggingHandler (:) org.springframework.messaging.MessageDeliveryException : 채널 'binaryWebSocketMessageChannel'에 메시지를 보내지 못했습니다; 에서 [binaryWebSocketMessageChannel는, failedMessage = GenericMessage [페이로드 = MyPayload (payload=org.springframework.web.reactive.socket.WebSocketMessage@38552d5, 세션 = ReactorNettyWebSocketSession를 [메시지를 수락하는 가입자가 없습니다 : 중첩 된 예외는 java.lang.IllegalStateException입니다 식 3e0be929, URI = HTTP : // 로컬 호스트 : 8080 /), 헤더 = {식 b09a89ff-f7be-1b43-6f62-40e5c0b5695a 소인 = 1,543,225,109,132}] 
    org.springframework.integration.support.utils.IntegrationUtils에서. wrapInDeliveryExceptionIfNecessary (IntegrationUtils.java:163)
    org.springframework.integration.channel.AbstractMessageChannel.send (AbstractMessageChannel.java:475)에서 
    org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:47)에서 
    org.springframework에서. messaging.core.AbstractMessageSendingTemplate.send (AbstractMessageSendingTemplate.java:108)
    org.springframework.integration.channel.AbstractMessageChannel.send (AbstractMessageChannel.java:394)에서 
    org.springframework.messaging.core.GenericMessagingTemplate.doSend에서 (GenericMessagingTemplate.java:181) 
    org.springframework.messaging.core.GenericMessagingTemplate.doSend에서 (GenericMessagingTemplate.java:160) 
    org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal에서 (AbstractMessageRouter.java:183) 
    org.springframework.integration.handler.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java:158)에서 
    org.springframework에서. integration.handler.AbstractMessageHandler.onNext (AbstractMessageHandler.java:205) 
    org.springframework.integration.handler.AbstractMessageHandler.onNext에서 (AbstractMessageHandler.java:55) 
    org.springframework.integration.endpoint.ReactiveStreamsConsumer $ 1.hookOnNext (ReactiveStreamsConsumer.java:138)에서 
    org.springframework.integration.endpoint.ReactiveStreamsConsumer $ 1.hookOnNext (ReactiveStreamsConsumer.java:127)에서의 
    반응기에서. core.publisher.BaseSubscriber.onNext (BaseSubscriber.java:158) 
    reactor.core.publisher.FluxRetry $ RetrySubscriber.onNext에서 (FluxRetry.java:79) 
... 
에 의해 발생 : java.lang.IllegalStateException 다음 [binaryWebSocketMessageChannel]는 메시지를 받아 들일 가입자가없는 
    조직에서입니다. springframework.util.Assert.state (Assert.java:94) 
    org.springframework.integration.channel.FluxMessageChannel.doSend에서 (FluxMessageChannel.java:63)
    org.springframework.integration.channel.AbstractMessageChannel.send에서 (AbstractMessageChannel.java:445) 
    ... (57)보다

에 누구 포인트 나 할 수 있는 방향으로 노력하고 문제를 해결하기 위해? 물론, 어느 경우가 SI EIP 성분 (라우터, 변환기, 필터, 서비스 활성화)는 채널로부터 탈퇴 할 것인가?

참고로, 채널 형은 org.springframework.integration.channel.FluxMessageChannel

편집하다:

내 흐름은 다음과 같습니다 :

WebSocketMessage -> router: (BINARY)  -> binaryWebSocketMessageChannel -> ...
                            (!BINARY) -> nullChannel

(나는 나중에 리팩토링 계획, 더 나은 여기 필터 맞는 알고)

@ArtemBilan 예와의 repo는 여기에 있습니다 : https://github.com/ioreskovic/Spring-Integration-flow-loses-subscriber

아르테타 :

포인트는 것입니다 Publisher에서하는 것은 FluxMessageChannel그 봄 통합 버전이 취소됩니다.

우리는 사용하기 시작 onErrorContinue()반응기로부터 3.2버전 5.1. 문제를 해결하려면이 최신 봄 부팅 할 수있는 응용 프로그램을 업그레이드하기 위해 고려하는 것이 좋을 것이다 2.1.1.

우리가 해결 방법으로 당신은에서 예외를 삼켜 고려할 수 BinaryWsmToBytesTransformer있으며이에 거품하지 않습니다 FluxMessageChannel다시.

추천

출처http://43.154.161.224:23101/article/api/json?id=237016&siteId=1