如何在代理服务中设置/处理多种消息类型
问题描述:
我刚开始弄清楚代理服务,但是对于多种消息类型/队列等问题我有一个疑问......情况非常简单;如何在代理服务中设置/处理多种消息类型
我有一个作业队列(基于时间),并且每个作业都被“处理”,结果被存储到一个表格中。触发器将位于结果表上,并使用代理服务处理每个结果(异步)。每个结果(XML)可以根据作业类型而不同,因此我需要为每种类型存储一个proc。我猜我需要多种消息类型来实现这一点,但...
- 请问我还需要多个队列,每一个消息类型?
- 我需要多个合同吗?
- 我需要多项服务吗?
- 知道这样的事情有什么好的设计模式?
理想情况下,我想要一个队列中有许多读者(每个类型1个),但我不确定这是可能的,因为我只能有一个存储每个队列的过程。当我创建多个消息类型和多个队列时,似乎我也需要多个服务。
答
下面是我想出的(使用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
答
我会建议坚持一个服务/队列/合同。多种消息类型都可以。如果你曾经做过旧式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编程类似于事件驱动编程...
感谢Remus。我将坚持使用一个服务/队列/合同,但我发现了一种更好的方式将数据中介到不同的队列。看看我的答案。 – 2012-08-03 00:45:27