ActiveMQ - Когда закрывать сессию? - PullRequest
0 голосов
/ 20 марта 2019

Я перевожу свое Java-приложение на .NET Core.В Java я использовал Spring Boot и не особо заботился об открытии и закрытии сессий / потребителей / и т. Д. (Не знаю, должен ли я хотя бы n_n ').Миграция на .NET Мне нужно проделать большую работу по управлению этими объектами.

Мой сценарий прост: при запуске приложения я запускаю Connection с удаленным брокером, Session,Consumer и зарегистрируйте MessageListener для обработки сообщений.

Проблема в том, что мой пользователь хочет иметь возможность активировать / деактивировать прослушиватель и изменять имя очереди в любое время.Правильно, я только кеширую объект Connection, поэтому после получения "события деактивации слушателя" или "события изменения имени очереди" я могу просто позвонить connection.Dispose() или connection.Close() и перезапустить весь процесс создания заново.Мои сомнения:

  1. Являются ли .Close() и .Dispose взаимозаменяемыми?Или мне нужно вызвать оба?
  2. Достаточно ли закрыть только объект Connection?Мой сеанс и потребитель тоже умрут или я должен держать их в кэше и закрывать их вообще?
  3. Если вышеприведенного достаточно, есть ли какое-то преимущество в "микроуправлении" этим?Например, получая «событие деактивации слушателя», я мог, возможно, только Stop() установить соединение вместо того, чтобы убить его и создать его заново.

Вот как я запускаю моего слушателя:

_logger.LogWarning($"Starting ActiveMQ listener [{listener.Id}] ({ActiveMqHost})...");
_connection = _connectionFactory.CreateConnection(ActiveMqIntegrationsManager.ActiveMqUser, ActiveMqIntegrationsManager.ActiveMqPassword);
_connection.ClientId = $"{listener.Id}";

_connection.AcknowledgementMode = AcknowledgementMode.AutoAcknowledge;

var session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
var queue = session.GetQueue(queueName);
var consumer = session.CreateConsumer(queue, queueSelector);

consumer.Listener += handler.OnReceive;
_connection.ConnectionInterruptedListener += handler.OnInterrupt;
_connection.ExceptionListener += handler.OnException;
_connection.ConnectionResumedListener += handler.OnResume;
_connection.Start();
_logger.LogWarning($"[{listener.Id}] started successfully!");

1 Ответ

0 голосов
/ 21 марта 2019

Вы можете обмениваться вызовами close и dispose или просто использовать close и позволить вызову среды выполнения .NET, хотя на самом деле мало что происходит, когда закрытый ресурс располагается в клиенте NMS.

Вы можете закрыть экземпляр Connection, и все его клиентские ресурсы будут закрыты неявно, поэтому вам не нужно будет управлять ими микро. Поскольку вы заявляете, что вам нужно перейти к прослушиванию в другой очереди, вам нужно закрыть экземпляр-получатель и создать новый. В этом случае вам не нужно закрывать Сессию или Соединение, так как вы просто развернетесь и создадите новое Соединение и, таким образом, новый Сеанс для управления новым MessageConsumer, который вы затем создадите. Однако, если вы хотите остановить доставку только на некоторое время, простая остановка / запуск соединения может сделать это.

Все зависит от количества смартов, которые вы хотите использовать в своем приложении. Создание и закрытие соединений значительно снижают производительность, поэтому, если вы сможете управлять им, то ваше приложение будет для нас тем лучше, что не нужно будет его разламывать и перестраивать без необходимости.

...