如果消息是由触发器发送的,在会话 FROM SERVICE 参数中设置什么?

What to set in conversation FROM SERVICE argument if message is sent by trigger?

我有将消息发送到 Service Broker 服务的数据库触发器。要发送消息,必须首先创建对话,因为这就是 Service Broker 的工作方式(消息在服务之间的对话中发送)。我读到应该重用对话,因为每次创建新对话都会对性能产生不良影响,并且对话数量会增加很多。无论我是否会重复使用对话,我都必须至少创建第一个对话。开始对话具有以下语法:

BEGIN DIALOG [ CONVERSATION ] @dialog_handle  
   FROM SERVICE initiator_service_name  
   TO SERVICE 'target_service_name'  
       [ , { 'service_broker_guid' | 'CURRENT DATABASE' }]   
   [ ON CONTRACT contract_name ]  
   [ WITH  
   [  { RELATED_CONVERSATION = related_conversation_handle   
      | RELATED_CONVERSATION_GROUP = related_conversation_group_id } ]   
   [ [ , ] LIFETIME = dialog_lifetime ]   
   [ [ , ] ENCRYPTION = { ON | OFF }  ] ]  
[ ; ]  

我不知道应该在 FROM SERVICE 参数中设置什么。通常,Service Broker 对话是双向的。我想从触发器向服务发送消息,我不想得到任何反馈,我只想向一个方向发送消息。我在 FROM SERVICE 参数中设置了目标服务并且它有效但我不确定这是否是好的做法。我是否应该创建额外的服务并将其设置在 FROM SERVICE 参数中以用于从我的触发器中使用的对话?如果 EndDialog 消息到达,也许这个服务应该有结束对话的激活过程?

我不期望目标服务有任何响应是一种好习惯吗?我知道我可以获得一些管理消息,例如 http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog or http://schemas.microsoft.com/SQL/ServiceBroker/Error。我的印象是 Service Broker 强制使用双向对话。

Service Broker 需要为启动器和目标提供服务。您的触发器是 from initiator 服务,因此您应该为其创建一个服务和队列。但是触发器不需要实现从启动器队列接收消息。

您可以有一个单独的进程(可能是一个预定的批处理进程)来监视发起者队列中的意外错误和结束对话消息,并且可能在需要时开始一个新的长-运行对话。