Aracılığıyla paylaş


Hizmet Aracısı uygulama anahat

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

  1. Uygulama bir hareket başlar.

  2. Uygulamanın durumunu korur, uygulama konuşma grubu tanımlayıcısı alır.Bir durumdan duruma geri yükleme yüklemek için bu tanımlayıcı uygulamanın kullandığı tablo.konuşma grubu yok olan alınabilmesi hazır olan iletileri varsa, uygulama hareketi geri alır ve çıkar.

  3. Uygulama, sıradan bir veya daha fazla ileti alır.Uygulama bir görüşme grup tanımlayıcısı varsa, uygulama bu konuşma grubu iletileri almak için konuşma grup tanımlayıcısını kullanır.Daha fazla ileti teslim alınması kullanılabilir, uygulama hareketi tamamlar ve adım 1'i döndürür.

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

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

  6. Uygulama işlenmesini neden herhangi bir ileti gönderir.

  7. Uygulamanın durumunu korur, uygulama durumunu güncelleştirir kullanarak tablo konuşma grubu tablo için birincil anahtar olarak tanımlayıcı.

  8. Uygulama daha fazla ileti kullanılabilir olup olmadığını denetlemek için adım 3'e verir.

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

Örneğin, önceki adımlarda anlatılan işlemleri döngü başlamadan önce başlatan bir uygulama bir ileti gönderir.Başlatan hizmet başka bir programdan bir ileti gönderebilir veya saklı yordamve sonra bir etkinleştirme saklı yordam başlatan hizmet sıra için.Örneğin, bir sipariş girişi uygulaması siparişi girmek için görüşme başlatan bir harici Web uygulaması dahil edebilirsiniz.Sipariş girildikten sonra dış uygulamayı çalışır durumda kalması değil.Etkinleştirme saklı yordam sipariş hizmetnden yanıt verdiğinde başlatan hizmet sipariş teyidi gönderimleri için.Etkinleştirme saklı yordam de, hedef hizmet tarafından döndürülen tüm Hizmet Aracısı hata iletilerini işler ve sipariş doğrulanmadı bildirimleri gönderir.

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

Alınan iletilerin sayısını tutar ve çok sayıda aynı konuşma grubu iletileri işleyen bir uygulama ve yürütme sonra bir işlem bir hareket belirli bir ileti sayısı.Bu sayı ve yürütme strateji uygulama işlemleri oldukça kısa tutmak izin verir ve farklı konuşma grupları işlemek uygulama sağlar.

Örnek

Aşağıdaki Transact-SQL örnek işler tüm iletiler sıraya MyServiceQueue.İleti işleme en az düzeydedir.İleti ise bir EndDialog veya hata kod ileti görüşme sona erer.Diğer ileti için kod ileti bir xml gösterimini oluşturur ve konuşma tanıtıcısı, ileti türü adı ve xml içeren bir sonuç küme üretir.Hiçbir ileti 500 milisaniye için kullanılabilir olduğunda, bir kod çıkar.

Kolaylık için komut dosyası üretir bir sonuç küme her ileti için.Sıradan okumayı denerken hata oluşursa, komut dosyasını herhangi bir sonuç üretmeden değişiklikleri kaydeder.Bu nedenle, bu komut dosyası, hataya neden olan herhangi bir ileti sessizce kaldıracak.

Not

Komut dosyası yalnızca iletileri görüntüler nedeniyle hiçbir zararlı ileti bu komut dosyası için kullanılabilir.Bu nedenle, komut dosyası zarar iletileri işlemek için kod içermez.Üretim uygulama zarar iletileri işleyecek şekilde yazılması gerekir.Zarar iletileri hakkında daha fazla bilgi için bkz: Poison iletileri işleme.

USE AdventureWorks2008R2 ;
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.