redis / lettuce

Advanced Java Redis client for thread-safe sync, async, and reactive usage. Supports Cluster, Sentinel, Pipelining, and codecs.
https://lettuce.io
MIT License
5.41k stars 975 forks source link

use with gateway,but something throw io.lettuce.core.output.ValueOutput does not support set(long) #2864

Open zafir-zhong opened 5 months ago

zafir-zhong commented 5 months ago

I have deployed multiple gateway services with the same code. However, in some instances of the service, a failure occurs after listening to specific Redis messages. The failure disappears after restarting the service, but it reappears after repackaging.

spring-cloud-starter-gateway:3.1.9
lettuce: 6.1.10.RELEASE
spring-data-redis: 2.7.18

convertAndSenddata:

{"apps":[“D3sX4"],"status": 2}

listen:

reactiveRedisTemplate.listenToChannel(Constant.Sentinel.RULE_SYNC_KEY).flatMap(data -> {});

error log:

2024-04-23 18:06:39.741|ERROR |9573|lettuce-epollEventLoop-5-1||Operator called default onErrorDropped
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.UnsupportedOperationException: io.lettuce.core.output.ValueOutput does not support set(long)
Caused by: java.lang.UnsupportedOperationException: io.lettuce.core.output.ValueOutput does not support set(long)
        at io.lettuce.core.output.CommandOutput.set(CommandOutput.java:107) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.safeSet(RedisStateMachine.java:778) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.handleInteger(RedisStateMachine.java:404) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine$State$Type.handle(RedisStateMachine.java:206) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.doDecode(RedisStateMachine.java:334) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.RedisStateMachine.decode(RedisStateMachine.java:295) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:842) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode0(CommandHandler.java:793) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:767) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:659) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599) ~[lettuce-core-6.1.10.RELEASE.jar:6.1.10.RELEASE]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:801) ~[netty-transport-classes-epoll-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:509) ~[netty-transport-classes-epoll-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:407) ~[netty-transport-classes-epoll-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.108.Final.jar:4.1.108.Final]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.108.Final.jar:4.1.108.Final]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201]

arthas data (input@ValueOutput respnull and Thread@StackTraceElement)

method=io.lettuce.core.protocol.RedisStateMachine.safeSet location=AtExit
ts=2024-05-24 17:17:38; [cost=0.899899ms] result=@ArrayList[
    @ValueOutput[
        codec=@ByteBufferCodec[
            INSTANCE=@ByteBufferCodec[
                INSTANCE=@ByteBufferCodec[INSTANCE],
                $VALUES=@ByteBufferCodec[][isEmpty=false;size=1],
                name=@String[INSTANCE],
                ordinal=@Integer[0],
            ],
            $VALUES=@ByteBufferCodec[][
                @ByteBufferCodec[INSTANCE],
            ],
            name=@String[INSTANCE],
            ordinal=@Integer[0],
        ],
        output=null,
        error=@String[io.lettuce.core.output.ValueOutput does not support set(long)],
    ],
    null,
    @StackTraceElement[][
        @StackTraceElement[
            declaringClass=@String[java.lang.Thread],
            methodName=@String[getStackTrace],
            fileName=@String[Thread.java],
            lineNumber=@Integer[1559],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[sun.reflect.NativeMethodAccessorImpl],
            methodName=@String[invoke0],
            fileName=@String[NativeMethodAccessorImpl.java],
            lineNumber=@Integer[-2],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[sun.reflect.NativeMethodAccessorImpl],
            methodName=@String[invoke],
            fileName=@String[NativeMethodAccessorImpl.java],
            lineNumber=@Integer[62],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[sun.reflect.DelegatingMethodAccessorImpl],
            methodName=@String[invoke],
            fileName=@String[DelegatingMethodAccessorImpl.java],
            lineNumber=@Integer[43],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[java.lang.reflect.Method],
            methodName=@String[invoke],
            fileName=@String[Method.java],
            lineNumber=@Integer[498],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.OgnlRuntime],
            methodName=@String[invokeMethod],
            fileName=@String[OgnlRuntime.java],
            lineNumber=@Integer[899],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.OgnlRuntime],
            methodName=@String[callAppropriateMethod],
            fileName=@String[OgnlRuntime.java],
            lineNumber=@Integer[1544],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ObjectMethodAccessor],
            methodName=@String[callMethod],
            fileName=@String[ObjectMethodAccessor.java],
            lineNumber=@Integer[68],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.OgnlRuntime],
            methodName=@String[callMethod],
            fileName=@String[OgnlRuntime.java],
            lineNumber=@Integer[1620],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ASTMethod],
            methodName=@String[getValueBody],
            fileName=@String[ASTMethod.java],
            lineNumber=@Integer[91],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[evaluateGetValueBody],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[212],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[getValue],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[258],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ASTChain],
            methodName=@String[getValueBody],
            fileName=@String[ASTChain.java],
            lineNumber=@Integer[141],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[evaluateGetValueBody],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[212],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[getValue],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[258],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.ASTList],
            methodName=@String[getValueBody],
            fileName=@String[ASTList.java],
            lineNumber=@Integer[60],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[evaluateGetValueBody],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[212],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.SimpleNode],
            methodName=@String[getValue],
            fileName=@String[SimpleNode.java],
            lineNumber=@Integer[258],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.Ognl],
            methodName=@String[getValue],
            fileName=@String[Ognl.java],
            lineNumber=@Integer[470],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.Ognl],
            methodName=@String[getValue],
            fileName=@String[Ognl.java],
            lineNumber=@Integer[572],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[ognl.Ognl],
            methodName=@String[getValue],
            fileName=@String[Ognl.java],
            lineNumber=@Integer[542],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.express.OgnlExpress],
            methodName=@String[get],
            fileName=@String[OgnlExpress.java],
            lineNumber=@Integer[40],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.advisor.AdviceListenerAdapter],
            methodName=@String[getExpressionResult],
            fileName=@String[AdviceListenerAdapter.java],
            lineNumber=@Integer[123],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.monitor200.WatchAdviceListener],
            methodName=@String[watching],
            fileName=@String[WatchAdviceListener.java],
            lineNumber=@Integer[87],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.monitor200.WatchAdviceListener],
            methodName=@String[finishing],
            fileName=@String[WatchAdviceListener.java],
            lineNumber=@Integer[71],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.command.monitor200.WatchAdviceListener],
            methodName=@String[afterReturning],
            fileName=@String[WatchAdviceListener.java],
            lineNumber=@Integer[55],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.advisor.AdviceListenerAdapter],
            methodName=@String[afterReturning],
            fileName=@String[AdviceListenerAdapter.java],
            lineNumber=@Integer[57],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[com.taobao.arthas.core.advisor.SpyImpl],
            methodName=@String[atExit],
            fileName=@String[SpyImpl.java],
            lineNumber=@Integer[67],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[java.arthas.SpyAPI],
            methodName=@String[atExit],
            fileName=@String[SpyAPI.java],
            lineNumber=@Integer[64],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[safeSet],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[782],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[handleInteger],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[404],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine$State$Type],
            methodName=@String[handle],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[206],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[doDecode],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[334],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.RedisStateMachine],
            methodName=@String[decode],
            fileName=@String[RedisStateMachine.java],
            lineNumber=@Integer[295],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[842],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode0],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[793],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[767],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[decode],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[659],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.lettuce.core.protocol.CommandHandler],
            methodName=@String[channelRead],
            fileName=@String[CommandHandler.java],
            lineNumber=@Integer[599],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[442],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[420],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[fireChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[412],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.DefaultChannelPipeline$HeadContext],
            methodName=@String[channelRead],
            fileName=@String[DefaultChannelPipeline.java],
            lineNumber=@Integer[1410],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[440],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.AbstractChannelHandlerContext],
            methodName=@String[invokeChannelRead],
            fileName=@String[AbstractChannelHandlerContext.java],
            lineNumber=@Integer[420],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.DefaultChannelPipeline],
            methodName=@String[fireChannelRead],
            fileName=@String[DefaultChannelPipeline.java],
            lineNumber=@Integer[919],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe],
            methodName=@String[epollInReady],
            fileName=@String[AbstractEpollStreamChannel.java],
            lineNumber=@Integer[801],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.epoll.EpollEventLoop],
            methodName=@String[processReady],
            fileName=@String[EpollEventLoop.java],
            lineNumber=@Integer[509],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.channel.epoll.EpollEventLoop],
            methodName=@String[run],
            fileName=@String[EpollEventLoop.java],
            lineNumber=@Integer[407],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.util.concurrent.SingleThreadEventExecutor$4],
            methodName=@String[run],
            fileName=@String[SingleThreadEventExecutor.java],
            lineNumber=@Integer[997],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.util.internal.ThreadExecutorMap$2],
            methodName=@String[run],
            fileName=@String[ThreadExecutorMap.java],
            lineNumber=@Integer[74],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[io.netty.util.concurrent.FastThreadLocalRunnable],
            methodName=@String[run],
            fileName=@String[FastThreadLocalRunnable.java],
            lineNumber=@Integer[30],
            serialVersionUID=@Long[6992337162326171013],
        ],
        @StackTraceElement[
            declaringClass=@String[java.lang.Thread],
            methodName=@String[run],
            fileName=@String[Thread.java],
            lineNumber=@Integer[748],
            serialVersionUID=@Long[6992337162326171013],
        ],
    ],
]
tishun commented 5 months ago

Hey @zafir-zhong , are you sure this issue does not belong to the spring-data-redis? From the information you've provided it is hard to understand what is going wrong. Could you provide a minimal sample so we can investigate further?

zafir-zhong commented 5 months ago

I am unable to reproduce this issue stably, but it always occurs sporadically.And, in the exception stack, only the relevant information of Lettuce can be seen. it happen when gateway listen a message {"apps":[“D3sX4"],"status": 2} from redis,and causing the service to be unable to read data from Redis

zafir-zhong commented 5 months ago

Can you provide some suggestions on when Lettuce may throw this exception? Now all I know is that the service malfunctioned after receiving a Redis message

tishun commented 5 months ago

Can you provide some suggestions on when Lettuce may throw this exception? Now all I know is that the service malfunctioned after receiving a Redis message

This message means that the Lettuce driver is not set up to process the message that was returned. Each command has an implementation of the CommandOutput associated to it, to help parse the response from the server. In your case this is a ValueOutput. The ValueOutput does not handle long values and thus the processing fails.

Now why we are receiving the wrong value is a question I can't answer.

What type of serialization are you using for your ReactiveRedisTemplate? Are messages of mixed type expected on this channel? What is the purpose of this code?

tishun commented 5 months ago

I am unable to reproduce this issue stably, but it always occurs sporadically.And, in the exception stack, only the relevant information of Lettuce can be seen. it happen when gateway listen a message {"apps":[“D3sX4"],"status": 2} from redis,and causing the service to be unable to read data from Redis

Have you asked your question in the spring-data-redis ?

zafir-zhong commented 5 months ago

Can you provide some suggestions on when Lettuce may throw this exception? Now all I know is that the service malfunctioned after receiving a Redis message

This message means that the Lettuce driver is not set up to process the message that was returned. Each command has an implementation of the CommandOutput associated to it, to help parse the response from the server. In your case this is a ValueOutput. The ValueOutput does not handle long values and thus the processing fails.

Now why we are receiving the wrong value is a question I can't answer.

What type of serialization are you using for your ReactiveRedisTemplate? Are messages of mixed type expected on this channel? What is the purpose of this code?

use jason serialization I didn't find any of my own code in the exception message, so I can't actually confirm which line of code caused it

zafir-zhong commented 5 months ago

I am unable to reproduce this issue stably, but it always occurs sporadically.And, in the exception stack, only the relevant information of Lettuce can be seen. it happen when gateway listen a message {"apps":[“D3sX4"],"status": 2} from redis,and causing the service to be unable to read data from Redis

Have you asked your question in the spring-data-redis ?

i try it now.

mp911de commented 5 months ago

Looks like a variant of #2175

tishun commented 5 months ago

Looks like a variant of #2175

Do you think it is more likely a problem of the driver or the way spring-data-redis uses it? I am trying to see a pattern myselft, but I see we also have instances of this issue manifested when the driver is used standalone.

mp911de commented 5 months ago

Impossible to say without a reproducer. The listenToChannel(…) method effectively SUBSCRIBEs to a channel with a PubSubOutput. Given the exception above that mentions ValueOutput, there's a gap that only a reproducer can describe.