这个是我写的接收消息,并且进行容错处理的SP,拓狼,看到帮忙看看,有没有考虑不周的地方,谢谢!
我的队列使用了触发器来进行激活,应该可以吧?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/****** Object: StoredProcedure [dbo].[RECEIVEDIALOGS] Script Date: 09/07/2007 14:54:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[RECEIVEDIALOGS]
AS
SET NOCOUNT ON
DECLARE @conversationHandle uniqueidentifier
declare @message_body xml
declare @message_type_name nvarchar(256) ;
-- Receive 命令的格式类似于一个选择列表。首先列出
-- 要获取的列,然后指定要从中获取消息
-- 的队列
RECEIVE top(1) -- 只接收一条消息,因此我们可以直接保存到变量中。
@message_type_name=message_type_name,
-- 接收的消息类型
@conversationHandle=conversation_handle,
-- 对话的标识符
-- 我们通过下列语句接收该消息
@message_body=message_body
-- 作为
-- varbinary(MAX) blob 的消息内容
FROM [myQueue]
-- Service Broker 命令总是位于事务中
SET XACT_ABORT ON
BEGIN TRY
Begin Transaction;
--如果是错误或者超时信息,进行记录
IF @message_type_name='http://schemas.microsoft.com/SQL/ServiceBroker/Error'
begin
INSERT INTO ErrorMessage select @message_body.value(
N'declare namespace
brokerns="http://schemas.microsoft.com/SQL/ServiceBroker/Error";
(/brokerns:Error/brokerns:Code)[1]',
'int'),
@message_body.value(
N'declare namespace
brokerns="http://schemas.microsoft.com/SQL/ServiceBroker/Error";
(/brokerns:Error/brokerns:Description)[1]',
'nvarchar(3000)') ,getdate()
-- 这是我们希望从初始化程序接收的唯一消息,因此
-- 现在可以安全地结束对话。
end
-- 回复消息
if @message_type_name = N'mymsg'
Begin
--判断逻辑结构,进行对应的处理
-----------------------------------------------------------
if @message_body.value('(/T/@object)[1]','varchar(36)')='details'
begin
declare @id int,
@c1 int,
@c2 char(2),
@c3 varchar(16),
@c4 int,
@c5 money,
@c6 varchar(max),
@status int
select @id=@message_body.value('(/T/@id)[1]','int'),
@c1=@message_body.value('(/T/@c1)[1]','int'),
@c2=@message_body.value('(/T/@c2)[1]','char(2)'),
@c3=@message_body.value('(/T/@c3)[1]','varchar(16)'),
@c4=@message_body.value('(/T/@c4)[1]','int'),
@c5=@message_body.value('(/T/@c5)[1]','money'),
@c6=@message_body.value('(/T/@c6)[1]','varchar(max)'),
@status=@message_body.value('(/T/@status)[1]','int')
declare @command nvarchar(3000)
select @command='delete from details where id='+cast(@id as varchar(30))
if @status=0 or @status=1
begin
insert into TargetDB.dbo.details(id,c1,c2,c3,c4,c5,c6,status)
values(@id,@c1,@c2,@c3,@c4,@c5,@c6,@status)
insert into TargetDB.dbo.part1(id,c1,c2,c3,status)
values(@id,@c1,@c2,@c3,@status)
end
if @status=2 or @status=3 or @status=4
begin
insert into TargetDB.dbo.details(id,c1,c2,c3,c4,c5,c6,status)
values(@id,@c1,@c2,@c3,@c4,@c5,@c6,@status)
insert into TargetDB.dbo.part2(id,c4,c5,c6,status)
values(@id,@c4,@c5,@c6,@status)
end
-- 回传消息,删除原始列
-- Start dialog.
-- BEGIN DIALOG @conversationHandle
-- FROM SERVICE [TargetService]
-- TO SERVICE 'SourceService'
-- ON CONTRACT [mycon]
-- WITH ENCRYPTION = ON, LIFETIME = 600;
-- Send message.
-- 这是我们希望从初始化程序接收的唯一消息,因此
-- 现在可以安全地结束对话。
if @@error=0
begin
SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE [mymsg] (@command)
end
end
------------------------------------------------------------------------
End
IF @conversationHandle IS NOT NULL
END CONVERSATION @conversationHandle
-- 提交事务
-- 如果此时我们回滚,所有内容将退回到
-- 我们开始时的状态 – 消息会返回到队列,并且没有发送响应
Commit TRAN
END TRY
BEGIN CATCH
if @@trancount>0
rollback
insert into ErrorRecord select
conversation_group_id,
conversation_handle ,
ERROR_NUMBER() ,
ERROR_SEVERITY() ,
ERROR_STATE(),
ERROR_PROCEDURE(),
ERROR_LINE(),
ERROR_MESSAGE() ,
getdate() from myqueue where @conversationHandle=conversation_handle
insert into ErrorQueue select *,getdate() from myqueue where @conversationHandle=conversation_handle
END CONVERSATION @conversationHandle
END CATCH
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------