Boto3: есть ли способ изящно прервать SQS длительный запрос на получение сообщений? - PullRequest
2 голосов
/ 13 апреля 2019

Я успешно создал метод, который извлекает сообщения из очереди SQS с помощью длинного опроса, который выглядит следующим образом:

def dequeue_message(self, callback):
    result = self.queue.receive_messages(MaxNumberOfMessages=1)
    if len(result) != 0:
        body = result[0].body
        try:
            callback(body)
            result.delete()
        except Exception as e:
            print("message not dequeued because an error occurred"
                  "when running callback: " + str(e))

Но я не смог найти способ остановить опрос, не убив работающий процесс Python (или, очевидно, дождавшись тайм-аута). Что я могу сделать?

1 Ответ

0 голосов
/ 07 мая 2019

Вы можете просто сделать это, используя флаг.Предположим, что кнопка должна прервать процесс опроса.Вы обновляете флаг, как только кнопка нажата.Затем, когда опрос возвращает набор сообщений, вы проверяете флаг и игнорируете обработку сообщений.Не волнуйтесь, сообщения все еще будут в очереди.см .: ссылка

Amazon SQS не удаляет сообщение автоматически после его получения, если вы не получили сообщение (например, потребители могутпотерпеть неудачу или потерять связь).Чтобы удалить сообщение, вы должны отправить отдельный запрос, подтверждающий, что сообщение вам больше не нужно, потому что вы успешно получили и обработали его.

SAMPLE CODE :

# This is the flag to check for interruptions
is_interrupted = False

# This function will set the flag if an interruption is occurred
def interrupt_polling():
    is_interrupted = True


def dequeue_message(self, callback):
    result = self.queue.receive_messages(MaxNumberOfMessages=1)

    # this is the check that will bypass the Polling process
    # Handle this logic as required
    if is_interrupted:
        # assuming that this needs to be reset to False
        is_interrupted = False
        return

    if len(result) != 0:
        body = result[0].body
        try:
            callback(body)
            result.delete()
        except Exception as e:
            print("message not dequeued because an error occurred"
                  "when running callback: " + str(e))

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...