SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

SERVICE BROKER

 

Veritabanları arası asenkron mesaj gönderimini sağlayan yeni bir teknolojidir.Her teknolojide olduğu gibi bundada bir sürü kavram vardır.Microsoft’un şu resmine bakalım;

 

 

 

Burada görüldüğü gibi Service,Queue,Dialog kavramları vardır.Service Broker yapısını oluşturmamız için şu adımları gerçekleştirmemiz gerekir;

 

  1. Mesaj türlerini oluştur
  2. Contract oluştur
  3. Queue oluştur
  4. Service oluştur
  5. Son olarak mesaj gönder ve al. 

Source veri tabanı için ayarlamalar;

 

CREATE DATABASE Source WITH TRUSTWORTHY ON;

 

USE Source;

 

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = '123456';

 

CREATE TABLE Log

(

      Id INT IDENTITY(1,1) NOT NULL,

      Aciklama VARCHAR(MAX) NULL,

      CONSTRAINT PKLog PRIMARY KEY(Id)

)

 

CREATE PROCEDURE MesajAlindi

AS  

BEGIN

 

DECLARE @message_type int,

            @dialog uniqueidentifier,

            @message_body VARCHAR(50);

     

      RECEIVE TOP(1)

            @message_type=message_type_id,

            @message_body=message_body,

            @dialog = conversation_handle

            FROM QUEUESource

 

      If (@message_type <> 2)

      BEGIN

            INSERT INTO Log VALUES('Hedeften Gelen Mesaj:'+@message_body);

      END

      END CONVERSATION @dialog;

END

 

CREATE MESSAGE TYPE SendMessageType

      VALIDATION = NONE;

 

CREATE MESSAGE TYPE ReceiveMessageType

      VALIDATION = NONE;

 

CREATE CONTRACT [MainContract]

(

      [SendMessageType] SENT BY INITIATOR,

      [ReceiveMessageType] SENT BY TARGET

);

 

CREATE QUEUE QUEUESource

    WITH STATUS=ON,

    ACTIVATION (

        PROCEDURE_NAME = MesajAlindi,

        MAX_QUEUE_READERS = 5,

            Execute AS 'dbo') ;

 

CREATE SERVICE SERVICESource

      ON QUEUE [QUEUESource]

      (

      [MainContract]

      );

 

Target veri tabanı için ayarlamalar;

 

CREATE DATABASE Target WITH TRUSTWORTHY ON;

 

USE Target;

 

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = '123456';

 

CREATE TABLE Log

(

      Id INT IDENTITY(1,1) NOT NULL,

      Aciklama VARCHAR(50) NULL,

 CONSTRAINT PKLog PRIMARY KEY(Id)

)

CREATE PROCEDURE MesajAlindi

AS

BEGIN

DECLARE @message_type INT,

            @dialog UNIQUEIDENTIFIER,

            @message_body VARCHAR(50);

 

      RECEIVE TOP(1)

            @message_type=message_type_id,

            @message_body=message_body,

            @dialog = conversation_handle

      FROM QUEUETarget

 

      If (@message_type <> 2)

      BEGIN

            INSERT INTO Log VALUES('Gelen Mesaj:'+@message_body);

                  SET @message_body = 'Merhaba Source';

                  SEND ON CONVERSATION @dialog

                        MESSAGE TYPE ReceiveMessageType(@message_body); 

      END

      END CONVERSATION @dialog

END  

 

CREATE MESSAGE TYPE SendMessageType

      VALIDATION = WELL_FORMED_XML;

 

CREATE MESSAGE TYPE ReceiveMessageType

      VALIDATION = WELL_FORMED_XML;

 

CREATE CONTRACT [MainContract]

(

      [SendMessageType] SENT BY INITIATOR,

      [ReceiveMessageType] SENT BY TARGET

);

 

CREATE QUEUE QUEUETarget

    WITH STATUS=ON,

    ACTIVATION (

        PROCEDURE_NAME = MesajAlindi,

        MAX_QUEUE_READERS = 5,

            Execute AS 'dbo') ;

 

CREATE SERVICE SERVICETarget

      ON QUEUE [QUEUETarget]

      (

      [MainContract]

      );

 

Son olarak’da bu yapıda Source veri tabanından Target veri tabanına mesaj gönderelim;

 

USE Source

DECLARE @dialog_handle UNIQUEIDENTIFIER,

            @msg VARCHAR(50)

BEGIN DIALOG CONVERSATION @dialog_handle

   FROM SERVICE SERVICESource

   TO SERVICE 'SERVICETarget'

   ON CONTRACT [MainContract];

 

set @msg = 'Merhaba Target';

 

SEND ON CONVERSATION @dialog_handle

      MESSAGE TYPE SendMessageType (@msg)

 

Tablolara baktığımızda sonuç şu şekildedir;