2016-08-10 40 views
0

我正尝试将服务代理对话移至另一个群组对话。 的代码是:移动会话错误

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无效。

谢谢

回答

0

您正试图将引发手柄移动到组上目标服务。移动对话只能在相同的服务和队列中成功。

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

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

现在,$ 1M的问题:为什么你想分组目标上的谈话吗?这是有用的,但我想听听你的推理。

+0

我想要做的是创建一个在队列上发送消息的触发器,另一方面存储过程接收它们。但我想要的是,消息在同一个conversation_group中关联。消息的顺序并不重要,但对话很重要,因为sp必须接收与相同correlation_group_id(sp一次只能接收1 msg)相关的所有消息。我试过这个[链接](http://stackoverflow.com/questions/38878407/ms-sql-server-2012-service-broker-begin-conversation-error?noredirect=1#comment65142517_38878407),但没有成功 – zappasan

+0

反向的方向应该适合你。 –

+0

好的,我已经尝试以这种方式编写“从ConsolidatorTarget到ConsolidatorTargetService”的开始对话框,并且它工作正常。但是,这听起来有点奇怪,以这种方式为发起者编写开始对话框,因为发起者服务不是目标。 – zappasan