我想实现一个功能,让属于特定群组的用户可以在群组内发布内容,并且该群组的所有成员都会收到通知。
为了实现这个目标,我研究了AMQP和RabbitMQ,现在我想应用它。据我了解,在 AMQP 中,有一个消息代理,其中包含交换器、队列和绑定等组件。当生产者创建消息时,它被发送到交换器,交换器可以根据消息路由策略或根据消息头和密钥将消息直接路由到队列。一旦消息进入队列,它就会被传递给连接到该队列的消费者。
现在,考虑到我想要实现的部分,我意识到在形成组时应该为每个组创建一个消息队列,以便可以传递特定于组的通知。然而,在研究如何在Spring Boot中使用
rabbitTemplate
和rabbitListener
实现AMQP时,我发现无法动态设置所有队列名称和绑定键名称;它们似乎需要预定义的常量字符串。我打算动态使用组生成的主键 (PK) 作为绑定键和队列名称的一部分来区分组。不过,由于我需要在执行逻辑之前用注解或者Spring Bean设置队列名称,所以我不知道如何实现动态配置。
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = , durable = "true"),
exchange = @Exchange(value = "#{rabbitmqNameProvider.buildQueueName}", type = "direct")
))
public void consumeMessage()
这是我关心的部分。在另一个问题中,我听说使用“魔豆”可以动态设置名称,但我找不到一种方法来传递动态配置的id。
这是魔豆部分
@Component
public class RabbitmqNameProvider {
private final ProjectRepository projectRepository;
@Autowired
public RabbitmqNameProvider(ProjectRepository projectRepository) {
this.projectRepository = projectRepository;
}
@Transactional(readOnly = true)
public String buildQueueName(Long id) {
String projectName = projectRepository.findTitleById(id);
return "project."+projectName+".queue";
}
}
实际上我什至不确定我是否可以在组件中使用 @Transactional 和 @Autowired 注释。
@Autowired
private AmqpAdmin amqpAdmin;
public void declareQueueForGroup(Group group) {
String queueName = "group.queue." + group.getId();
Queue queue = new Queue(queueName, true, false, false);
amqpAdmin.declareQueue(queue);
}
或者我是否必须实现另一个管理服务或 API 才能像上面那样应用它? 想法太多,无法好好整理...
关键问题是,如何实现我在问题第一部分中描述的功能。 感谢您阅读我的长问题。