0

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

我的场景很简单:在启动我的应用程序时,我Connection使用远程代理启动 a , a Session, aConsumer并注册 aMessageListener来处理消息。

问题是我的用户希望能够激活/停用侦听器并随时更改队列名称。知道我只是在缓存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!");
4

1 回答 1

0

您可以交换 close 和 dispose 调用,或者只使用 close 并让 .NET 运行时调用 dispose 尽管在 NMS 客户端中释放关闭的资源时不会发生太多事情。

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

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

于 2019-03-20T22:30:12.020 回答