2017-07-12 18 views
2

私はAzureサービスバスキューに応答するいくつかの機能を書いています。この現在指定されたキュー上の世論調査とのonMessageは、それを呼び出し元のクラスのメソッドへのコールバックトリガー:C#AzureサービスバスキューOnMessageコールバック

partial class Class1 
    { 
     private void BeginProcessing() 
     { 
      serviceBusHelper.Listen(QueueType.Inbound, HandleTransaction); 
     } 
     private bool HandleTransaction(BrokeredMessage message) 
     { 
      ...  
     } 
    } 

そしてサービス・バスのヘルパークラスを:それはに正しく接続されて

public class ServiceBusHelper : IServiceBusHelper 
{ 
    ManualResetEvent CompletedResetEvent = new ManualResetEvent(false); 

    public void Listen(QueueType queue, Action<BrokeredMessage> callback) 
    { 

     switch (queue) 
     { 
      case QueueType.Inbound: 
       inboundClient.OnMessage(message => 
       { 
        try 
        { 
         callback(message); 
        } 
        catch (Exception ex) 
        { 
         ... 
        } 
        CompletedResetEvent.WaitOne(); 
       }); 
       break; 
      ... 
     } 
} 

空白のサービスバスキューとメッセージを取得しますが、コールバックは決して実際には起動しません。私が達成しようとしているのは、OnMessageイベントに継続的に応答し、OnMessageがServiceBusHelperクラスから実際にトリガーされているにも関わらず、新しいワーカー(クラス1から)をトリガーするサービスです。

答えて

0

私は、非同期のOnMessageの対応に変更することで、これを実現することができました。私は根本的な原因がOnMessageに対してOnMessageOptionsを指定しなかったか、またはCompletedResetEventが私の予想どおりにやり取りしていないことに関連していると考えています。

public void Listen(QueueType queue, Action<BrokeredMessage> callback) 
    { 
      OnMessageOptions options = new OnMessageOptions 
      { 
       MaxConcurrentCalls = maxConcurrent, 
       AutoComplete = false 
      }; 

      switch (queue) 
      { 
       case QueueType.Inbound: 
        inboundClient.OnMessageAsync(async message => 
        { 
         bool shouldAbandon = false; 
         try 
         { 
          callback(message); 

          // complete if successful processing 
          await message.CompleteAsync(); 
         } 
         catch (Exception ex) 
         { 
          shouldAbandon = true; 
          Debug.WriteLine(ex); 
         } 

         if (shouldAbandon) 
         { 
          await m.AbandonAsync(); 
         } 
        }, options); 
        break; 

       ... 
      } 
    } 
0

コールバックは実際には起動しないようです。

問題を再現するため、コンソールアプリケーションで次のコードを使用してテストを行いますが、問題なく動作します。

public static void processmessage() 
{ 
    string connectionString = "{connectionstring here}"; 

    var queueName = "{queue name}"; 

    var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 
    var options = new OnMessageOptions(); 
    options.AutoComplete = false; 

    try 
    { 
     client.OnMessage(message => 
     { 
      HandleTransaction(message); 
     }, options); 
    } 
    catch (Exception) 
    { 

    } 
} 

private static void HandleTransaction(BrokeredMessage message) 
{ 
    Console.WriteLine(String.Format("Message body: {0}", message.GetBody<String>())); 
} 

可能な場合は、make it return voidprivate void HandleTransaction(BrokeredMessage message)private bool HandleTransaction(BrokeredMessage message)を変更しようとすることができ、それが正常に動作するかどうかを確認してください。

+0

可能であれば、問題を再現するためにコードまたはサンプルを共有してください。 –

関連する問題