外部アクティベータがインストールされたSQLServer2005StandardEditionを実行しています。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
実行すると、結果ペインに期待どおりの出力が表示されます。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が構成ファイルで指定されたアプリケーションを実行する代わりにこのエラーが発生するのはなぜですか?契約が間違って設定されていませんか?
**以下に新しく追加されたセクション:**
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/」というエラーが発生します。サービスを開始すると、EATrace.logに「NotificationPostServiceが存在しません」と表示されます。ただし、そのサービスはsys.servicesにリストされています。
**エラー31は解決しましたが、問題は私のアプリが呼び出されていないことです**
Service Broker Team Blogのサンプルアプリを使用し、デバッグ目的でログを追加しました。実行されるとすぐに、他のことをする前にログファイルを書き込みます。VS2010から実行してテストしましたが、正常に機能しますが、この質問の冒頭のコードを使用してメッセージを送信すると、作成されなくなります。したがって、私のアプリは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>
正しいQueueNameを使用していますか?このファイルに他に考えられるエラーはありますか?これを診断するために他に何ができますか?これが発生する会話です:
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