1

サービス バス トリガーを備えた Azure Function Apps を使用して、サービス バスを読み取り、サービス バス メッセージの内容を処理しています。サービス バスは JSON のシリアル化されたオブジェクトを受け取り、関数アプリ内のオブジェクトに JSON メッセージを逆シリアル化します。ただし、何かがサービス バスに送信されると、何らかの理由でトリガーが 2 回発生し、1 つは JSON メッセージで、もう 1 つはテキスト "Service Bus Message" を含むメッセージです。

2 番目のメッセージの原因がわからないので、思いついたのはサービス バス メッセージを逆シリアル化することであり、「サービス バス メッセージ」で失敗した場合は、例外をキャッチして無視します。ただし、これはこの問題を処理する正しい方法ではないと思います。JSON デシリアライゼーションの実際のエラーは無視されます。2 番目のメッセージを処理する正しい方法は何ですか?

コード例:

using Newtonsoft.Json;

public static void Run(string myQueueItem, ILogger log, out SendGridMessage mailMessage)
{
    MyClass myObject = null;
    try
    {
        myObject = JsonConvert.DeserializeObject<MyClass>(myQueueItem);
        // do stuff
    }
    catch (JsonException je)
    {
        // ignore this exception
    }
    catch (Exception e)
    {
        // handle the other exceptions and send an alert
    }
}

編集: 元の投稿で省略したことの 1 つは、SendGrid 出力もあるということです。それがトリガーに影響を与える理由がわからないので、それを省略しました。ただし、何らかの奇妙な理由で原因である可能性がある場合に備えて、現在追加しています。

編集 2: 問題を強調する完全な作業コードを追加

// Sender
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Newtonsoft.Json;

namespace myapp
{
    class Program
    {
        static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();

        static async Task MainAsync()
        {
            string serviceBusConnectionString = "<your servicebus connectionstring>";
            string queueName = "<your queue name>";
            IQueueClient queueClient = new QueueClient(serviceBusConnectionString, queueName);
            string messageBody = JsonConvert.SerializeObject(new Test());
            var message = new Message(Encoding.UTF8.GetBytes(messageBody));
            await queueClient.SendAsync(message);
            await queueClient.CloseAsync();
        }

        class Test
        {
            public string Text { get; set; } = "test";
        }
    }
}
// Receiver
#r "Newtonsoft.Json"

using System;
using System.Threading.Tasks;
using Newtonsoft.Json;

public static void Run(string myQueueItem, ILogger log)
{
    try
    {
        Test test = JsonConvert.DeserializeObject<Test>(myQueueItem);
        log.LogInformation($"C# ServiceBus queue trigger function processed message: {test.Text}");
    }
    catch (Exception e)
    {
        log.LogInformation($"Exception: {e.Message}");
    }
}

class Test
{
    public string Text { get; set; } = "test";
}

結果:

2019-11-04T08:38:10.544 [Information] Executing 'Functions.test' (Reason='This function was programmatically called via the host APIs.', Id=06e10006-baa6-430f-b5db-9a5eae5c154c)
2019-11-04T08:38:10.659 [Information] Exception: Unexpected character encountered while parsing value: S. Path '', line 0, position 0. // This here is caused by "Service bus message"
2019-11-04T08:38:10.659 [Information] Executed 'Functions.test' (Succeeded, Id=06e10006-baa6-430f-b5db-9a5eae5c154c)
2019-11-04T08:39:02.582 [Information] Executing 'Functions.test' (Reason='New ServiceBus message detected on 'test'.', Id=5d7622a7-cc8d-44c9-8720-626fdbb8cabb)
2019-11-04T08:39:02.583 [Information] Trigger Details: MessageId: 13bba779fd524fa1a0098acd6634aded, DeliveryCount: 1, EnqueuedTime: 11/4/2019 8:39:02 AM, LockedUntil: 11/4/2019 8:39:07 AM
2019-11-04T08:39:02.584 [Information] C# ServiceBus queue trigger function processed message: test // This here is the actual message
2019-11-04T08:39:02.584 [Information] Executed 'Functions.test' (Succeeded, Id=5d7622a7-cc8d-44c9-8720-626fdbb8cabb)
4

1 に答える 1