我想知道在SpringBoot中初始化许多RabbitMQ队列/绑定时是否有办法减少样板代码的数量?
遵循事件驱动的方法,我的应用程序产生了50种类型的事件……
所以我最终使用手动bean声明并为每个bean使用1个bind()方法
@Configuration @EnableConfigurationProperties(RabbitProperties::class) class RabbitConfiguration( private val properties: RabbitProperties, private val connectionFactory: ConnectionFactory ) { @Bean fun admin() = RabbitAdmin(connectionFactory) @Bean fun exchange() = TopicExchange(properties.template.exchange) @Bean fun rabbitMessageConverter() = Jackson2JsonMessageConverter( jacksonObjectMapper() .registerModule(JavaTimeModule()) .registerModule(Jdk8Module()) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) .enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL) ) @Value("\${okko.rabbit.queue-prefix}") lateinit var queuePrefix: String fun <T> bind(routingKey: String, listener: (T) -> Mono<Void>): SimpleMessageListenerContainer { val queueName = "$queuePrefix.$routingKey" val queue = Queue(queueName) admin().declareQueue(queue) admin().declareBinding(BindingBuilder.bind(queue).to(exchange()).with(routingKey)!!) val container = SimpleMessageListenerContainer(connectionFactory) container.addQueueNames(queueName) container.setMessageListener(MessageListenerAdapter(MessageHandler(listener), rabbitMessageConverter())) return container } internal class MessageHandler<T>(private val listener: (T) -> Mono<Void>) { // NOTE: don't change name of this method, rabbit needs it fun handleMessage(message: T) { listener.invoke(message).subscribeOn(Schedulers.elastic()).subscribe() } } } @Service @Configuration class EventConsumerRabbit( private val config: RabbitConfiguration, private val routingKeys: RabbitEventRoutingKeyConfig ) { @Bean fun event1() = handle(routingKeys.event1) @Bean fun event2() = handle(routingKeys.event2) ... private fun<T> handle(routingKey: String): Mono<Void> = config.bind<T>(routingKey) { log.debug("consume rabbit event: $it") ... // handle event, return Mono<Void> } companion object { private val log by logger() } } @Configuration @ConfigurationProperties("my.rabbit.routing-key.event") class RabbitEventRoutingKeyConfig { lateinit var event1: String lateinit var event2: String ... }