停止和启动 Service Broker 应用程序
有时可能需要暂时停止 Service Broker 应用程序。例如,可能需要停止繁忙的应用程序为队列安装激活存储过程的更新版本。虽然可以在不停止应用程序的情况下更改队列,但是当前正在运行的激活存储过程的副本可能会一直有需处理的消息,因此可能永远不会退出。在这种情况下,停止队列会使正在运行的存储过程立即退出。再次启动该服务时,Service Broker 会启动已更新的激活存储过程。
本部分中的信息是有关出于维护原因而暂时停止应用程序的。有关从数据库中永久地删除服务的信息,请参阅卸载 Service Broker 应用程序。
若要暂时停止服务,请将应用程序所用队列的状态改为 OFF。当队列的状态为 OFF 时,该队列不可用于接收操作,这将有效地停止应用程序。此时,Service Broker 不向该队列传递新消息,也不允许应用程序从该队列接收消息。当应用程序试图从不可用的队列接收消息时,应用程序会收到一个 Transact-SQL 错误。无论会话所使用的队列是否可用,应用程序都可随时对会话调用 END CONVERSATION。但是,在队列可用之前,Service Broker 不会向远程服务传递结束对话消息。
当消息到达已停止的队列时,Service Broker 会将该消息保存在数据库的传输队列中,直到目标队列可用为止。Service Broker 不认为已停止的队列收到消息是个错误,也不会通知发送者。队列可用后,Service Broker 会将传输队列中的消息传递给服务队列。此传递使用普通的消息重试逻辑。传输队列中的消息被标记为延迟传递 (DELAYED),并会定期重试。无论消息是源自与队列相同的实例还是来自网络,Service Broker 都将消息保存在传输队列中并延迟传递。
停止队列不会为队列中的消息重置会话计时器或对话生存期计时器。如果队列停止期间其中一个计时器到期,则该队列再次启动时,Service Broker 将生成相应的消息。
若要重新启动应用程序,请将应用程序所用队列的状态改为 ON。这将启动该队列。如果已为队列指定了激活存储过程并且队列中包含消息,则队列启动后,Service Broker 会立即启动激活存储过程。由于现在队列已可用,因此 Service Broker 还会为队列停止期间到期的会话计时器和对话生存期计时器生成消息。对于不使用激活功能的应用程序,请使用为该应用程序定义的启动过程重新启动该应用程序。