消息正文必须包含与指定架构集合中架构一致的 XML。schema_collection_name 必须是现有 XML 架构集合的名称。


--约定(Contracts)
SQL Server 2005中没有提供用于添加或移除消息类型的ALTER CONTRACT语句,你必须保证创建约定正确无误。
更改消息类型列表的唯一方法是删除约定后在重建。
注:如果你没有指定消息类型和约定,将使用DEFAULT的消息类型和一个包含DEFAULT消息类型DEFAULT约定。


--队列(Queues)
队列是唯一实际存储数据的Services Broker对象,因此可以指定存储消息的文件组。
队列可以是 SELECT 语句的目标。但是,只能使用在 Service Broker 会话中运行的语句(如 SEND、RECEIVE 和 END CONVERSATION)来修改队列的内容。
队列不能是 INSERT、UPDATE、DELETE 或 TRUNCATE 语句的目标。
队列不能是临时对象。所以,以 # 开头的队列名称是无效的名称。
以STATUS 设置为OFF创建队列,可以先准备好服务的基础结构,然后再允许在队列中接收消息。
STATUS(激活)指定 Service Broker 是否激活该存储过程。当 STATUS = ON 时,如果当前运行的过程数小于 MAX_QUEUE_READERS,并且消息抵达队列的速度比存储过程接收消息的速度快,则队列将启动用 PROCEDURE_NAME 指定的存储过程。当 STATUS = OFF 时,队列不激活存储过程。如果未指定该子句,则默认为 ON。
MAX_QUEUE_READERS = max_readers 指定队列同时启动的激活存储过程的最大实例数。max_readers 的值必须是 0 到 32767 之间的数字。

注:设置RETENTION为ON 队列的status被设为0,表示它已经被应用程序接收和处理而且事务已经提交。并且消息不会被删除,
而是保留副本在队列中。这时队列很快会变得非常大,性能也会急剧下降。
但是你需要通过运行补偿事务回退长时间运行的业务事务,会很有用!

每个数据库只有一个sys.transmission_queue 视图,临时存放消息。
情景:目标位于不同的SQL Server实例中;目标队列无效,STATUS = OFF;
目标队列所在的数据库的ENABLE_BROKER 未设置;目的地未知。

--服务(Services)
服务是会话端点的名称.

注:创建会话时,发起会话的会话端点不检查发起方的服务列表。因此发起方的服务列表通常为空。
如果发起方的没有约定,一旦发起方的服务列表出现问题,你永远不知道。

--发起和结束会话
BEGIN DIALOG CONVERSATION  @Dialog
  FROM SERVICE    [//microsoft.com/ManufacturingService]
  TO SERVICE      ’//microsoft.com/InventoryService’
  ON CONTRACT     [//microsoft.com/Inventory/AddItemContract]
  WITH ENCRYPTION = OFF, LIFETIME = 3600;

O SERVICE参数是一个长度为256的字符串。target_service_name 的类型为 nvarchar(256)。Service Broker 会逐个字节进行比较,确保与 target_service_name 字符串匹配。
换言之,比较时将区分大小写,且不考虑当前的排序规则。
LIFETIME = dialog_lifetime
指定对话将保持打开状态的最长时间。为使对话成功完成,两个端点都必须在生存期内显式结束对话。dialog_lifetime 的值必须以秒为单位。生存期的类型为 int。
如果未指定 LIFETIME 子句,则对话的生存期为 int 数据类型的最大值。
ENCRYPTION 
将此对话发送和接收的消息向 Microsoft SQL Server 实例外发送时,是否必须对消息加密。
必须加密的对话是安全对话。如果 ENCRYPTION = ON,但未配置支持加密所需的证书,
则 Service Broker 将返回针对该会话的错误消息。ENCRYPTION = OFF 时,
如果为 target_service_name 配置了远程服务绑定,则使用加密 ;否则,发送消息时不加密。
如果未使用此子句,则默认值为 ON。