2012-08-02 77 views
0

我刚开始弄清楚代理服务,但是对于多种消息类型/队列等问题我有一个疑问......情况非常简单;如何在代理服务中设置/处理多种消息类型

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

  1. 请问我还需要多个队列,每一个消息类型?
  2. 我需要多个合同吗?
  3. 我需要多项服务吗?
  4. 知道这样的事情有什么好的设计模式?

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

回答

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 
2

我会建议坚持一个服务/队列/合同。多种消息类型都可以。如果你曾经做过旧式windows programming与WM_PAINT/WM_CREATE等的激活过程非常相似,但有SSB消息类型打

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_XXX的作用。这是因为事件drivent编程类似于事件驱动编程...

+0

感谢Remus。我将坚持使用一个服务/队列/合同,但我发现了一种更好的方式将数据中介到不同的队列。看看我的答案。 – 2012-08-03 00:45:27