gpt4 book ai didi

spring - Spring AMQP中交换和队列的声明

转载 作者:行者123 更新时间:2023-12-05 00:40:14 25 4
gpt4 key购买 nike

我正在使用 RabbitMQ 并尝试将我当前的 native java 实现重构为使用 Spring AMQP 抽象。

使用 Spring 库声明交换、队列及其绑定(bind)是通过 AMQPAdmin 接口(interface)进行的,但我不确定何时应该进行这种配置。

我有一个使用 Rabbit 生成消息的 Web 应用程序。另一个使用这些消息的应用程序。令人震惊:)

但是什么时候显示交换/队列的声明?

我是否将 AMQPAdmin 与 Web 应用程序一起部署并在生产者和消费者的构造函数中进行交换/队列管理?

这些东西的声明是一次性的,broken 不需要再次知道它们,所以任何代码在后续执行中都是 NOOP。

我是否要创建一个单独的应用程序来管理代理?

目前的想法或最佳实践是什么?

最佳答案

似乎很少有人在使用 Spring 的 AMQP M1 版本,所以我将用我所做的来回答我自己的问题。

在生产者的构造函数中,我声明了交换。然后在 RabbitTemplate 上设置交换。我还将 RabbitTemplate 上的路由键设置为队列名称,但这不是必需的,但这是我将使用的路由。

@Service("userService")
public class UserService {
private final RabbitTemplate rabbitTemplate;

@Autowired
public UserService(final RabbitAdmin rabbitAdmin,
final Exchange exchange,
final Queue queue,
@Qualifier("appRabbitTemplate") final RabbitTemplate rabbitTemplate) {

this.rabbitTemplate = rabbitTemplate;

rabbitAdmin.declareExchange(exchange);
rabbitTemplate.setExchange(exchange.getName());
rabbitTemplate.setRoutingKey(queue.getName());
}


public void createAccount(final UserAccount userAccount) {
rabbitTemplate.convertAndSend("Hello message sent at " + new DateTime());
}
}

在消费者的构造函数中,我声明了队列并创建了绑定(bind)。
public class Consumer implements ChannelAwareMessageListener<Message> {

public Consumer(final RabbitAdmin rabbitAdmin, final Exchange exchange, final Queue queue) {
rabbitAdmin.declareQueue(queue);

rabbitAdmin.declareBinding(BindingBuilder.from(queue).to((DirectExchange) exchange).withQueueName());
}

@Override
public void onMessage(Message message, Channel channel) throws Exception {

System.out.println(new String(message.getBody()));

channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
}
}

尽管构造函数可能会运行多次,但 RabbitMQ 只声明了一次交换、队列和绑定(bind)。

如果您需要这个小示例项目的全部源代码,请询问,我会在某个地方为您提供。

关于spring - Spring AMQP中交换和队列的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3872643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com