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()
并重新启动所有再次创造的过程。我的疑惑是:
.Close()
和 .Dispose
可以互换吗?还是我需要同时调用两者?
- 只关闭
Connection
对象就够了吗?我的会话和消费者是否也会死亡,或者我应该将它们缓存起来并完全关闭?
- 如果以上都够了,那么"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。但是,如果您只想停止传送一段时间,那么一个简单的连接停止/启动就可以实现。
这一切都取决于您要在应用程序中使用的智能数量。创建和关闭连接会产生显着的性能开销,因此如果您可以管理它,那么您的应用程序我们就更好了,因为不需要拆除和重建不必要的。
我正在将我的 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()
并重新启动所有再次创造的过程。我的疑惑是:
.Close()
和.Dispose
可以互换吗?还是我需要同时调用两者?- 只关闭
Connection
对象就够了吗?我的会话和消费者是否也会死亡,或者我应该将它们缓存起来并完全关闭? - 如果以上都够了,那么"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。但是,如果您只想停止传送一段时间,那么一个简单的连接停止/启动就可以实现。
这一切都取决于您要在应用程序中使用的智能数量。创建和关闭连接会产生显着的性能开销,因此如果您可以管理它,那么您的应用程序我们就更好了,因为不需要拆除和重建不必要的。