ActiveMQ-何时关闭会话?

时间:2019-03-20 19:13:01

标签: c# .net-core activemq nms

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

我的情况很简单: 启动我的应用程序后,我使用远程代理ConnectionSession和远程代理启动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 :(得分:0)

您可以交换close和dispose调用,也可以只使用close并让.NET运行时调用dispose,尽管在NMS客户端中放置关闭的资源时并不会发生什么。

您可以关闭Connection实例,并且其所有客户端资源都将隐式关闭,因此您无需进行微管理。假设您要声明要更改为侦听其他队列,那么您确实需要关闭使用者实例并创建一个新实例。在这种情况下,您不需要关闭Session或Connection,因为您将转过身来创建一个新的Connection,从而创建一个新的Session来管理随后将要创建的新MessageConsumer。但是,如果您只想停止传送一段时间,那么简单的连接停止/启动就可以完成。

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