我正在将Java应用程序迁移到.NET Core。 在Java中,我使用的是Spring Boot,并不关心处理会话/使用者/等等的打开和关闭(不知道我是否应该使用n_n')。 迁移到.NET时,我必须在管理这些对象方面做更多的工作。
我的情况很简单:
启动我的应用程序后,我使用远程代理Connection
,Session
和远程代理启动Consumer
,并注册MessageListener
来处理消息。
问题是我的用户希望能够激活/停用监听器并在需要时更改队列名称。知道,我只缓存Connection
对象,因此在收到“停用监听器事件”或“更改队列名称事件”后,我可以简单地调用connection.Dispose()
或connection.Close()
并重新启动所有对象重新创建的过程。我的疑问是:
.Close()
和.Dispose
是否可以互换?还是我都需要打个电话?Connection
对象是否足够?我的会话和消费者也会死掉还是应该将它们缓存并完全关闭?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!");
答案 0 :(得分:0)
您可以交换close和dispose调用,也可以只使用close并让.NET运行时调用dispose,尽管在NMS客户端中放置关闭的资源时并不会发生什么。
您可以关闭Connection实例,并且其所有客户端资源都将隐式关闭,因此您无需进行微管理。假设您要声明要更改为侦听其他队列,那么您确实需要关闭使用者实例并创建一个新实例。在这种情况下,您不需要关闭Session或Connection,因为您将转过身来创建一个新的Connection,从而创建一个新的Session来管理随后将要创建的新MessageConsumer。但是,如果您只想停止传送一段时间,那么简单的连接停止/启动就可以完成。
这一切都取决于您要在应用程序中使用的智能设备数量。创建和关闭连接会产生很大的性能开销,因此,如果您可以管理它,那么您的应用程序就更好了,因为它不需要拆除和重建。