Sql Service Broker和事务

时间:2012-12-20 18:28:38

标签: sql-server queue service-broker

MSDN上的所有示例都将发送和接收语句放在事务中。以下脚本来自http://msdn.microsoft.com/en-US/library/bb839499(v=sql.100).aspx

问题1:为什么所有示例都不使用begin try...end try begin catch...end catch来处理异常?

问题2:如果消息消耗/处理需要很长时间怎么办?在SSB语句上进行长期事务是否可以?什么是最好的方法?

问题3:如果邮件名称不是'//AWDB/1DBSample/RequestMessage',则以下代码不会结束对话。这是一个错误吗?

DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;

BEGIN TRANSACTION;

WAITFOR
( RECEIVE TOP(1)
    @RecvReqDlgHandle = conversation_handle,
    @RecvReqMsg = message_body,
    @RecvReqMsgName = message_type_name
  FROM TargetQueue1DB
), TIMEOUT 1000;

-- Process.... May take a long time

IF @RecvReqMsgName =
   N'//AWDB/1DBSample/RequestMessage'
BEGIN
     DECLARE @ReplyMsg NVARCHAR(100);
     SELECT @ReplyMsg =
     N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';

     SEND ON CONVERSATION @RecvReqDlgHandle
          MESSAGE TYPE 
          [//AWDB/1DBSample/ReplyMessage]
          (@ReplyMsg);

     END CONVERSATION @RecvReqDlgHandle;
END

SELECT @ReplyMsg AS SentReplyMsg;

COMMIT TRANSACTION;

1 个答案:

答案 0 :(得分:1)

答案1:所有示例都不使用begin try ... end try begin catch ... end catch来处理异常,因为它们是示例 - 所以它们应该简洁明了了解而不是包含生产中实施的代码。

答案2:在SSB语句上进行长时间运行是可以的。 SSB有助于避免在关键时刻进行长期交易。您可以使用SSB启动异步处理,并立即进入关键代码。也许你应该找到另一种解决方案而不是SSB,特别是对你的情况。

答案3:这不是错误,因为RECEIVE TOP(1)可能包含其他消息,例如错误消息。因此,您似乎需要在IF...END部分内重新定位处理代码,这意味着您收到了正确的消息并应该处理它:

IF @RecvReqMsgName =
   N'//AWDB/1DBSample/RequestMessage'
BEGIN

 -- Process.... May take a long time

 DECLARE @ReplyMsg NVARCHAR(100);
     SELECT @ReplyMsg =
     N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';

     SEND ON CONVERSATION @RecvReqDlgHandle
          MESSAGE TYPE 
          [//AWDB/1DBSample/ReplyMessage]
          (@ReplyMsg);

     END CONVERSATION @RecvReqDlgHandle;
END