1

概要:「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

機能させるには何に注意すればよいですか?

4

1 に答える 1

1

Service Broker プロトコル トランスポートが無効になっているか、構成されていません

エンドポイントが開始されていないことを意味します。試してみてくださいALTER ENDPOINT [<brokerendpointname>] STATE=STARTED;。ステートメントが成功しても問題が解決しない場合は、ERRORLOG を確認してください。このステートメントを実行した直後に、エンドポイントを開始できなかった理由を示すエラー メッセージが表示されます。ほとんどの場合、リスニング ポートの競合が発生しています。

于 2012-11-02T10:17:48.057 に答える