9 Ekim 2010 Cumartesi

Service Broker kullanımı

SQL Server 2005 veya 2008 üzerinde service broker nesnesinin kullanımı.

ornekdb isimli bir database oluşturulması

ornekdb service broker erişimi ve service broker’ın aktifleştirilmesi

Select is_broker_enabled From sys.databases Where database_id=db_id()

ALTER DATABASE ornekdb SET ENABLE_BROKER

tanımların yapılması



CREATE MESSAGE TYPE mesaj VALIDATION = WELL_FORMED_XML ;

CREATE CONTRACT kontrat ( mesaj SENT BY INITIATOR);

CREATE QUEUE [dbo].[gondermeKuyrugu];
CREATE QUEUE [dbo].[almaKuyrugu];

CREATE SERVICE gondermeServisi ON QUEUE [dbo].[gondermeKuyrugu];
CREATE SERVICE almaServisi ON QUEUE [dbo].[almaKuyrugu] (kontrat);

mesaj gönderme



BEGIN TRANSACTION ; 

-- mesaj oluşturulması

DECLARE @mesaj XML ;
SET @mesaj = N'<mesaj>Merhaba, Dünya!</mesaj>' ;

-- baslatılan karsilasmanın referansının
-- tutulması

DECLARE @karsilasmaReferansi UNIQUEIDENTIFIER ;

-- Karşılaşma.

BEGIN DIALOG CONVERSATION @karsilasmaReferansi
FROM SERVICE gondermeServisi
TO SERVICE 'almaServisi'
ON CONTRACT kontrat
WITH ENCRYPTION = OFF;

-- Send the message on the dialog.

SEND ON CONVERSATION @karsilasmaReferansi
MESSAGE TYPE mesaj
(@mesaj) ;

-- işlem tamalanıyor. Service Broker
-- mesaj hedefe ulaştırılır

COMMIT TRANSACTION ;
GO

mesaj alma



-- Grup bazında işlem
WHILE (1 = 1)
BEGIN

DECLARE @karsilasmaReferansi UNIQUEIDENTIFIER,
@karsilasmaGrup UNIQUEIDENTIFIER,
@mesajIcerigi XML,
@mesajTipAdi NVARCHAR(128);

BEGIN TRANSACTION ;

-- grubun tutulması

WAITFOR(
GET CONVERSATION GROUP @karsilasmaGrup FROM [dbo].[almaKuyrugu]),
TIMEOUT 500 ;

-- eger karşılaşma grubu kalmadıysa işlemin
-- dış döngünün dışına çıkarılması

IF @karsilasmaGrup IS NULL
BEGIN
ROLLBACK TRANSACTION ;
BREAK ;
END ;

-- grup içerisindeki mesajların işleme alınması.

WHILE 1 = 1
BEGIN

-- grup için mesajın alınması 'where' yazımı ile
-- aynı gruba ait mesajın işleme alınması

RECEIVE
TOP(1)
@karsilasmaReferansi = conversation_handle,
@mesajTipAdi = message_type_name,
@mesajIcerigi =
CASE
WHEN validation = 'X' THEN CAST(message_body AS XML)
ELSE CAST(N'<none/>' AS XML)
END
FROM [dbo].[almaKuyrugu]
WHERE conversation_group_id = @karsilasmaGrup ;

-- eger mesaj yoksa veya hata olustuysa işlemi durdur,

IF @@ROWCOUNT = 0 OR @@ERROR <> 0 BREAK;

-- gelen mesajın gösterilmesi / seçilmesi

SELECT 'Conversation Group Id' = @karsilasmaGrup,
'Conversation Handle' = @karsilasmaReferansi,
'Message Type Name' = @mesajTipAdi,
'Message Body' = @mesajIcerigi ;

-- karşılaşmanın sonlandırılması

END CONVERSATION @karsilasmaReferansi ;

END;

-- işlemlerin onaylanması

COMMIT TRANSACTION ;

END ; -- bütün gruplar
GO





Hiç yorum yok:

Yorum Gönder