Можно ли объявить эти привязки с RabbitListener? - PullRequest
0 голосов
/ 01 мая 2019

с указанным кодом


    @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)
    }

возможно ли уменьшить мои объявления @Bean, используя @RabbitListener? Я знаю, что могу перечислить очередь как очередь для объявления, но я не уверен, как будут выглядеть привязки.

попробовал это

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

но, похоже, он не привязывается к обмену так же, как мои тесты не проходят.

1 Ответ

1 голос
/ 01 мая 2019

Вам необходимо добавить ключ маршрутизации к @QueueBinding ...

key = Amqp.BODY_WEIGHT_NEW

(это то, что делает предложение with в BindingBuilder).

EDIT

У меня отлично работает ...

@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)
        }
    }

}

enter image description here

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)
        }
    }

}
...