【发布时间】:2013-06-10 01:41:02
【问题描述】:
我需要获得 SSB 外部激活才能从 db 触发器启动 exe。借助网络上可用的少量信息,我设法使几乎所有东西都能完美运行。我可以向队列发送消息,并且可以使用持续轮询数据库的 C# 应用程序从队列中读取消息。但我需要外部激活器来实际启动我的 exe。这是为了工作,我被困住了,所以非常感谢任何帮助!
外部激活器日志文件:Here
外部激活器配置文件:Here
队列状态(图片):Here
谢谢!
编辑:SQL 代码:
ALTER DATABASE AdventureWorks2012 SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
创建消息类型 [requestMessageType] 验证 = WELL_FORMED_XML
创建消息类型 [responseMessageType] 验证 = WELL_FORMED_XML
创建合同 [smtContract] ( [requestMessageType] 由发起者发送, [responseMessageType] 按目标发送 )
创建队列 InitiatorQueue WITH STATUS = 开启
创建队列目标队列 WITH STATUS = 开启
创建服务 InitiatorService ON QUEUE InitiatorQueue ( [smt合同] )
创建服务目标服务 ON QUEUE 目标队列 ( [smt合同] )
创建队列 ExternalActivatorQueue WITH STATUS = 开启
创建服务 ExternalActivatorService ON QUEUE ExternalActivatorQueue ( [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification] )
创建事件通知 EventNotificationTargetQueue ON QUEUE 目标队列 FOR QUEUE_ACTIVATION TO SERVICE 'ExternalActivatorService', '当前数据库';
创建表 [顺序] ( ID int identity(1000,1) NOT NULL, 金额 MONEY NOT NULL )
-- 触发器将消息添加到 ImportQueue 创建 TRIGGER OnOrderInserted ON [Order] FOR INSERT 作为 开始 开始交易; 声明@ch UNIQUEIDENTIFIER 声明@messageBody NVARCHAR(MAX);
BEGIN DIALOG CONVERSATION @ch
FROM SERVICE [InitiatorService]
TO SERVICE 'TargetService'
ON CONTRACT [smtContract]
WITH ENCRYPTION = OFF;
-- Construct the request message
SET @messageBody = (SELECT ID, Amount FROM [Order] FOR XML AUTO, ELEMENTS);
-- Send the message to the TargetService
;SEND ON CONVERSATION @ch
MESSAGE TYPE [requestMessageType] (@messageBody);
COMMIT;
结束 去吧
将数据库::AdventureWorks2012 的授权更改为 [sa];
ALTER QUEUE InitiatorQueue 激活 ( PROCEDURE_NAME = ProcessResponseMessages, 状态 = 开, MAX_QUEUE_READERS = 1, 作为所有者执行 )
【问题讨论】:
-
对于任何有同样问题的人,结果证明这是一个安全问题,而且不要忘记您需要手动启动 EA windows 服务。 (此外,您提供该服务的凭据将是用于查询 db 的凭据),这是一个艰难的过程,祝您好运!
标签: sql sql-server-2012 service-broker