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

RabbitListener注释队列名称(按配置属性)

于鸿博
2023-03-14

我已经通过应用程序配置了我的兔子属性。yaml和spring配置属性。因此,在配置交换、队列和绑定时,可以使用属性的getter

@Bean Binding binding(Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(properties.getQueue());
}

@Bean Queue queue() {
    return new Queue(properties.getQueue(), true);
}

@Bean TopicExchange exchange() {
    return new TopicExchange(properties.getExchange());
}

然而,当我配置@RabbitListener从队列登录消息时,我必须使用完整的属性名称,如

 @RabbitListener(queues = "${some.long.path.to.the.queue.name}") 
 public void onMessage(
            final Message message, final Channel channel) throws Exception {
       log.info("receiving message: {}#{}", message, channel);
    }

我希望避免这种容易出错的硬编码字符串,并参考configurationProperties bean,如:

@RabbitListener(queues = "${properties.getQueue()}") 

我曾经遇到过一个与@EventListener类似的问题,在这里使用bean引用“@bean.method()”很有帮助,但它在这里不起作用,bean表达式只是被解释为队列名称,这会失败,因为队列名称为“@bean….”不存在。

是否可以将ConfigurationProperty bean用于RabbitListener队列配置?

共有3个答案

魏浩广
2023-03-14
@RabbitListener(queues = "#{myQueue.name}") 
白光耀
2023-03-14

通过采纳大卫·迪尔(DavidDiehl)的建议,使用bean和SpEL,我终于能够完成我们都想要做的事情;但是,请改用MyRabbitProperties本身。我删除了config类中的@EnableConfigurationProperties(MyRabbitProperties.class),并以标准方式注册了bean:

@Configuration
//@EnableConfigurationProperties(RabbitProperties.class)
@EnableRabbit
public class RabbitConfig {
  //private final MyRabbitProperties myRabbitProperties;

  //@Autowired
  //public RabbitConfig(MyRabbitProperties myRabbitProperties) {
    //this.myRabbitProperties = myRabbitProperties;
  //}      

  @Bean 
  public TopicExchange myExchange(MyRabbitProperties myRabbitProperties) {
    return new TopicExchange(myRabbitProperties.getExchange());
  }

  @Bean
  public Queue myQueueBean(MyRabbitProperties myRabbitProperties) {
    return new Queue(myRabbitProperties.getQueue(), true);
  }

  @Bean 
  public Binding binding(Queue myQueueBean, TopicExchange myExchange, MyRabbitProperties myRabbitProperties) {
    return BindingBuilder.bind(myQueueBean).to(myExchange).with(myRabbitProperties.getRoutingKey());
  }

  @Bean
  public MyRabbitProperties myRabbitProperties() {
    return new MyRabbitProperties();
  }
}

从那里,您可以访问该字段的get方法:

@Component
public class RabbitQueueListenerClass {

  @RabbitListener(queues = "#{myRabbitProperties.getQueue()}") 
  public void processMessage(Message message) {

  }
}
虞修平
2023-03-14

这样的方法对我很有效,我只是用了豆子和豆子。

@Autowired
Queue queue;

@RabbitListener(queues = "#{queue.getName()}")
 类似资料:
  • 我有一个关于Spring注释的问题。在我的(学习)项目中,我定义了两个类,另一个类有两个属性,每种类型一个。为了生成一个错误,我在XML中定义了两个相同类类型的beans,并且在setter方法中使用了@Autowired注释。大概是这样的: 在主类中,我获取此 Bean 的应用程序上下文的实例,并打印覆盖 toString 方法的属性的内容,这是一个简单的测试。我已经读到Spring自动连线注释

  • 我知道有可能通过名字得到一个类,使用 是否可以通过名称检索注释?我尝试了这个: 然后将c转换为

  • 我正在使用AmazonSQS&Spring Boot(spring-cloud-aws-messaging)。我已经配置了一个消息侦听器来接收来自带有注释@SQSListener的队列的消息。 这是一个非常简单的方法,但是我没有找到从配置文件加载队列名的方法,因为我有不同的环境。在这方面有什么想法吗?

  • 我当前将我的rabbit listener注释设置为: @RabbitListener(queues=“my queue”) 是否无法从我的yaml文件中提取队列名称。我想这样做的原因是,我可以将队列更改为集成测试的测试队列,只需更改yaml文件中的队列名称即可。看来注释必须接受常量字符串,有什么办法吗?谢谢

  • 目前,我有以下问题:外部RabbitMQ远程服务器需要我首先发送一条异步回复登录消息,然后发送一条广播队列broadcastQueue。MYUSER\u 123由此远程服务器创建。由此,我想通过@RabbitListener注释来使用,这在代码示例中可以看到。但我有一个错误,你可以看到下面。 在调试过程中,我注意到在我的代码中执行登录之前,容器启动了这个监听器,因此在连接这个广播队列时会遭到拒绝。

  • 大家好,我想在将Pojo序列化为json时删除属性名。我有以下课程 SubFieldItems类: 当我序列化时,json输出是 但我希望子字段的值不带属性名,如下所示: 我可以使用什么Jackson注释,我已经尝试过在toString方法中使用@JsonValue来强制执行,就像在评论中一样,但是我一直得到奇怪的结果。请提供任何帮助,谢谢。谢谢