当前位置: 首页 > 知识库问答 >
问题:

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

危烨煜
2023-03-14

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

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

或者有一种方法可以Spring加载所有我的队列配置类,然后只使用如下所示的对象:

    // 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. 那么,如何在不执行新的AnnotationConfigApplicationContext()每次的情况下获取确切队列的amqpTemplate呢?
  2. 每次请求到达我的服务时都做新的AnnotationConfigApplicationContext有什么害处?[我想为每个请求创建一个新对象不是一个好主意]

共有1个答案

鲁龙野
2023-03-14

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

您可以将多个连接工厂(每个rabbit主机一个)添加到根(或web)上下文中,然后将路由连接工厂与SendConnectionFactorySelectoreXPression一起使用,根据发送的消息选择合适的主机。

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

try {
    SimpleResourceHolder.bind(routingCF, keyForThisMessage);
    rabbitTemplate.convertAndSend(message);
}
finally {
    SimpleResourceHolder.unbind(routingCF);
}
<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;
    }

});

这里有一个完整的测试用例。

 类似资料:
  • 在我们的应用程序中,我们使用RabbitMQ和spring-amqp(1.4.3.发行版)。我们那里排了两个队。它们都配置了TTL(60000和100000)。当我们启动应用程序时,它会给出以下错误: [pool-4-thread-1]错误org.springFramework.amqp.rabbit.connection.cachingConnectionFactory-通道关闭:通道错误;协议

  • 我有一个Spring Boot应用程序,希望从多个AWS SQS队列接收消息。这些队列都有自己的凭据(遗憾的是,我对此无能为力)。这些凭据都不能访问其他队列之一,它们都仅限于一个队列。 因为只有一个队列和凭证,所以很简单。我只需要提供作为AWSCredentialsProvider的凭据,并用启用SQS注释我的方法 但我不知道如何使用多个凭据来执行此操作。 SqsListener注释无法提供凭据、

  • 我刚刚开始使用RabbitMQ和AMQP。 我有一个消息队列 我有多个消费者,我想用相同的消息做不同的事情。 RabbitMQ的大部分文档似乎都集中在循环(round-robin)上,即单个消息由单个消费者使用,负载在每个消费者之间分散。这的确是我目击的行为。 例如:生产者只有一个队列,每2秒发送一次消息: 这里有一个消费者: 如果我启动消费者两次,我可以看到每个消费者都在以循环行为消费交替消息。

  • 问题内容: 我一般只是开始使用RabbitMQ和AMQP。 我有一条消息队列 我有多个消费者,我想用 同一条消息 做不同的事情。 RabbitMQ的大多数文档似乎都集中在循环上,即单个消息由单个使用者使用,而负载则分散在每个使用者之间。我确实是这种行为。 例如:生产者只有一个队列,每2秒发送一次消息: 这是一个消费者: 如果我启动使用者两次,则 可以看到每个使用者都以循环方式使用替代消息。 例如,

  • 所以我的问题是,当我用profile只运行applicaiton时,Spring是否合并了这两个profile,并且我可以在应用程序中看到和?

  • 我使用SpringBoot,有两个非常相似的服务,我想在。 配置大致如下所示: 是否可以创建一个带有注释的类,并在注入点设置前缀? 例如。 然后在服务本身: 不幸的是,我还没有在留档中找到关于这样一个功能的东西...非常感谢您的帮助!