0

我有一个 SSBS 队列和一个主进程向M队列发送消息。有N子流程会一一获取消息并进行处理。处理完所有消息后,子进程将退出。现在我正在做以下事情,

方法一:

发送消息后,主进程发送N“EndOfData” M。但是它不能很好地工作,因为某些子流程可能会收到多个“EndOfData”消息,因此某些子流程将永远不会收到该消息。

方法2:(扩展方法1)

为每个子流程分配一个 ID,同时在“EndOfData”消息中嵌入一个 ID。如果消息中的 ID 与其 ID 不匹配,则子流程回滚。但是,由于回滚过多并且队列被禁用,它会导致“平衡消息”问题。

begin tran
begin try
    WAITFOR(
        RECEIVE TOP(1)
            @MessageType = message_type_name,
            @MessageBody = CAST(message_body AS xml)
        FROM
            TargetQueue
    ) , TIMEOUT 1000
    if @MessageType = 'EndOfData' and 
       @MessageBody.value('(//ID/text())[1]', 'int') <> @ID
    BEGIN 
        rollback tran
        waitfor delay '00:00:02'
    END 

有没有好的方法来实现它?

更新:
子流程将执行以下步骤。

  1. 收到一条消息
  2. 如果“工作”,
    1. 处理消息(可能需要几分钟)
    2. 向队列发送“信息”消息以通知主进程消息已被处理
  3. 如果 "EndOfData",
    1. 向主进程发送消息“退出”
    2. 收到https://..../EndDialog“Exist”消息并退出
  4. 如果https://.../EndDialog是 2.2 发送的消息,直接接收
4

2 回答 2

1

另一种方法,假设N = 3

  1. 发送“EndOfData”类型的消息,其中包含3.
  2. 3 个子流程之一收到此消息,发送包含 的响应消息2,退出。所以剩下2个正在运行的子进程。
  3. 接收响应2并发送“EndOfData”类型的消息,其中包含2.
  4. 2 个子流程之一收到此消息,发送包含 的响应消息1,退出。所以剩下 1 个正在运行的子进程。
  5. 接收响应1并发送“EndOfData”类型的消息,其中包含1.
  6. 最后运行的子进程收到此消息,发送包含 的响应消息0,退出。没有正在运行的子进程。
  7. 接收响应0并停止发送“EndOfData”类型的消息。
于 2013-01-04T20:59:38.463 回答
0

使用以下代码并将工作放入事务中。所以脚本块可以在收到EndOfData消息后退出。

$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.DatabaseName = "..."
$conn.BeginTransaction()
$conn.ExecuteNonQuery("Receive message;")
# do work
$conn.CommitTransaction()

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.serverconnection.committransaction.aspx

于 2013-01-19T02:53:19.123 回答