Eu tenho SI fluir que consome org.springframework.web.reactive.socket.WebSocketMessage
, faz algum trabalho com ele, o que inclui a manuseá-lo de carga usando Netty de ByteBuf
. Em algum ponto, ocorreu uma exceção em meu fluxo:
org.springframework.messaging.MessageHandlingException: Ocorreu um erro no manipulador de mensagem [_org.springframework.integration.errorLogger.handler]; exceção aninhada é io.netty.util.IllegalReferenceCountException: refcnt: 0 a org.springframework.integration.support.utils.IntegrationUtils.wrapInHandlingExceptionIfNecessary (IntegrationUtils.java:184) ~ [Primavera-integração-core-5.0.5.RELEASE.jar ! /: 5.0.5.RELEASE] em org.springframework.integration.handler.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java:175) ~ [primavera-integração-core-5.0.5.RELEASE.jar /: 5.0.5. RELEASE] em org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler (BroadcastingDispatcher.java:224) ~ [primavera-integração-core-5.0.5.RELEASE.jar /: 5.0.5.RELEASE] em org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch (BroadcastingDispatcher.java:180) ~ [primavera-integração-core-5.0.5.RELEASE.jar /: 5.0.5.RELEASE] em org.springframework.integration.channel.AbstractSubscribableChannel.doSend (AbstractSubscribableChannel.java:73) ~ [Primavera-integração-core 5.0.5.RELEASE.jar /: 5.0.5.RELEASE] em org.springframework.integration. channel.AbstractMessageChannel.send (AbstractMessageChannel.java:445) ~ [primavera-integração-core 5.0.5.RELEASE.jar /: 5.0.5.RELEASE] em org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:47) ~ [salto ! mensagens 5.0.6.RELEASE.jar /: 5.0.6.RELEASE] em org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:181) ~ [ mensagens salto 5.0.6.RELEASE.jar /: 5.0.6.RELEASE] em org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:160) ~ [Primavera-messaging-5.0.6.RELEASE.jar /: 5.0.6.RELEASE] a io.netty.buffer.AbstractByteBuf .ensureAccessible (AbstractByteBuf.java:1417) ~ [netty-tampão-4.1.24.Final.jar /:! 4.1.24.Final] em org.springframework.messaging.core.AbstractMessageSendingTemplate.send (AbstractMessageSendingTemplate.java:108) ~ [Primavera-messaging-5.0.6.RELEASE.jar /: 5.0.6.RELEASE] em org.springframework.integration.channel. MessagePublishingErrorHandler.handleError (MessagePublishingErrorHandler.java:93) ~ [primavera-integração-core-5.0.5.RELEASE.jar /: 5.0.5.RELEASE] ... causada por: io.netty.util.IllegalReferenceCountException: refcnt: 0 em io.netty.buffer.AbstractByteBuf.getInt (AbstractByteBuf.java:417) ~ [netty-tampão-4.1.24.Final.jar /:! 4.1.24.Final] em io.netty.buffer.AbstractByteBuf.checkIndex (AbstractByteBuf.java:1356) ~ [netty-tampão-4.1.24.Final.jar /:! 4.1.24.Final] em io.netty.buffer.ByteBufUtil.hashCode ( ByteBufUtil.java:175) ~ [netty-tampão-4.1.24.Final.jar /:! 4.1.24.Final] em io.netty.buffer.AbstractByteBuf.hashCode (AbstractByteBuf.java:1315) ~ [netty-tampão -4.1.24.Final.jar /: 4.1.24.Final] em org.springframework.core.io.buffer.NettyDataBuffer.hashCode (NettyDataBuffer.java:288) ~ [primavera-core-5.0.6.RELEASE. jar /: 5.0.6.RELEASE] em org.springframework.web.reactive.socket.WebSocketMessage.hashCode (WebSocketMessage.java:134) ~ [primavera-webflux-5.0.6.RELEASE.jar /: 5.0.6 .RELEASE] em java.lang.Object.toString (Object.java:236) ~ [:? 1.8.0_161] em java.lang.String.valueOf (String.java:2994) ~ [:? 1.8.0_161] em java.lang.StringBuilder.append (StringBuilder.java:131) ~ [:? 1.8.0_161]
Depois disso, a manipulação todas as mensagens WebSocket binários falhar com a seguinte exceção:
2018-11-26T10: 38: 29133 ERRO --- [-server-epoll-7] osihLoggingHandler (:) org.springframework.messaging.MessageDeliveryException: falhou para enviar uma mensagem ao canal 'binaryWebSocketMessageChannel'; exceção aninhada é java.lang.IllegalStateException: O [binaryWebSocketMessageChannel] não tem assinantes para aceitar mensagens, FailedMessage = GenericMessage [payload = MyPayload (payload=org.springframework.web.reactive.socket.WebSocketMessage@38552d5, session = ReactorNettyWebSocketSession [ ID = 3e0be929, uri = http: // localhost: 8080 /]), cabeçalhos = {ID = b09a89ff-f7be-1b43-6f62-40e5c0b5695a, timestamp = 1543225109132}] em org.springframework.integration.support.utils.IntegrationUtils. wrapInDeliveryExceptionIfNecessary (IntegrationUtils.java:163) em org.springframework.integration.channel.AbstractMessageChannel.send (AbstractMessageChannel.java:475) em org.springframework.integration.channel.AbstractMessageChannel.send (AbstractMessageChannel.java:394) em org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:181) em org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:160) em org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:47) em org.springframework. messaging.core.AbstractMessageSendingTemplate.send (AbstractMessageSendingTemplate.java:108) em org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal (AbstractMessageRouter.java:183) em org.springframework.integration.handler.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java:158) em reactor.core.publisher.FluxRetry $ RetrySubscriber.onNext (FluxRetry.java:79) ... em org.springframework. integration.handler.AbstractMessageHandler.onNext (AbstractMessageHandler.java:205) em org.springframework.integration.handler.AbstractMessageHandler.onNext (AbstractMessageHandler.java:55) em org.springframework.integration.endpoint.ReactiveStreamsConsumer $ 1.hookOnNext (ReactiveStreamsConsumer.java:138) em org.springframework.integration.endpoint.ReactiveStreamsConsumer $ 1 .hookOnNext (ReactiveStreamsConsumer.java:127) em reactor.core.publisher.BaseSubscriber.onNext (BaseSubscriber.java:158) causada por: java.lang.IllegalStateException: Será que o [binaryWebSocketMessageChannel] não tem assinantes para aceitar mensagens em org. springframework.util.Assert.state (Assert.java:94) em org.springframework.integration.channel.FluxMessageChannel.doSend (FluxMessageChannel.java:63) em org.springframework.integration.channel.AbstractMessageChannel.send (AbstractMessageChannel.java:445) ... 57 mais
Alguém poderia apontar-me em qualquer direção para tentar resolver o problema? Assim, casos em que seria componente SI EIP (roteador, transformador, filtro, activador de serviço) para anular a partir do canal?
Para referência, o tipo de canal é org.springframework.integration.channel.FluxMessageChannel
Editar:
Meu fluxo parece com isso:
WebSocketMessage -> router: (BINARY) -> binaryWebSocketMessageChannel -> ...
(!BINARY) -> nullChannel
(Eu sei que se encaixa filtro melhor aqui, eu pretendo refactor mais tarde)
@ArtemBilan o repo com o exemplo está aqui: https://github.com/ioreskovic/Spring-Integration-flow-loses-subscriber
O ponto é que Publisher
no FluxMessageChannel
for cancelado nessa versão Spring Integration.
Começamos a usar onErrorContinue()
a partir do Reactor 3.2
na versão 5.1
. Para corrigir o problema, seria melhor considerar atualizar seu aplicativo para a última Primavera de inicialização 2.1.1
.
À medida que resolver você pode considerar a engolir uma exceção no BinaryWsmToBytesTransformer
e não fazer bolha-lo na FluxMessageChannel
volta.