是否可以用 RabbitListener 声明这些绑定?

is it possible to declare these bindings with RabbitListener?

给定此代码


    @Bean
    open fun exchange(): TopicExchange {
        return TopicExchange("amq.topic")
    }

    @RabbitListener(queues = [Amqp.BODY_WEIGHT_NEW])
    open fun record(entity: Collection<BodyWeight>) {
        log.trace("saving: {}", entity)
    }

    @Bean
    open fun weight(): Queue {
        return Queue(Amqp.BODY_WEIGHT_NEW)
    }

    @Bean
    open fun bindWeight(): Binding {
        return BindingBuilder.bind(weight()).to(exchange).with(Amqp.BODY_WEIGHT_NEW)
    }

是否可以使用 @RabbitListener 减少我的@Bean 声明?我知道我可以将队列列为要声明的队列,但我不确定绑定会是什么样子。

试过这个

    @RabbitListener(bindings = [QueueBinding(value = Queue(Amqp.BODY_WEIGHT_NEW), exchange = Exchange("amqp.topic"))])

但它似乎没有以同样的方式绑定到交易所,因为我的测试没有通过。

您需要将路由键添加到 @QueueBinding...

key = Amqp.BODY_WEIGHT_NEW

(这就是 BindingBuilder 上的 with 子句的作用)。

编辑

适合我...

@SpringBootApplication
open class So55928905Application {

    @RabbitListener(bindings = [QueueBinding(value = Queue("foo"), 
                                  exchange = Exchange("amqp.topic"), 
                                  key = ["foo"])])
    fun `in`(`in`: String) {

    }

    companion object {

        @JvmStatic
        fun main(args: Array<String>) {
            SpringApplication.run(So55928905Application::class.java, *args)
        }
    }

}

EDIT2

问题是您的交易所名称 MQTT 发布到标准 amq.topic 而不是 amqp.topic

@SpringBootApplication
open class So55928905Application {

    @RabbitListener(bindings = [QueueBinding(value = Queue("foo"),
                        exchange = Exchange(name = "amq.topic", type = "topic"),
                        key = ["foo"])])
    fun listen(string: String) {
        println(string)
    }

    companion object {

        @JvmStatic
        fun main(args: Array<String>) {
            SpringApplication.run(So55928905Application::class.java, *args)
        }
    }

}