Service broker-将服务更改为默认合约会导致错误



不久前,在SQL Server 2016中,我创建了一个service broker队列:

CREATE QUEUE [dbo].[NotificationsQueue] 
WITH STATUS=ON, 
RETENTION=OFF,
POISON_MESSAGE_HANDLING (STATUS=ON)
ON [PRIMARY]
GO

此外,我创建了一个服务:

CREATE SERVICE [ChangeNotifications]
AUTHORIZATION [dbo]
ON QUEUE [dbo].[NotificationsQueue]
(
[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]
)
GO

这很好,允许根据需要从监控队列的代码中发送XML消息。

我们的新要求是,我们不想再被XML束缚住了。因此,由于系统PostQueryNotification合约中有xml验证,我想使用完全没有验证的默认值。

所以我更改了服务:

ALTER SERVICE ChangeNotifications (ADD CONTRACT [DEFAULT], DROP CONTRACT [http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])

现在,当我从队列中读取message_body字段时,我得到

Target service 'ChangeNotifications' does not support contract 'http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification'

所以我现在很困惑,因为我只做了很多博客告诉我的事情,当你想改变验证时。

我做错了什么?

根据您使用的名称,您是否实现了查询通知?如果是这样的话,我认为你无法控制正在使用的合同。也就是说,任何试图发送查询通知的进程都会(在某个时刻(发出如下消息:

begin dialog @handle
from service sourceService
to service 'ChangeNotifications'
on contract [http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]

因为您已经从服务中删除了该合约,所以它不再有效,并且会出现错误。

最新更新