Nachricht von SQL Server an externe Anwendung (activemq)
Ich habe eine SQL Server-Datenbank und Activemq in meinem System installiert. Ich habe versucht, den Endpunkt zu erstellen, um den Port abzuhören, an dem sich activemq befindet. Der Hafen ist 61617
CREATE ENDPOINT InstInitiatorEndpoint
STATE = STARTED
AS TCP ( LISTENER_PORT = 61617 )
FOR SERVICE_BROKER (AUTHENTICATION = WINDOWS );
GO
Dies führt jedoch zu einem Fehler:
Der Service Broker-Endpunkt kann aufgrund des folgenden Fehlers nicht auf Verbindungen warten: '10013 (Es wurde versucht, auf einen Socket zuzugreifen, der durch seine Zugriffsberechtigungen verboten ist.)'.
Da activemq bereits auf demselben Port läuft. Sollte ich einen anderen Port angeben? Wenn ich eine andere Portnummer gebe, wird der Befehl erfolgreich ausgeführt. Aber im GrundeLISTENER_PORT=61617
bedeutet, dass der Endpunkt Port 61617 abhört, nicht wahr? Kann jemand meinen Zweifel klären?
BEARBEITEN: Angenommen, ich habe Endpunkt, Nachrichtentyp, Vertrag, Warteschlange und Service wie folgt erstellt
CREATE MESSAGE TYPE RequestMessage
VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE ReplyMessage
VALIDATION = WELL_FORMED_XML;
GO
CREATE CONTRACT SimpleContract
(RequestMessage
SENT BY INITIATOR,
ReplyMessage
SENT BY TARGET
);
GO
CREATE QUEUE InstInitiatorQueue;
CREATE SERVICE InitiatorService
AUTHORIZATION InitiatorUser
ON QUEUE InstInitiatorQueue;
GO
DECLARE @Cmd NVARCHAR(4000);
SET @Cmd = N'USE InstInitiatorDB;
CREATE ROUTE InstTargetRoute
WITH SERVICE_NAME =
N''TargetService'',
ADDRESS = N''TCP://localhost:61617'';';
EXEC (@Cmd);
DECLARE @Cmd NVARCHAR(4000);
SET @Cmd = N'USE msdb
CREATE ROUTE InstInitiatorRoute
WITH SERVICE_NAME =
N''InitiatorService'',
ADDRESS = N''LOCAL''';
EXEC (@Cmd);
GO
CREATE REMOTE SERVICE BINDING TargetBinding
TO SERVICE
N'TargetService'
WITH USER = TargetUser;
GO
Jetzt erstelle ich als Handle für das Gespräch
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
DECLARE @RequestMsg NVARCHAR(100);
BEGIN TRANSACTION;
BEGIN DIALOG @InitDlgHandle
FROM SERVICE InitiatorService
TO SERVICE N'TargetService'
ON CONTRACT SimpleContract
WITH
ENCRYPTION = ON;
SELECT @RequestMsg = N'<RequestMsg>Message for Target service434.</RequestMsg>';
SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE RequestMessage
(@RequestMsg);
SELECT @RequestMsg AS SentRequestMsg;
COMMIT TRANSACTION;
GO
Hier Wenn Sie sehen, habe ich versucht, am Beispiel einer Konversation zwischen zwei SQL Server-Instanzen eine Konversation zwischen SQL Server und activemq herzustellen. Ich muss Server-zu-Server-Kommunikation angeben, dafür muss ich Dienst (Initiator) zu Dienst (Ziel) angeben. Ich kenne den Initiator-Server, bei dem es sich um einen SQL-Server handelt, aber ich kenne den Dienst von activemq nicht. Welchen Dienst von activemq sollte ich für die datenbankseitige Konversation festlegen?