Sql server 2008 如何在代理服务中设置/处理多种消息类型
我刚刚开始了解代理服务,但我有一个关于多种消息类型/队列等的问题。。。情况很简单, 我有一个作业队列(基于时间),当每个作业被“处理”时,结果被存储到一个表中。触发器将位于结果表上,并使用代理服务(异步)处理每个结果。根据作业的类型,每个结果(XML)可能不同,因此我需要为每个类型存储一个过程。我猜我需要多种消息类型来完成这项任务,但是Sql server 2008 如何在代理服务中设置/处理多种消息类型,sql-server-2008,service-broker,Sql Server 2008,Service Broker,我刚刚开始了解代理服务,但我有一个关于多种消息类型/队列等的问题。。。情况很简单, 我有一个作业队列(基于时间),当每个作业被“处理”时,结果被存储到一个表中。触发器将位于结果表上,并使用代理服务(异步)处理每个结果。根据作业的类型,每个结果(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