2016-06-22 2 views
2

メソッドQueueClient.OnMessage(Action<BrokeredMessage>, OnMessageOptions)を使用しようとしています。 OnMessageOptionsでは、私はこの単純なExceptionReceivedイベントコード化:OnMessageOptionsでExceptionReceivedを使用する

void LogErrors(object sender, ExceptionReceivedEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
    Trace.TraceError("Exception captured: " + e.Exception.Message); 
    } 
} 

私の疑問をBrokeredMessagesが発生している時にエラーが発生してログを保存するために、コールバックでprocessendされている「LogErrors」BrokeredMessageを取得する方法です。

+0

例外をスローしてメソッドに到達したかどうか確認できますか? – Thomas

+0

コールバックコードで例外をスローすると、LogErrorsが実行されますが、私の問題は、コールバックで処理されているメッセージをLogErrorsパレメータまたは他の方法で取得する方法です。 –

+0

あなたは送信者パラメータ?パラメータの1つの中に何かを見つけることができるはずです – Thomas

答えて

0

ExceptionReceivedコールバックからメッセージを取得する方法を見てみましたが、情報が引数に存在しません。ここに私のサンプルコードです:あなたが機能でこのラッパーを置くか、または作成することができた後

client.OnMessage(brokeredMessage => 
{ 
    try 
    { 
     // Process the message 
     ... 

     // Complete the message (depends on the) 
     brokeredMessage.Complete(); 
    } 
    catch (Exception ex) 
    { 

     Trace.TraceError("Exception captured: " + ex.Message); 

     // Here you have access to the brokeredMessage so you can log what you want. 
     ...  
     //Abandon the message so that it could be re-process ?? 
     brokeredMessage.Abandon();   
    } 

}, options); 

:あなたの必要性に応じて、

var connectionString = "my-connection-string"; 
var queueName = "my-queue-name"; 
var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 

var options = new OnMessageOptions(); 
options.ExceptionReceived += (sender, args) => 
{ 
    // Neither sender or args contains information about the message being processed 
}; 

client.OnMessage(brokeredMessage => 
{ 
    throw new Exception(); 
}, options); 

、簡単な解決策はのtry/catchの内側にあなたのコールバックをラップすることですQueueClient用の拡張方法:

public static class QueueClientExtensions 
{ 
    public static void OnCustomMessage(this QueueClient queueClient, Action<BrokeredMessage> callback, 
     OnMessageOptions onMessageOptions) 
    { 
     queueClient.OnMessage(message => 
     { 
      try 
      { 
       // process the message 
       callback(message); 

       //complete if success 
       message.Complete(); 
      } 
      catch (Exception ex) 
      { 
       // Here you have access to the brokeredMessage so you can log what you want. 
       // message.GetBody<string>() 
       Trace.TraceError("Exception captured: " + ex.Message); 

       //Abandon the message so that it could be re-process 
       message.Abandon(); 
      } 

     }, onMessageOptions); 
    } 
} 

と同じように、このメソッドを呼び出します。

var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName); 
queueClient.OnCustomMessage(brokeredMessage => 
{ 
    // Process the message 
    ... 
}, new OnMessageOptions()); 
+0

BrokeredMessageがExceptionReceivedコールバックで利用できなかったことを確認してくれてありがとうございます。シンプルなtry/catchソリューションは私には良いことです! –

+0

@AlbertAixendri、もしあなたが大丈夫なら答えを受け入れることができますか? – Thomas

関連する問題