

のバージョン 4 (V4) AWS SDK for .NET がリリースされました。

重要な変更とアプリケーションの移行については、[「移行トピック](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)」を参照してください。

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Message Processing Framework for .NET で AWS メッセージを使用する
<a name="msg-proc-fw-consume"></a>

 AWS Message Processing Framework for .NET では、フレームワークまたはいずれかのメッセージングサービスを使用して[発行された](msg-proc-fw-publish.md)メッセージを消費できます。メッセージはさまざまな方法で使用できます。その一部を以下に示します。

## メッセージハンドラー
<a name="handle-a-message"></a>

メッセージを使用するには、処理するメッセージタイプごとに `IMessageHandler`インターフェイスを使用してメッセージハンドラーを実装します。メッセージタイプとメッセージハンドラー間のマッピングは、プロジェクトの起動時に設定されます。

```
await Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        // Register the AWS Message Processing Framework for .NET
        services.AddAWSMessageBus(builder =>
        {
            // Register an SQS Queue that the framework will poll for messages.
            // NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue.
            builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd");

            // Register all IMessageHandler implementations with the message type they should process. 
            // Here messages that match our ChatMessage .NET type will be handled by our ChatMessageHandler
            builder.AddMessageHandler<ChatMessageHandler, ChatMessage>();
        });
    })
    .Build()
    .RunAsync();
```

次のコードは、メッセージのサンプル`ChatMessage`メッセージハンドラーを示しています。

```
public class ChatMessageHandler : IMessageHandler<ChatMessage>
{
    public Task<MessageProcessStatus> HandleAsync(MessageEnvelope<ChatMessage> messageEnvelope, CancellationToken token = default)
    {
        // Add business and validation logic here.
        if (messageEnvelope == null)
        {
            return Task.FromResult(MessageProcessStatus.Failed());
        }

        if (messageEnvelope.Message == null)
        {
            return Task.FromResult(MessageProcessStatus.Failed());
        }

        ChatMessage message = messageEnvelope.Message;

        Console.WriteLine($"Message Description: {message.MessageDescription}");

        // Return success so the framework will delete the message from the queue.
        return Task.FromResult(MessageProcessStatus.Success());
    }
}
```

外部には、フレームワークで使用されるメタデータ`MessageEnvelope`が含まれています。その`message`プロパティはメッセージタイプです (この場合は `ChatMessage`）。

`MessageProcessStatus.Success()` に戻って、メッセージが正常に処理され、フレームワークが Amazon SQS キューからメッセージを削除することを示すことができます。を返すと`MessageProcessStatus.Failed()`、メッセージはキューに残り、再度処理したり、設定されている場合は[デッドレターキュー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)に移動したりできます。

## 長時間実行されるプロセスでのメッセージの処理
<a name="long-running-process"></a>

SQS キュー URL `AddSQSPoller`を使用して を呼び出し、キュー[https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice)を継続的にポーリングしてメッセージを処理する長時間実行を開始できます。

```
await Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        // Register the AWS Message Processing Framework for .NET
        services.AddAWSMessageBus(builder =>
        {
            // Register an SQS Queue that the framework will poll for messages.
            // NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue.
            builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", options => 
            {
                // The maximum number of messages from this queue that the framework will process concurrently on this client.
                options.MaxNumberOfConcurrentMessages = 10;

                // The duration each call to SQS will wait for new messages.
                options.WaitTimeSeconds = 20; 
            });

            // Register all IMessageHandler implementations with the message type they should process.
            builder.AddMessageHandler<ChatMessageHandler, ChatMessage>();
        });
    })
    .Build()
    .RunAsync();
```

### SQS Message Poller の設定
<a name="config-msg-poller"></a>

SQS メッセージポーラーは、 を呼び出す`SQSMessagePollerOptions`ときに によって設定できます`AddSQSPoller`。
+ `MaxNumberOfConcurrentMessages` - キューから同時に処理するメッセージの最大数。デフォルト値は 10 です。
+ `WaitTimeSeconds` - SQS `ReceiveMessage` 呼び出しがメッセージがキューに到着するまで待機してから戻る期間 (秒単位）。メッセージが使用可能な場合、呼び出しは よりも早く返されます`WaitTimeSeconds`。デフォルト値は 20 です。

**メッセージ可視性タイムアウト処理**

SQS メッセージには[可視性タイムアウト](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)期間があります。あるコンシューマーが特定のメッセージの処理を開始すると、そのコンシューマーはキューに残りますが、複数回処理されないように他のコンシューマーからは非表示になります。再度表示される前にメッセージが処理および削除されない場合、別のコンシューマーが同じメッセージの処理を試みる可能性があります。

フレームワークは、現在処理中のメッセージの可視性タイムアウトを追跡して延長しようとします。この動作は、 を呼び出す`SQSMessagePollerOptions`ときに で設定できます`AddSQSPoller`。
+ `VisibilityTimeout` - メッセージを受信した秒単位の時間は、後続の取得リクエストから非表示になります。デフォルト値は 30 です。
+ `VisibilityTimeoutExtensionThreshold` - メッセージの可視性タイムアウトが期限切れのこの数秒以内になると、フレームワークは可視性タイムアウトを (別の`VisibilityTimeout`秒だけ) 延長します。デフォルト値は 5 です。
+ `VisibilityTimeoutExtensionHeartbeatInterval` - フレームワークが有効期限が切れてから数秒以内にメッセージをチェックし、可視性タイムアウトを延長する`VisibilityTimeoutExtensionThreshold`秒単位の頻度。デフォルト値は 1 です。

 次の例では、フレームワークは 1 秒ごとに、まだ処理中のメッセージをチェックします。これらのメッセージが再び表示されてから 5 秒以内の場合、フレームワークは各メッセージの可視性タイムアウトをさらに 30 秒自動的に延長します。

```
// NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue.
builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", options => 
{
    options.VisibilityTimeout = 30;
    options.VisibilityTimeoutExtensionThreshold = 5;
    VisibilityTimeoutExtensionHeartbeatInterval = 1;
});
```

## AWS Lambda 関数でのメッセージの処理
<a name="lambda-functions"></a>

Message AWS Processing Framework for .NET は、[SQS と Lambda の統合](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html)で使用できます。これは `AWS.Messaging.Lambda`パッケージによって提供されます。開始するには、[README](https://github.com/aws/aws-dotnet-messaging/blob/main/src/AWS.Messaging.Lambda/README.md) を参照してください。