我可以在执行时更改弹簧参数吗?

Mav*_*k94 5 java spring rabbitmq spring-rabbitmq

我有一个使用动态消费者的应用程序.我正在使用带有RabbitMQ的Spring Framework.

我有像concurrentConsumers和的参数maxConcurrentConsumers.

这是一个例子:

@Bean 
public SimpleMessageListenerContainer container(ConnectionFactory connection) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();

    container.setMaxConcurrentConsumers(8);
    container.setConcurrentConsumers(1);

    return container;
}
Run Code Online (Sandbox Code Playgroud)

我可以在应用程序运行时更改值吗?例如,如果我想要5 maxConcurrentConsumers而不是8,我可以在应用程序运行时更改终端上的值或类似的值吗?

And*_*lko 1

您的 bean 是单例,并且应该是无状态的(至少是不可变的或有效无状态的)以确保线程安全性和正确性。

通常,您应该对所有有状态 Bean 使用原型作用域,对无状态 Bean 使用单例作用域。

Spring文档

有时,创建 bean 的成本相当高,因此更合理的做法是构造一个实例一次,然后保证对该对象所做的所有可能的更改都将以安全且正确的方式渗透到其所有使用者。

我建议构建一个简单的事件驱动机制。

  • aMessageListenerContainerEvent extends ApplicationEvent代表对 bean 所做的更改MessageListenerContainer
  • 一个MessageListenerContainerChanger implements ApplicationListener<MessageListenerContainerEvent>谁是修改 bean 状态的唯一侦听器,并保证一切正常工作;
  • 其他使用该 bean 并有兴趣保持其最新状态的听众。没有必要将更改发送给 Bean 使用者,您可以只通知他们而不发送任何消息。对于他们来说,这意味着他们在本地使用的 bean 的某些属性可能已经过时了。
  • 发布者可以是 HTTP 端点,或者@ShellMethod.

它可能看起来太复杂,你总是可以将其简化为

// somewhere in your code
synchronized(bean) {
    bean.setConcurrentConsumers(10);
}
Run Code Online (Sandbox Code Playgroud)

但请记住此片段传播的正确性。