Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何在代理服务中设置/处理多种消息类型_Sql Server 2008_Service Broker - Fatal编程技术网

Sql server 2008 如何在代理服务中设置/处理多种消息类型

Sql server 2008 如何在代理服务中设置/处理多种消息类型,sql-server-2008,service-broker,Sql Server 2008,Service Broker,我刚刚开始了解代理服务,但我有一个关于多种消息类型/队列等的问题。。。情况很简单, 我有一个作业队列(基于时间),当每个作业被“处理”时,结果被存储到一个表中。触发器将位于结果表上,并使用代理服务(异步)处理每个结果。根据作业的类型,每个结果(XML)可能不同,因此我需要为每个类型存储一个过程。我猜我需要多种消息类型来完成这项任务,但是 我是否还需要多个队列,每种消息类型一个 我也需要多份合同吗 我需要多种服务吗 知道这样的东西有什么好的设计模式吗 理想情况下,我希望一个队列具有多个读卡器(每种

我刚刚开始了解代理服务,但我有一个关于多种消息类型/队列等的问题。。。情况很简单,

我有一个作业队列(基于时间),当每个作业被“处理”时,结果被存储到一个表中。触发器将位于结果表上,并使用代理服务(异步)处理每个结果。根据作业的类型,每个结果(XML)可能不同,因此我需要为每个类型存储一个过程。我猜我需要多种消息类型来完成这项任务,但是

  • 我是否还需要多个队列,每种消息类型一个
  • 我也需要多份合同吗
  • 我需要多种服务吗
  • 知道这样的东西有什么好的设计模式吗

  • 理想情况下,我希望一个队列具有多个读卡器(每种类型1个),但我不确定这是否可行,因为每个队列只能有1个存储过程。当我创建多个消息类型和多个队列时,似乎我也需要多个服务。

    我建议坚持使用一个服务/队列/合同。多种消息类型都可以。您应该将异步处理激活的过程编码如下(伪代码):


    如果您曾经使用WM_PAINT/WM_CREATE等执行过旧式操作,那么激活的过程可能非常类似,SSB消息类型扮演WM_XXX的角色。这是因为事件驱动编程类似于事件驱动编程…

    以下是我的想法(使用Remus关于坚持单一契约/队列/服务的回答)

    根据类型创建特定的消息/合同/队列/服务名称:

    create message [//MyPrefix/SomeTypeMessage]
    create queue dbo.SomeTypeQueue
    create service [//MyPrefix/SomeTypeService]
    create contract [//MyPrefix/SomeTypeContract]
    
    因此,“SomeType”是可以在插入的数据中找到的类型。创建调用begin conversation的触发器时,该类型用于连接不同的系统名。根据在“myTypeDataField”中找到的数据,记录将被发送到不同的队列/进程

    declare @handle uniqueidentifier, 
            @service sysname, 
            @contract sysname,
            @messageType sysname,
            @myType varchar(50)
    
    
    set @myType = (select myTypeDataField from inserted)
    set @messageBody = (select * from inserted for xml auto)
    
    set @service = N'//MyPrefix/' + @myType + 'Service'
    set @contract = N'//MyPrefix/' + @myType + 'Contract'
    set @messageType = N'//MyPrefix/' + @myType + 'Message'
    
    begin tran
    
        begin dialog conversation @handle
        from service @service
        to service @service, 'current database'
        on contract @contract
        with encryption = off;
    
        send on conversation @handle
        message type @messageType(@messageBody);
    
    commit
    

    谢谢雷姆斯。我将坚持使用一个服务/队列/契约,但我找到了一种更好的方法将数据代理到不同的队列。看看我的答案。
    declare @handle uniqueidentifier, 
            @service sysname, 
            @contract sysname,
            @messageType sysname,
            @myType varchar(50)
    
    
    set @myType = (select myTypeDataField from inserted)
    set @messageBody = (select * from inserted for xml auto)
    
    set @service = N'//MyPrefix/' + @myType + 'Service'
    set @contract = N'//MyPrefix/' + @myType + 'Contract'
    set @messageType = N'//MyPrefix/' + @myType + 'Message'
    
    begin tran
    
        begin dialog conversation @handle
        from service @service
        to service @service, 'current database'
        on contract @contract
        with encryption = off;
    
        send on conversation @handle
        message type @messageType(@messageBody);
    
    commit