ActiveMQ - 何时关闭会话?

ActiveMQ - When to close session?

我正在将我的 Java 应用程序迁移到 .NET Core。 在 Java 中,我使用的是 Spring Boot,并不太关心处理会话/消费者/等的打开和关闭(不知道我是否应该 n_n')。 迁移到 .NET 后,我不得不更加努力地管理这些对象。

我的场景很简单: 启动我的应用程序后,我启动了一个 Connection 和一个远程代理、一个 Session、一个 Consumer 并注册了一个 MessageListener 来处理消息。

问题是我的用户希望能够 active/deactive 侦听器并随时更改队列名称。正确知道我只缓存 Connection 对象所以在收到 "deactivate listener event" 或 "change queue name event" 我可以简单地调用 connection.Dispose()connection.Close() 并重新启动所有再次创造的过程。我的疑惑是:

  1. .Close().Dispose 可以互换吗?还是我需要同时调用两者?
  2. 只关闭 Connection 对象就够了吗?我的会话和消费者是否也会死亡,或者我应该将它们缓存起来并完全关闭?
  3. 如果以上都够了,那么"micro-managing"这个有什么优势吗?例如,当收到 "deactivate listener event" 时,我可能只能 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!");

您可以互换关闭和处理调用,或者只使用关闭并让 .NET 运行时调用处理,尽管在 NMS 客户端中处理已关闭的资源时并没有发生太多事情。

您可以关闭一个 Connection 实例,它的所有客户端资源都将隐式关闭,因此您不需要对它们进行微观管理。鉴于您声明需要更改为侦听不同的队列,那么您确实需要关闭消费者实例并创建一个新实例。在这种情况下,您不需要关闭 Session 或 Connection,因为您只需转身创建一个新的 Connection,从而创建一个新的 Session 来管理您将要创建的新 MessageConsumer。但是,如果您只想停止传送一段时间,那么一个简单的连接停止/启动就可以实现。

这一切都取决于您要在应用程序中使用的智能数量。创建和关闭连接会产生显着的性能开销,因此如果您可以管理它,那么您的应用程序我们就更好了,因为不需要拆除和重建不必要的。