概要:「Service Broker プロトコル トランスポートが無効になっているか、構成されていません」というメッセージが表示されます。transmission_status
キューの中に。もう少し細かい設定が必要なようです。または、何が欠けていますか?
この質問は、私の以前の質問への回答に直接関連しています。GRANT CONNECT ON ENDPOINT::[<brokerendpointname>] TO [public]
信頼できるローカル ネットワークでのプラグインのような構成を簡素化するために、特別なトリックを使用してアドバイスに従いました。
create message type...
create contract ...
create queue ...
create service [tcp://MACHINE3:4022/Satellite]
on ...
([...]);
grant send on service::[tcp://MACHINE3:4022/Satellite] to [public];
create route transport with address = 'TRANSPORT';
詳細が役割を果たす可能性がある場合のために、実際のコードの抜粋を次に示します。
USE [MySatelliteDB];
CREATE MESSAGE TYPE [//x/y/RequestMessage]
VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE [//x/y/ReplyMessage]
VALIDATION = WELL_FORMED_XML;
CREATE CONTRACT [//x/y/SimpleContract]
([//x/y/RequestMessage] SENT BY INITIATOR,
[//x/y/ReplyMessage] SENT BY TARGET);
CREATE QUEUE GenericQueue;
CREATE SERVICE [tcp://192.168.4.120:4022/GenericService]
ON QUEUE GenericQueue ([//x/y/SimpleContract]);
GRANT SEND ON SERVICE::[tcp://192.168.4.120:4022/GenericService] TO [public];
CREATE ROUTE transport WITH ADDRESS = 'TRANSPORT';
セントラル マシンは、データベース名と IP アドレス (この場合は 158 で終わる) 以外は同じものを使用します。次に、明示的なダミーメッセージを送信しようとしました...
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
DECLARE @RequestMsg NVARCHAR(100);
BEGIN TRANSACTION;
BEGIN DIALOG @InitDlgHandle
FROM SERVICE [tcp://192.168.4.120:4022/GenericService]
TO SERVICE N'tcp://192.168.4.158:4022/GenericService'
ON CONTRACT [//x/y/SimpleContract]
WITH
ENCRYPTION = OFF;
SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';
SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE [//x/y/RequestMessage]
(@RequestMsg);
SELECT @RequestMsg AS SentRequestMsg;
COMMIT TRANSACTION;
GO
表示した
SentRequestMsg
<RequestMsg>Message for Target service.</RequestMsg>
...どうやら最後の選択の結果として。COMMIT TRANSACTION
このようにして、成功したと思います。(エラーメッセージは観察されませんでした。)
次に、他のSQLサーバーのSSMSウィンドウを開いて受信しようとしました...
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;
BEGIN TRANSACTION;
WAITFOR
( RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM GenericQueue
), TIMEOUT 1000;
SELECT @RecvReqMsg AS ReceivedRequestMsg;
IF @RecvReqMsgName =
N'//x/y/RequestMessage'
BEGIN
DECLARE @ReplyMsg NVARCHAR(100);
SELECT @ReplyMsg =
N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
[//x/y/ReplyMessage] (@ReplyMsg);
END CONVERSATION @RecvReqDlgHandle;
END
SELECT @ReplyMsg AS SentReplyMsg;
COMMIT TRANSACTION;
GO
予期しない値を含む 2 つの結果が表示されました
ReceivedRequestMsg
NULL
---------------------------------------------
SentReplyMsg
NULL
エラー メッセージは確認されませんでした。
スクリプトを実行すると...
USE [MySatelliteDB];
SELECT * FROM GenericQueue WITH (NOLOCK);
SELECT * FROM sys.transmission_queue;
何かが正しく機能していないことがわかります (1 行で、手動で折り返されていました)
conversation_handle to_service_name
1A227CA7-6F24-E211-B1EC-004063F5CE90 tcp://192.168.4.158:4022/GenericService
------------------------------------------------------------------------------...
to_broker_instance from_service_name
<empty> tcp://192.168.4.120:4022/GenericService
------------------------------------------------------------------------------...
service_contract_name enqueue_time
//x/y/SimpleContract 2012-11-01 22:01:15.440
------------------------------------------------------------------------------...
message_sequence_number message_type_name
0 /x/y/RequestMessage
------------------------------------------------------------------------------...
is_conversation_error is_end_of_dialog message_body
0 0 0x3C0052006...snip...3E00
------------------------------------------------------------------------------...
transmission_status priority
The Service Broker protocol transport is disabled or not configured. 5
機能させるには何に注意すればよいですか?