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:所有示例都不使用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