Aracılığıyla paylaş


Service Broker uygulama anahat

Çoğu Hizmet Aracısı uygulamalar, iletileri almak ve işlemek için aynı temel adımları izleyin:

  1. Uygulama, bir işlem başlar.

  2. Uygulamanın durumunu korur, uygulama alır bir konuşma grubu tanıtıcısı.Durumu bir durumdan geri yükleme yüklemek için bu tanımlayıcı uygulamanın kullandığı tablo.Hiçbir konuşma grubu alınmak üzere hazır olan iletileri sahip mevcut değilse, uygulama hareketi geri alır ve çıkar.

  3. Uygulama, kuyruktan bir veya daha fazla olan iletileri alır.Uygulama bir Konuşma grup tanıtıcısı varsa, uygulama bu konuşmaya grubu iletileri konuşma grubu tanımlayıcısını kullanır.Daha fazla ileti alınmak üzere kullanılabilen, uygulama hareketi tamamlar ve adım 1'için [NULL]'ı verir.

  4. Uygulama, ileti türü adını temel alarak iletilerin içeriğini doğrular.

  5. Uygulama, ileti türü adı ve iletinin içeriğini temel alarak iletileri işler.

  6. Uygulama, gelen işlem sonucu iletileri gönderir.

  7. Uygulama, uygulama durumunda saklar, durumunu güncelleştirir tablo, birincil anahtar olarak konuşma grubu tanımlayıcısını kullanarak tablo.

  8. Uygulama, daha fazla ileti olup olmadığını denetlemek için adım 3 döndürür.

Uygulama kesin yapısını, uygulama, iletişim stil uygulama, uygulamayı hedef hizmetin başlatan bir hizmet olup ve olup Hizmet Aracısı veya uygulamayı etkinleştirir gereksinimlerine bağlıdır.

Örneğin, önceki adımda anlatılan döngü işleme başlamadan önce başlatan bir uygulama, bir ileti gönderir.Başlatan hizmetin, başka bir programdan bir ileti gönderebilir veya saklı yordam ve bir etkinleştirme saklı yordam başlatan hizmet sıranın.Örneğin, bir sipariş giriş uygulaması sırada girmeye görüşmeyi başlatan bir harici Web uygulaması ekleyebilirsiniz.Sipariş girildikten sonra dış uygulama çalışır durumda kalması değil.Yanıt sırası hizmetten döndürdüğünde başlatan hizmet etkinleştirme saklı yordamında, sipariş teyidi gönderir.Etkinleştirme, saklı yordam hedef hizmet tarafından döndürülen Hizmet Aracısı hata iletilerini işleme ve siparişi olmayan Onaylandı, bildirimleri gönderir.

Alternatif olarak, farklı bir programdan bir ileti göndermek yerine, başlatan bir uygulama ileti gönderme ve işleme döngü aynı programının bir parçası başlatın.Bu farklılıkların dikkate almadan, temel anahat aynı kalır.

Çok sayıda aynı iletileri işleyen uygulama konuşma grubu alınan iletilerin sayısını tutmak ve sonra bir işleme bir hareketi tamamlamak belirli bir ileti sayısı.Bu sayacı ve yürütme stratejisini hareketleri oldukça kısa tutmak bir uygulama sağlar ve farklı konuşma grupları işlem uygulama sağlar.

Örnek

Aşağıdaki Transact-SQL Örneğin, sıradaki tüm iletileri işler MyServiceQueue. Ileti işleme en az düzeydedir. Ileti olup olmadığını bir EndDialog or Hata iletinin kodunu, konuşmayı sona erdirir.Diğer herhangi bir iletinin kod ileti XML betimlemesi oluşturur ve bir sonuç üretir küme XML konuşma tanıtıcısı ve ileti türü adı içerir.Ileti yok, 500 milisaniye kullanılabilir olduğunda, kod çıkılıyor.

Kolaylık olması için komut dosyasını her ileti için küme bir sonuç üretir.Sıradan okuma sırasında bir hata ortaya çıkarsa, herhangi bir sonuç üreten olmadan komut dosyası değişiklikleri kaydeder.Bu nedenle, bu komut dosyası sessizce hataya neden olan tüm iletileri silecektir.

Not

Komut dosyası yalnızca iletileri görüntülediğinden, bu komut için hiçbir zarar iletileri olasıdır.Bu nedenle, komut dosyası zarar iletileri işlemek için kod içermez.Bir üretim uygulama zarar iletileri işleyecek şekilde yazılması gerekir.Zararlı iletileri hakkında daha fazla bilgi için bkz: Zarar iletisi işleme.

USE AdventureWorks ;
GO

-- Process all conversation groups.

WHILE (1 = 1)
BEGIN

DECLARE @conversation_handle UNIQUEIDENTIFIER,
        @conversation_group_id UNIQUEIDENTIFIER,
        @message_body XML,
        @message_type_name NVARCHAR(128);


-- Begin a transaction, one per conversation group.

BEGIN TRANSACTION ;

-- Get next conversation group.

WAITFOR(
   GET CONVERSATION GROUP @conversation_group_id FROM MyServiceQueue),
   TIMEOUT 500 ;

-- Restore the state for this conversation group here

-- If there are no more conversation groups, break.

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

    -- Process all messages in the conversation group.

    WHILE 1 = 1
    BEGIN

        -- Get the next message.

        RECEIVE
           TOP(1)
           @conversation_handle = conversation_handle,
           @message_type_name = message_type_name,
           @message_body =
           CASE
              WHEN validation = 'X' THEN CAST(message_body AS XML)
              ELSE CAST(N'<none/>' AS XML)
          END
       FROM MyServiceQueue
       WHERE conversation_group_id = @conversation_group_id;

       -- If there is no message, or there is an error
       -- reading from the queue, break.

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

       -- Process the message. In this case, the program ends the conversation
       -- for Error and EndDialog messages. For all other messages, the program
       -- produces a result set with information about the message.

       SELECT @conversation_handle,
              @message_type_name,
              @message_body ;

       -- If the message is an end dialog message or an error,
       -- end the conversation. Notice that other conversations
       -- in the same conversation group may still have messages
       -- to process. Therefore, the program does not break after
       -- ending the conversation.

       IF @message_type_name =
              'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
          OR @message_type_name =
              'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
       BEGIN
          END CONVERSATION @conversation_handle ;
       END ;

    END ; -- Process all messages in conversation group.

   COMMIT TRANSACTION ;

END ; -- Process all conversation groups.