首先,据我所知,对话与对话相同。同一事物的两个名称。
队列可以包含许多不同的消息类型。由处理消息的事物(无论是内部激活的存储过程还是外部应用程序)来区分类型并用它做“正确的事情”。一个服务只能有一个队列,但一个队列可以有很多服务(尽管我实际上并没有在实践中看到这一点)。服务定义了可以通过服务契约接受和产生的消息类型。
关于您是否希望队列处理器响应同一对话或开始新对话的问题完全取决于您。我的建议是在同一个对话中做出回应,除非你知道你有充分的理由不这样做。至于如何使用同一个会话,可以在发出receive语句时获取会话句柄。当您在回复中发出后续的send 时,将其用作对话句柄。
我对对话组的看法是,您可能需要就同一件事与不同的服务进行对话。这是一个人为的例子:
假设我有一个新的招聘流程。它有以下步骤:
- 创建登录名
- 在工资系统中创建一个条目
- 向您的保险公司注册
不过,从逻辑上讲,它们都是针对同一事件的(即“我雇用了一名新员工”)。因此,您可以将所有对话捆绑在一个对话组中,并分别跟踪各个对话。像这样的:
declare @handle uniqueidentifier, @group uniqueidentifier = NEWID(),
@message XML = '<employee name="Ben Thul" />';
BEGIN TRAN
begin dialog @handle
from service [EmployeeService]
to service 'LoginService'
on contract [LoginContract]
with related_conversation_group = @group;
SEND ON CONVERSATION (@handle)
MESSAGE TYPE [NewLoginRequest]
(@message);
INSERT INTO [dbo].[OpenRequests]
(
[GroupIdentifier],
[ConversationIdentifier],
[ServiceName],
[Status],
[date_modified]
)
VALUES
(@group, @handle, 'LoginService', 'RequestSent', GETUTCDATE());
BEGIN DIALOG @handle
FROM SERVICE [EmployeeService]
TO SERVICE 'PayrollService'
ON CONTRACT [PayrollContract]
WITH RELATED_CONVERSATION_GROUP = @group;
SEND ON CONVERSATION (@handle)
MESSAGE TYPE [NewPayrollRequest]
(@message);
INSERT INTO [dbo].[OpenRequests]
(
[GroupIdentifier],
[ConversationIdentifier],
[ServiceName],
[Status],
[date_modified]
)
VALUES
(@group, @handle, 'PayrollService', 'RequestSent', GETUTCDATE());
BEGIN DIALOG @handle
FROM SERVICE [EmployeeService]
TO SERVICE 'InsuranceService'
ON CONTRACT [InsuranceContract]
WITH RELATED_CONVERSATION_GROUP = @group;
SEND ON CONVERSATION (@handle)
MESSAGE TYPE [NewInsuranceRequest]
(@message);
INSERT INTO [dbo].[OpenRequests]
(
[GroupIdentifier],
[ConversationIdentifier],
[ServiceName],
[Status],
[date_modified]
)
VALUES
(@group, @handle, 'InsuranceService', 'RequestSent', GETUTCDATE());
COMMIT
现在,您有一种方法可以分别跟踪每个请求和一种将它们全部绑定到同一个逻辑操作的方法。当每个服务处理消息时,它会以成功、失败或“我需要其他东西”消息进行响应。此时您可以使用当前状态更新OpenRequests 表。
服务代理可能会让人不知所措。我对您的建议是考虑需要将哪些消息从 传递到 的地方,并围绕这些开始设计服务、消息类型、合同等。您不太可能使用 SB 提供的所有功能。