我正在将我的 Java 应用程序迁移到 .NET Core。在Java中,我使用的是Spring Boot并且不太关心处理会话/消费者/等的打开和关闭(不知道我是否应该n_n')。迁移到 .NET 我不得不在管理这些对象方面做更多的工作。
我的场景很简单:在启动我的应用程序时,我Connection
使用远程代理启动 a , a Session
, aConsumer
并注册 aMessageListener
来处理消息。
问题是我的用户希望能够激活/停用侦听器并随时更改队列名称。知道我只是在缓存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!");