4  /  4  页   1234 跳转 查看:40864

Service Broker

回复: Service Broker

你不设定会话周期和消息回执,可以解决会话延迟的问题。
我突然发现不能发送消息了,配置都没有改过,很奇怪的。
 

回复: Service Broker

另外:
service可以删除或者修改的吗?
queue呢?
 

回复: Service Broker

可以,直接用对应的Alter和Drop语句即可
虽有智慧,不如乘势;虽有鎡基,不如待时。
君子学以聚之,问以辨之,宽以居之,仁以行之。
独学而无友,则孤陋而寡闻。
 

回复: Service Broker

试了一下,是可以不过需要先删除路由和远程服务绑定才行。
 

回复: Service Broker

禁用services broker的语法是什么呢。。。???
 

回复: Service Broker

ALTER DATABASE db_name SET DISABLE_BROKER
虽有智慧,不如乘势;虽有鎡基,不如待时。
君子学以聚之,问以辨之,宽以居之,仁以行之。
独学而无友,则孤陋而寡闻。
 

回复: Service Broker

拓狼,有几个问题请教一下。

问题1:我在发起机上的queue不能使用激活存储过程选项,可是存储过程没有正常激活,此现象在目标机上不存在。
问题2:如果激活多个存储过程,语法怎样写呢,能提供让我测试一下吗?
问题3:如果一个事务需要执行5分钟,而我在4分钟时点击了停止按钮,该事务将被挂起,需要手工干预才能结束掉。请问,有没有智能的方法来结束该事务呢?

盼回复,谢谢!
 

回复: Service Broker

这个是我写的接收消息,并且进行容错处理的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 
 
 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 

回复: Service Broker

另外消息的转发和会话组的功能,有没有朋友使用过的,介绍点经验啊!
 
4  /  4  页   1234 跳转

版权所有 微软BI开拓者 

Powered by Discuz!NT 2.1.202    Copyright © 2001-2012 Comsenz Inc.
Processed in 0.0625016 second(s) , 4 queries.
返顶部