0

我刚刚开始了解代理服务,但我对多种消息类型/队列等有疑问……情况很简单;

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

  1. 我是否还需要多个队列,每个消息类型一个?
  2. 我还需要多份合同吗?
  3. 我需要多项服务吗?
  4. 知道类似这样的任何好的设计模式吗?

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

4

2 回答 2

2

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

begin transaction;
receive message into @msg
switch @msg.message_type
case 'A': exec proc_for_a @msg;
case 'B': exec proc_for_b @msg;
...
case 'Z': exec proc_for_z @msg;
end
commit;

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

于 2012-08-02T20:16:11.220 回答
0

这就是我想出的(使用 Remus 关于坚持单一合同/队列/服务的回答)。

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

create message [//MyPrefix/SomeTypeMessage]
create queue dbo.SomeTypeQueue
create service [//MyPrefix/SomeTypeService]
create contract [//MyPrefix/SomeTypeContract]

因此,“SomeType”是可以在某处插入的数据中找到的类型。创建调用开始对话的触发器时,该类型用于连接不同的系统名。根据在“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
于 2012-08-03T00:44:20.613 回答