Могу ли я изменить параметры пружины при исполнении? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть приложение, которое использует динамических потребителей.Я использую Spring Framework с RabbitMQ.

У меня есть такие параметры, как concurrentConsumers и maxConcurrentConsumers.

Это пример:

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

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

    return container;
}

Могу ли я изменитьзначения при запуске приложения?Например, если я хочу 5 maxConcurrentConsumers вместо 8, могу ли я изменить значение на терминале или что-то подобное во время работы приложения?

1 Ответ

0 голосов
/ 12 декабря 2018

Ваш бин является одноэлементным и должен быть без состояния (по крайней мере, неизменяемым или эффективно без состояния) для обеспечения безопасности потока и правильности.

Как правило, вы должны использовать область действия прототипа для всехbean-компоненты с состоянием и единичная область действия для bean-компонентов без состояния.

Spring-документация

Иногда создание bean-компонента довольно дорого,поэтому более разумно создать экземпляр один раз, а затем гарантировать, что все возможные изменения, внесенные в этот объект, будут пронизаны безопасным и корректным образом для всех его потребителей.

Я советую создать простой механизм, управляемый событиями.

Существует

  • a MessageListenerContainerEvent extends ApplicationEvent, который представляет изменения, внесенные в bean-компонент MessageListenerContainer;
  • a MessageListenerContainerChanger implements ApplicationListener<MessageListenerContainerEvent>, который является одним слушателем, который изменяетсостояние бина и гарантирует, что все работает должным образом;
  • другие слушатели, которые являются классом, которые используют бин и заинтересованы в его обновлении.Не обязательно отправлять изменения потребителям бобов, вы можете просто уведомить их без сообщения.Для них это означает, что некоторые свойства компонента, который они используют локально, могут быть устаревшими.
  • издатель, который может быть конечной точкой HTTP, или @ShellMethod.

Это может показаться слишком сложным, вы всегда можете упростить его до

// somewhere in your code
synchronized(bean) {
    bean.setConcurrentConsumers(10);
}

, но имейте в виду правильность этого фрагмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...