移动会话错误

时间:2016-08-10 11:04:04

标签: sql-server service-broker

我正在尝试将服务代理会话转移到另一个群组会话。 代码是:

    declare @handle uniqueidentifier;
    declare @conversationGroup uniqueidentifier;

    begin dialog conversation @handle
        from service ConsolidatorService
        to service 'ConsolidatorTargetService'
        on contract  [//Gereon/Consolidator/ConsolidatorContract] 
        with encryption = off;


    get conversation group @conversationGroup from [ConsolidatorTargetQueue];
    if(@conversationGroup is not null)
        move conversation @handle to @conversationGroup;

    send on conversation @handle message type [//Gereon/Consolidator/GeBasicChangesMessage]
    (@MessageBody);

但SQL Server会向我返回错误 目标会话群组'60EEBC15-E75E-E611-80CC-00155D090304'无效。

我无法理解为什么get会话返回的group_conversation_id无效。

谢谢

1 个答案:

答案 0 :(得分:0)

您正在尝试将发起程序句柄移至目标服务上的组。移动对话只能在同一服务和队列中成功。

您的问题是尝试在接收端实现对话分组的常见问题。有两种替代模式可以实现您的目标:

  • 收到第一条消息后,您可以在目标上移动对话。这意味着您有一种方法可以将第一条消息与后续消息区分开来,对话将不会针对收到的第一条消息进行分组,并且由于并发接收方之间的会话组锁定而容易出现死锁。由于这些问题,我不推荐这种模式。
  • 您可以反转对话框方向。不是从ConsolidatorServiceConsolidatorTargetService开始对话,而是从ConsolidatorTargetServiceConsolidatorService 开始对话,并在BEGIN CONVERSATION本身中指定所需的组< / em>的。然后从目标发送消息到发起者。在启动器上接收此消息,然后将此启动器接收的句柄用于ConsolidatorService的后续发送。仅当您打算发送许多消息时才有意义。这种模式有效,但要正确实现有点棘手。

现在,100万美元的问题:为什么你想要在目标上分组对话吗?这有用的有效用途,但我想听听你的理由。