Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常:org.springframework.messaging.MessageDeliveryException:调度程序没有通道的订户_Java_Spring Cloud_Spring Cloud Stream_Spring Cloud Function - Fatal编程技术网

Java 异常:org.springframework.messaging.MessageDeliveryException:调度程序没有通道的订户

Java 异常:org.springframework.messaging.MessageDeliveryException:调度程序没有通道的订户,java,spring-cloud,spring-cloud-stream,spring-cloud-function,Java,Spring Cloud,Spring Cloud Stream,Spring Cloud Function,我有一个沙箱来探索SpringCloudStream中新添加的函数,但我在一个SpringCloudStream应用程序中使用函数和供应商时遇到了一个问题 在代码中,我使用了中描述的示例 首先,我在application.yml中添加了相应的spring.cloud.stream.bindings和spring.cloud.stream.Function.definition属性,以添加到项目Function。一切正常,我将消息发布到my fun inKafka主题,应用程序执行函数并将结果发送

我有一个沙箱来探索SpringCloudStream中新添加的函数,但我在一个SpringCloudStream应用程序中使用函数和供应商时遇到了一个问题

在代码中,我使用了中描述的示例

首先,我在
application.yml
中添加了相应的
spring.cloud.stream.bindings
spring.cloud.stream.Function.definition
属性,以添加到项目
Function
。一切正常,我将消息发布到
my fun in
Kafka主题,应用程序执行函数并将结果发送到
my fun out
主题

然后我将
Supplier
添加到同一个项目中,并使用相应的
spring.cloud.stream.bindings
spring.cloud.stream.function.definition
值更新到
fun;sup
。奇怪的事情开始发生了。当我尝试启动应用程序时,收到以下错误:

2020-01-15 01:45:16.608 ERROR 10128 --- [oundedElastic-1] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'application.sup-out-0'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers, failedMessage=GenericMessage [payload=byte[20], headers={contentType=application/json, id=89301e00-b285-56e0-cb4d-8133555c8905, timestamp=1579045516603}], failedMessage=GenericMessage [payload=byte[20], headers={contentType=application/json, id=89301e00-b285-56e0-cb4d-8133555c8905, timestamp=1579045516603}]
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:403)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
    at org.springframework.integration.router.AbstractMessageRouter.doSend(AbstractMessageRouter.java:206)
    at org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal(AbstractMessageRouter.java:188)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:170)
    at org.springframework.integration.handler.AbstractMessageHandler.onNext(AbstractMessageHandler.java:219)
    at org.springframework.integration.handler.AbstractMessageHandler.onNext(AbstractMessageHandler.java:57)
    at org.springframework.integration.endpoint.ReactiveStreamsConsumer$DelegatingSubscriber.hookOnNext(ReactiveStreamsConsumer.java:165)
    at org.springframework.integration.endpoint.ReactiveStreamsConsumer$DelegatingSubscriber.hookOnNext(ReactiveStreamsConsumer.java:148)
    at reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:160)
    at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:123)
    at reactor.core.publisher.EmitterProcessor.drain(EmitterProcessor.java:426)
    at reactor.core.publisher.EmitterProcessor.onNext(EmitterProcessor.java:268)
    at reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
    at reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
    at reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
    at org.springframework.integration.channel.FluxMessageChannel.doSend(FluxMessageChannel.java:63)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:403)
    at org.springframework.integration.channel.FluxMessageChannel.lambda$subscribeTo$2(FluxMessageChannel.java:83)
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:189)
    at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.runAsync(FluxPublishOn.java:398)
    at reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.run(FluxPublishOn.java:484)
    at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
    at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers, failedMessage=GenericMessage [payload=byte[20], headers={contentType=application/json, id=89301e00-b285-56e0-cb4d-8133555c8905, timestamp=1579045516603}]
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:139)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    ... 34 more
之后,我尝试了几件事:

  • spring.cloud.stream.function.definition
    还原为
    fun
    (禁用
    sup
    bean绑定到外部目标)。应用程序启动,功能正常,供应商不工作。一切如期而至
  • spring.cloud.stream.function.definition
    更改为
    sup
    (禁用
    fun
    bean绑定到外部目标)。应用程序启动,功能不工作,供应商工作(每秒向
    my sup out
    topic发送一条消息)。一切都如预期的那样
  • 更新了
    spring.cloud.stream.function.definition
    value到
    fun;sup
    。应用程序未启动,收到相同的MessageDeliveryException
  • spring.cloud.stream.function.definition
    值交换为
    sup;乐趣
    。应用程序已启动,供应商已工作,但功能不工作(未向
    我的乐趣
    主题发送消息)
  • 最后一个问题比错误更让我困惑),所以现在我需要有人帮我解决问题

    我是否在配置中遗漏了什么?为什么更改由
    分隔的bean顺序spring.cloud.stream.function.definition中的code>导致不同的结果?

    完整项目已上载到并添加到以下位置:

    StreamApplication.java:

    build.gradle.kts:

    插件{
    JAVA
    }
    group=“com.kaine”
    version=“1.0-SNAPSHOT”
    存储库{
    mavenCentral()
    }
    依赖关系{
    实现(平台(“org.springframework.cloud:springcloud依赖项:Hoxton.SR1”))
    实现(“org.springframework.cloud:springcloudstarterstreamkafka”)
    实现(平台(“org.springframework.boot:springboot依赖项:2.2.2.RELEASE”))
    }
    配置{
    sourceCompatibility=JavaVersion.VERSION\u 11
    }
    
    事实上,这是我们的文档中的一个问题,因为我相信我们为他的案例提供了一个反应性供应商的坏例子。问题是您的供应商处于无限阻塞循环中。它基本上永远不会回来。 因此,请将其更改为:

    @Bean
    public Supplier<Flux<String>> sup() {
        return () -> Flux.fromStream(Stream.generate(new Supplier<String>() {
    
            @Override
            public String get() {
                try {
                    Thread.sleep(1000);
                    return "Hello from Supplier";
                } catch (Exception e) {
                    // ignore
                }
            }
    
        })).subscribeOn(Schedulers.elastic()).share();
    }
    
    @Bean
    公共供应商支持(){
    return()->Flux.fromStream(Stream.generate(newsupplier)(){
    @凌驾
    公共字符串get(){
    试一试{
    睡眠(1000);
    返回“供应商您好”;
    }捕获(例外e){
    //忽略
    }
    }
    })).subscribeOn(Schedulers.elastic()).share();
    }
    
    Oleg,我试过你的代码片段,它真的解决了我的问题。谢谢你的建议)P.S.小提示:get方法需要
    返回
    try
    /
    catch
    之后,否则编译器会大喊“缺少返回语句”@Oleg你能解释一下qestion中的代码被阻塞的原因吗?谢谢
    spring:
      cloud:
        stream:
          function:
            definition: fun;sup
          bindings:
            fun-in-0:
              destination: my-fun-in
            fun-out-0:
              destination: my-fun-out
            sup-out-0:
              destination: my-sup-out
    
    plugins {
        java
    }
    
    group = "com.kaine"
    version = "1.0-SNAPSHOT"
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
            implementation(platform("org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR1"))
            implementation("org.springframework.cloud:spring-cloud-starter-stream-kafka")
    
            implementation(platform("org.springframework.boot:spring-boot-dependencies:2.2.2.RELEASE"))
    }
    
    configure<JavaPluginConvention> {
        sourceCompatibility = JavaVersion.VERSION_11
    }
    
    @Bean
    public Supplier<Flux<String>> sup() {
        return () -> Flux.fromStream(Stream.generate(new Supplier<String>() {
    
            @Override
            public String get() {
                try {
                    Thread.sleep(1000);
                    return "Hello from Supplier";
                } catch (Exception e) {
                    // ignore
                }
            }
    
        })).subscribeOn(Schedulers.elastic()).share();
    }