SpringBoot RabbitMQ-如何减少许多主题(事件)的样板?

时间:2019-02-11 16:13:38

标签: spring spring-boot rabbitmq

我想知道在SpringBoot中初始化许多RabbitMQ队列/绑定时是否有办法减少样板代码量?

按照事件驱动的方法,我的应用程序会产生50种类型的事件(稍后会分成几个较小的应用程序,但仍然如此)。 每个事件都将与“主题”类型进行交换。 一些事件被其他应用程序占用,一些事件另外由发送它们的同一应用程序消耗。

让我们考虑一下这种发布和自我消费的情况。

在SpringBoot中,针对每个事件,我需要声明:

  1. 在配置中路由键名(例如“ event.item.purchased”)
  2. 队列名称以在同一应用程序中使用该事件 (“ queue.event.item.purchased”)
  3. 匹配配置属性类字段或变量itemPurchasedRoutingKey或保留属性名称的代码中的常量(例如$ {event.item.purchased})
  4. 用于队列创建的
  5. bean(具有事件名称的名称),例如 itemPurchasedQueue
  6. bean用于绑定创建(名称具有 事件名称)和路由键名称。像itemPurchasedBinding是 用itemPurchasedQueue.bind(... itemPurchasedRoutingKey)构造
  7. RabbitListener用于事件,带有包含队列名称的注释 (无法在运行时中定义)

所以-在6个地方以一种或另一种形式提及“购买的商品”。 样板代码的数量只是让我丧命:) 如果有50个事件,则很容易出错-添加新事件时,请记住将其添加到6个位置。

理想情况下,对于每个事件,我想要:

  1. 在配置中指定路由键。可以通过添加通用前缀(特定于应用程序)在其上构建队列名称。
  2. 使用一些注释或替代的RabbitListener,它会自动声明队列(通过路由键+前缀),绑定到队列并侦听事件。

是否有一种优化方法? 我考虑过自定义批注,但是RabbitListener不喜欢动态队列名称,并且如果我在某个util方法中声明它们,spring boot无法找到用于队列和绑定的bean。 也许有一种方法可以在代码中声明所有这些东西,但我相信这不是Spring的方法:)

1 个答案:

答案 0 :(得分:0)

所以我最终使用了手工的bean声明,并对每个bean使用1个bind()方法

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script src="index.js" charset="utf-8"></script>
  </body>
</html>