Amazon SQS でメッセージの可視性タイムアウトを指定する - AWS SDK for Ruby

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

Amazon SQS でメッセージの可視性タイムアウトを指定する

Amazon SQS で、メッセージが受信された直後は、メッセージはキューに残ったままです。他のコンシューマーが再度メッセージを処理しないようにするため、Amazon SQS は可視性タイムアウトを設定します。これは、Amazon SQS によって他の消費コンポーネントがそのメッセージを受信および処理できなくなる期間です。詳細については、「可視性タイムアウト」を参照してください。

この例では、AWS SDK for Ruby を Amazon SQS で使用して、以下のことを行います。

  1. Aws::SQS::Client#get_queue_url を使用して、既存のキューの URL を取得する。

  2. Aws::SQS::Client#receive_message を使用して最大 10 件のメッセージを受信する。

  3. Aws::SQS::Client#change_message_visibility を使用して、受信後にメッセージが表示されない期間を指定する。

前提条件

コード例を実行する前に、以下で説明されているように、AWS SDK for Ruby をインストールし、設定する必要があります。

また、キュー my-queue を作成する必要があります。これは Amazon SQS コンソールで行うことができます。

# Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # This file is licensed under the Apache License, Version 2.0 (the "License"). # You may not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS # OF ANY KIND, either express or implied. See the License for the specific # language governing permissions and limitations under the License. # Demonstrates how to specify the time interval during which messages to a queue are not visible after being received. require 'aws-sdk-sqs' # v2: require 'aws-sdk' sqs = Aws::SQS::Client.new(region: 'us-east-1') begin queue_name = "my-queue" queue_url = sqs.get_queue_url(queue_name: queue_name).queue_url receive_message_result_before = sqs.receive_message({ queue_url: queue_url, max_number_of_messages: 10 # Receive up to 10 messages, if there are that many. }) puts "Before attempting to change message visibility timeout: received #{receive_message_result_before.messages.count} message(s)." receive_message_result_before.messages.each do |message| sqs.change_message_visibility({ queue_url: queue_url, receipt_handle: message.receipt_handle, visibility_timeout: 30 # This message will not be visible for 30 seconds after first receipt. }) end # Try to retrieve the original messages after setting their visibility timeout. receive_message_result_after = sqs.receive_message({ queue_url: queue_url, max_number_of_messages: 10 }) puts "\nAfter attempting to change message visibility timeout: received #{receive_message_result_after.messages.count} message(s)." rescue Aws::SQS::Errors::NonExistentQueue puts "Cannot receive messages for a queue named '#{receive_queue_name}', as it does not exist." end