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 ;
GOmesaj 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