kotlin - Spring Cloud Stream Kotlin消费者问题

标签 kotlin spring-cloud-stream consumer

我正在尝试使用Kotlin的Spring Cloud Stream。我写了一个简单的使用者,如下所示:

@Bean
fun log(): Consumer<Person> {
    return Consumer<Person> { person: Person -> println("Received: ${person.name}") }
}

Spring Cloud Stream找不到该使用者并立即退出。它不会给出错误,只是终止。

如果我用下面的代码用Java编写相同的使用者,则Stream Cloud Stream会找到该使用者并消耗输入。
@Bean
public Consumer<Person> log() {
    return person -> {
        System.out.println("Received: " + person.getName());
    };
}

为什么Spring Cloud Stream无法在Kotlin中找到我的消费者?

这是Spring Boot Console的输出:
2020-05-26 08:01:29.167  INFO 78463 --- [           main] c.a.s.t.TestBinderApplicationKt          : Starting TestBinderApplicationKt on mburbidg-macOS with PID 78463 (/Users/mburbidg/test-binder/build/classes/kotlin/main started by mburbidg in /Users/mburbidg/test-binder)
2020-05-26 08:01:29.181  INFO 78463 --- [           main] c.a.s.t.TestBinderApplicationKt          : No active profile set, falling back to default profiles: default
2020-05-26 08:01:30.109  INFO 78463 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2020-05-26 08:01:30.113  INFO 78463 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'taskScheduler' has been explicitly defined. Therefore, a default ThreadPoolTaskScheduler will be created.
2020-05-26 08:01:30.114 DEBUG 78463 --- [           main] faultConfiguringBeanFactoryPostProcessor : The '#jsonPath' SpEL function cannot be registered: there is no jayway json-path.jar on the classpath.
2020-05-26 08:01:30.114 DEBUG 78463 --- [           main] faultConfiguringBeanFactoryPostProcessor : SpEL function '#xpath' isn't registered: there is no spring-integration-xml.jar on the classpath.
2020-05-26 08:01:30.116  INFO 78463 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2020-05-26 08:01:30.145  INFO 78463 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-26 08:01:30.147  INFO 78463 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration$IntegrationJmxConfiguration' of type [org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration$IntegrationJmxConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-26 08:01:30.153  INFO 78463 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration' of type [org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-26 08:01:30.156  INFO 78463 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'mbeanServer' of type [com.sun.jmx.mbeanserver.JmxMBeanServer] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-26 08:01:30.166  INFO 78463 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationChannelResolver' of type [org.springframework.integration.support.channel.BeanFactoryChannelResolver] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-26 08:01:30.167  INFO 78463 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationDisposableAutoCreatedBeans' of type [org.springframework.integration.config.annotation.Disposables] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-26 08:01:30.468  INFO 78463 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService 'taskScheduler'
2020-05-26 08:01:30.484  INFO 78463 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : Looking up function '' with acceptedOutputTypes: []
2020-05-26 08:01:30.601 DEBUG 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Registering beans for JMX exposure on startup
2020-05-26 08:01:30.602  INFO 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Registering MessageChannel errorChannel
2020-05-26 08:01:30.603 DEBUG 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Located managed bean 'org.springframework.integration:type=MessageChannel,name=errorChannel': registering with JMX server as MBean [org.springframework.integration:type=MessageChannel,name=errorChannel]
2020-05-26 08:01:30.660  INFO 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Registering MessageChannel nullChannel
2020-05-26 08:01:30.660 DEBUG 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Located managed bean 'org.springframework.integration:type=MessageChannel,name=nullChannel': registering with JMX server as MBean [org.springframework.integration:type=MessageChannel,name=nullChannel]
2020-05-26 08:01:30.678  INFO 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Registering MessageHandler errorLogger
2020-05-26 08:01:30.679 DEBUG 78463 --- [           main] o.s.i.monitor.IntegrationMBeanExporter   : Located managed bean 'org.springframework.integration:type=MessageHandler,name=errorLogger,bean=internal': registering with JMX server as MBean [org.springframework.integration:type=MessageHandler,name=errorLogger,bean=internal]
2020-05-26 08:01:30.700 DEBUG 78463 --- [           main] faultConfiguringBeanFactoryPostProcessor : 
Spring Integration global properties:

spring.integration.channels.autoCreate=true
spring.integration.taskScheduler.poolSize=10
spring.integration.readOnly.headers=
spring.integration.channels.maxUnicastSubscribers=0x7fffffff
spring.integration.endpoints.noAutoStartup=
spring.integration.messagingTemplate.throwExceptionOnLateReply=false
spring.integration.channels.maxBroadcastSubscribers=0x7fffffff

2020-05-26 08:01:30.701 DEBUG 78463 --- [           main] .s.i.c.GlobalChannelInterceptorProcessor : No global channel interceptors.
2020-05-26 08:01:30.703  INFO 78463 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2020-05-26 08:01:30.703  INFO 78463 --- [           main] o.s.i.channel.PublishSubscribeChannel    : Channel 'application.errorChannel' has 1 subscriber(s).
2020-05-26 08:01:30.703  INFO 78463 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started bean '_org.springframework.integration.errorLogger'
2020-05-26 08:01:30.716  INFO 78463 --- [           main] c.a.s.t.TestBinderApplicationKt          : Started TestBinderApplicationKt in 2.32 seconds (JVM running for 3.12)
2020-05-26 08:01:30.722  INFO 78463 --- [extShutdownHook] o.s.i.endpoint.EventDrivenConsumer       : Removing {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2020-05-26 08:01:30.723  INFO 78463 --- [extShutdownHook] o.s.i.channel.PublishSubscribeChannel    : Channel 'application.errorChannel' has 0 subscriber(s).
2020-05-26 08:01:30.723  INFO 78463 --- [extShutdownHook] o.s.i.endpoint.EventDrivenConsumer       : stopped bean '_org.springframework.integration.errorLogger'
2020-05-26 08:01:30.724  INFO 78463 --- [extShutdownHook] o.s.s.c.ThreadPoolTaskScheduler          : Shutting down ExecutorService 'taskScheduler'
2020-05-26 08:01:30.726 DEBUG 78463 --- [extShutdownHook] o.s.i.monitor.IntegrationMBeanExporter   : Unregistering JMX-exposed beans on shutdown
2020-05-26 08:01:30.726 DEBUG 78463 --- [extShutdownHook] o.s.i.monitor.IntegrationMBeanExporter   : Unregistering JMX-exposed beans
2020-05-26 08:01:30.727  INFO 78463 --- [extShutdownHook] o.s.i.monitor.IntegrationMBeanExporter   : Summary on shutdown: bean 'errorChannel'
2020-05-26 08:01:30.727  INFO 78463 --- [extShutdownHook] o.s.i.monitor.IntegrationMBeanExporter   : Summary on shutdown: nullChannel
2020-05-26 08:01:30.727  INFO 78463 --- [extShutdownHook] o.s.i.monitor.IntegrationMBeanExporter   : Summary on shutdown: bean '_org.springframework.integration.errorLogger.handler' for component '_org.springframework.integration.errorLogger'

Process finished with exit code 0

最佳答案

我刚刚对此进行了测试;并没有问题...

@SpringBootApplication
open class So62025232Application {
    @Bean
    open fun input(): Consumer<String> {
        return Consumer { x: String? -> println(x) }
    }

    @Bean
    open fun runner(template: RabbitTemplate): ApplicationRunner {
        return ApplicationRunner { args: ApplicationArguments? ->
            template.convertAndSend("input-in-0.foo", "foo")
            Thread.sleep(2000)
        }
    }

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val ctx = SpringApplication.run(So62025232Application::class.java, *args)
            println(ctx.getBeansOfType(Consumer::class.java))
            ctx.close()
        }
    }
}
spring.cloud.stream.bindings.input-in-0.group=foo
foo
{input=com.example.demo.So62025232Application$input$1@2a65bb85}

Java版本

@SpringBootApplication
public class So62025232Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(So62025232Application.class, args);
        System.out.println(ctx.getBeansOfType(Consumer.class));
        ctx.close();
    }

    @Bean
    Consumer<String> input() {
        return System.out::println;
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        return args -> {
            template.convertAndSend("input-in-0.foo", "foo");
            Thread.sleep(2000);
        };
    }

}

关于kotlin - Spring Cloud Stream Kotlin消费者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62025232/

相关文章:

android - 如何使用 Parcelable 传递可为空的对象列表

java - 使用 RabbitMQ 时可以使用 spring.cloud.stream.bindings.<channel>.group 来获得一次性传递吗?

java - Pact JVM Junit Consumer编译错误

java - 是否可以使一种方法(处理程序)从 Spring Cloud Stream 中的多个入站 channel 接收消息?

apache-kafka - 如何从特定主题中删除 Kafka 消费者组?

Java 8 Lambda 在一次迭代中多次使用一条信息

gradle - 从 ktor 服务 kotlin 多平台 javascript

android - 您的回复网址包含禁止字词或禁止域 : at the time configuration of android platform in Azure Microsoft platform

java - 如何以编程方式转到主屏幕

java - 当没有 kafka 代理运行时,如何出于开发目的禁用 Spring Cloud 流?