gpt4 book ai didi

java - spring-amqp 具有不同 routingKey 的多个队列

转载 作者:行者123 更新时间:2023-11-29 05:09:31 30 4
gpt4 key购买 nike

我最近开始学习 Spring 和 spring-amqp,所以这个问题可能看起来很基础,所以请原谅。

我有多个队列,它们位于不同的主机上并且具有不同的 QueueName、RoutingKey、vhost、用户、密码。我正在为这些队列编写发布逻辑,但无法决定我是否应该为每个队列配置一个配置类,还是可以用 XML 来完成。

创建类以包含有关队列的所有信息(主机、虚拟主机、用户名等)的方法工作正常,如 this example 中所述。 .我创建了一个@Configuration 类并为该队列定义了所有bean。但是接下来我需要做

ApplicationContext context = new AnnotationConfigApplicationContext(MyQueueConfiguration.class);
AmqpTemplate amqpTemplate = context.getBean(AmqpTemplate.class);
amqpTemplate.convertAndSend("Hello World!!");

所以我的要求是:

  1. 因为我有很多队列需要在应用程序启动时实例化,所以一旦 tomcat 启动,就应该建立到队列/rabbit 集群的连接/ channel 。
  2. 然后,只要我的应用程序收到 POST 请求,我就需要根据 POST 参数将消息发布到队列之一。

所以对于每个队列我总是需要做:

ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);

或者有没有办法让 Spring 加载我所有的 Queue 配置类,然后像这样使用对象:

    // calling code when I get a POST request
MyQueueConfigurationClass.publishMessage(payload, queueName);

// The implementation code
public boolean publishMessage(String payload, String queueName){

// Get Bean for the **queueName** somehow
AmqpTemplate amqpTemplate = context.getBean(AmqpTemplate.class);
// Use the bean to send the message
amqpTemplate.convertAndSend(payload);

}
  1. 那么,我如何才能在不每次都执行 new AnnotationConfigApplicationContext() 的情况下获取确切队列的 amqpTemplate?
  2. 每次请求到达我的服务时都执行新的 AnnotationConfigApplicationContext 有什么危害? [我猜测为每个请求创建一个新对象不是一个好主意]

最佳答案

你不应该每次都创建一个新的上下文;这是非常浪费的。

您可以将多个连接工厂(每个兔子主机一个)添加到根(或网络)上下文,然后使用 Routing Connection FactorysendConnectionFactorySelectorExpression 一起根据您发送的消息选择合适的主机。

或者,您可以简单地为每个服务器连接一个不同的RabbitTemplate

编辑:

要使用 SimpleRoutingConnectionFactory,请执行类似...

try {
SimpleResourceHolder.bind(routingCF, keyForThisMessage);
rabbitTemplate.convertAndSend(message);
}
finally {
SimpleResourceHolder.unbind(routingCF);
}

(这将适用于未修改的 RabbitTemplate)或...

<rabbit:template id="routingTemplate"
connection-factory="rcf"
send-connection-factory-selector-expression="messageProperties.headers['cfKey']" />

<bean id="rcf" class="org.springframework.amqp.rabbit.connection.SimpleRoutingConnectionFactory">
<property name="targetConnectionFactories">
<map>
<entry key="foo" value-ref="cf1"/>
<entry key="bar" value-ref="cf2"/>
</map>
</property>
<property name="defaultTargetConnectionFactory" ref="defaultCF"/>
</bean>

……然后……

this.routingTemplate.convertAndSend("exchange", "routingKey", "xyz", new MessagePostProcessor() {

@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setHeader("cfKey", "foo");
return message;
}

});

有一个完整的测试用例here .

关于java - spring-amqp 具有不同 routingKey 的多个队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133902/

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