was unexpected."由 SSBEA 记录,我的应用程序从未被调用-6ren"> was unexpected."由 SSBEA 记录,我的应用程序从未被调用-我正在运行安装了外部激活器的 SQL Server 2005 标准版。我在 SSMS 选项卡中有以下代码: -- Begin a conversation and send a request mes-6ren">
gpt4 book ai didi

sql-server - "The notification message type was unexpected."由 SSBEA 记录,我的应用程序从未被调用

转载 作者:行者123 更新时间:2023-12-03 21:32:35 25 4
gpt4 key购买 nike

我正在运行安装了外部激活器的 SQL Server 2005 标准版。我在 SSMS 选项卡中有以下代码:

-- Begin a conversation and send a request message
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
DECLARE @RequestMsg NVARCHAR(100);

BEGIN TRANSACTION;
BEGIN DIALOG @InitDlgHandle
FROM SERVICE [//abc/XYZ/InitiatorPostService]
TO SERVICE N'//abc/XYZ/TargetPostService'
ON CONTRACT [//abc/XYZ/PostContract]
WITH ENCRYPTION = OFF;

SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';

SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE [//abc/XYZ/RequestPostMessage](@RequestMsg);

SELECT @RequestMsg AS SentRequestMsg, @InitDlgHandle AS ConversationHandle;
COMMIT TRANSACTION;
GO

当我运行它时,我在结果 Pane 中得到了预期的输出。在 EATrace.log 中,我收到错误消息“通知消息类型//abc/XYZ/RequestPostMessage 是意外的。”

-- Create message types
CREATE MESSAGE TYPE [//abc/XYZ/RequestPostMessage] VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE [//abc/XYZ/ReplyPostMessage] VALIDATION = WELL_FORMED_XML;
GO

-- Create contract
CREATE CONTRACT [//abc/XYZ/PostContract]
([//abc/XYZ/RequestPostMessage] SENT BY INITIATOR,
[//abc/XYZ/ReplyPostMessage] SENT BY TARGET
);
GO

-- Create target queue and service
CREATE QUEUE TargetPostQueue WITH RETENTION = ON;
CREATE SERVICE [//abc/XYZ/TargetPostService]
ON QUEUE TargetPostQueue([//abc/XYZ/PostContract]);
GO

-- Create the initiator queue and service
CREATE QUEUE InitiatorPostQueue WITH RETENTION = ON;
CREATE SERVICE [//abc/XYZ/InitiatorPostService]
ON QUEUE InitiatorPostQueue([//abc/xyz/PostContract]);
GO

-- Create a notification for External Activator
CREATE QUEUE NotificationPostQueue
CREATE SERVICE [//abc/xyz/NotificationPostService]
ON QUEUE NotificationPostQueue([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
CREATE EVENT NOTIFICATION EventQueueActivation
ON QUEUE [TargetPostQueue]
FOR QUEUE_ACTIVATION
TO SERVICE '//abc/xyz/NotificationPostService', 'current_database';
GO

-- Security
GRANT CONNECT TO [**Company**\**Machine**$] -- allow CONNECT to the notification database
GRANT RECEIVE ON TargetPostQueue TO [**Company**\**Machine**$] -- allow RECEIVE from the service queue
GRANT RECEIVE ON NotificationPostQueue TO [**Company**\**Machine**$] -- allow RECEIVE from the notifcation queue
GRANT REFERENCES ON SCHEMA::dbo TO [**Company**\**Machine**$] -- allow REFRENCES right on the notification queue schema

-- allow VIEW DEFINITION on the target service
GRANT VIEW DEFINITION ON SERVICE::[//abc/xyz/TargetPostService] TO [**Company**\**Machine**$]

-- allow VIEW DEFINITION on the notification service
GRANT VIEW DEFINITION ON SERVICE::[//abc/xyz/NotificationPostService] TO [**Company**\**Machine**$]
GO

EAService.config 中没有任何内容告诉 EA 期望的消息类型。为什么我会收到此错误,而不是 EA 执行其配置文件中指定的应用程序?我的契约(Contract)设置不正确吗?

** 下面新增部分:**

根据 Remus 的建议,我添加了以下内容:

-- Create a notification for External Activator
CREATE QUEUE NotificationPostQueue

CREATE SERVICE [//abc/xyz/NotificationPostService]
ON QUEUE NotificationPostQueue([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])

CREATE EVENT NOTIFICATION EventQueueActivation
ON QUEUE [TargetPostQueue]
FOR QUEUE_ACTIVATION
TO SERVICE '//abc/xyz/NotificationPostService', 'current_database';
GO

但是当我将配置文件中的 NotificationService 名称从“//abc/xyz/TargetPostService”更改为“//abc/xyz/NotificationPostService”时,我收到错误“ERROR = 31,通知服务//abc/xyz/NotificationPostService 在我启动服务时在 EATrace.log 中不存在”。但是,该服务列在 sys.services 中。

** 错误 31 已解决,现在的问题是我的应用未被调用 **

我使用了 Service Broker 团队博客中的示例应用程序,添加了用于调试目的的日志记录。它一运行就写一个日志文件,然后再做任何其他事情。我已经通过从 VS2010 运行它来测试它并且工作正常,但是当我使用此问题开头的代码发送消息时,不会创建 long 。因此我知道我的应用程序不是由 EA 运行的。我如何诊断发生这种情况的原因?我的 EAService.config 文件中的路径是正确的。这是整个文件:

<?xml version="1.0" encoding="utf-8"?>
<Activator xmlns="http://schemas.microsoft.com/sqlserver/2008/10/servicebroker/externalactivator"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/sqlserver/2008/10/servicebroker/externalactivator EAServiceConfig.xsd"
>
<NotificationServiceList>
<NotificationService name="//abc/xyz/NotificationPostService" id="100" enabled="true">
<Description>My test notification service</Description>
<ConnectionString>
<!-- All connection string parameters except User Id and Password should be specificed here -->
<Unencrypted>server=**MyServer**\**MyInstance**;database=CompanyRehabManagement;Application Name=External Activator;Integrated Security=true;</Unencrypted>
</ConnectionString>
</NotificationService>
</NotificationServiceList>
<ApplicationServiceList>
<ApplicationService name="Company.xyz.EAProcessor" enabled="true">
<OnNotification>
<ServerName>**MyServer**\**MyInstance**</ServerName>
<DatabaseName>**MyDbName**</DatabaseName>
<SchemaName>dbo</SchemaName>
<QueueName>TargetPostQueue</QueueName>
</OnNotification>
<LaunchInfo>
<ImagePath>C:\Project\Pathway\Source\Company.xyz\Company.xyz.EAProcessor\bin\Debug\Company.xyz.EAProcessor.exe</ImagePath>
<CmdLineArgs> %sqlserver% %database% %schema% %queue% </CmdLineArgs>
<WorkDir>C:\Project\Pathway\Source\Company.xyz\Company.xyz.EAProcessor</WorkDir>
</LaunchInfo>
<Concurrency min="1" max="1" />
</ApplicationService>
</ApplicationServiceList>
<LogSettings>
<LogFilter>
<TraceFlag>All Levels</TraceFlag>
<TraceFlag>All Modules</TraceFlag>
<TraceFlag>All Entities</TraceFlag>
</LogFilter>
</LogSettings>
</Activator>

我使用的队列名称是否正确?此文件中是否还有其他可能的错误?我还能做些什么来诊断这个?这是发生的对话:

conversation_id,                      is_initiator, conversation_handle,                  local_service,                  remote_service,                 service_contract,       state_desc, far_broker_instance,                  security_timestamp,      send_sequence, receive_sequence, end_dialog_sequence, system_sequence
411C6F74-B29F-4C47-A538-1B9C900F49BD, 1, 7E7DD27A-E102-E011-93D2-0004239AA238, //abc/xyz/InitiatorPostService, //abc/xyz/TargetPostService, //abc/xyz/PostContract, CONVERSING, 083E1179-A1C3-4414-A1A6-67238E3879CE, 1900-01-01 00:00:00.000, 1, 0, -1, 0
411C6F74-B29F-4C47-A538-1B9C900F49BD, 0, 817DD27A-E102-E011-93D2-0004239AA238, //abc/xyz/TargetPostService, //abc/xyz/InitiatorPostService, //abc/xyz/PostContract, CONVERSING, 083E1179-A1C3-4414-A1A6-67238E3879CE, 2010-12-08 16:10:59.260, 0, 1, -1, 0

最佳答案

当你创建事件通知时,你应该使用'current database'(没有下划线)而不是'current_database'。 'current database' 是一个特殊值,它将匹配当前数据库的任何代理 ID,而在您的情况下,事件通知尝试将通知消息发送到代理 ID = 'current_database' 的服务。

关于sql-server - "The notification message type <MessageType> was unexpected."由 SSBEA 记录,我的应用程序从未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com