Отпустите сообщение обратно в AWS SQS со временем видимости 20 секунд - PullRequest
0 голосов
/ 06 августа 2020

Я использую spring -boot: 2.2.6.RELEASE и aws - java -sdk-sqs: 1.11.415 . У меня есть слушатель, который опрашивает сообщение от SQS. Существует условие, при котором слушатель обрабатывает сообщение, и если условие не выполняется, мы должны поместить сообщение обратно в очередь, и оно должно быть доступно для любого другого компонента или того же слушателя через 20 секунд. Я не уверен, как достичь более позднего, поместите сообщение обратно в очередь, и оно должно быть видно через 20 секунд другим слушателям,

Пожалуйста, найдите ниже код для справки,

@Autowired
private QueueMessagingTemplate messagingTemplate;

@PostMapping("/employee")
public String save(@RequestBody Employee employee){
    Map<String,Object> headers = new HashMap<>();
    headers.put("subject", "send employee details to sqs");
    headers.put("name","Donald");
    headers.put("traceId","sample");
    messagingTemplate.convertAndSend("sample-standard-queue", employee, headers);
    return "success";
}

@SqsListener(value = "sample-standard-queue")
public void receivesqs(Employee message, @Headers Map<String,Object> headers, @Header("name") String name) {

    // Retrieve employee details from DB using message.id
    // If it is in-progress then place the message back to the queue and it should be visible after 20secs
}

Я видел это сообщение , но оно помещает сообщение обратно в очередь, и оно будет немедленно доступно другим читателям. В моем случае он должен быть доступен через 20 секунд.

1 Ответ

0 голосов
/ 06 августа 2020

Как упоминалось здесь Ручное подтверждение прослушивателя SQS

@SqsListener(value = "sample-standard-queue", deletionPolicy = SqsMessageDeletionPolicy.NEVER) не удаляет сообщения, вы можете удалить их вручную, указав параметр подтверждения.

 @SqsListener(value = "sample-standard-queue", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void receivesqs(Employee message, @Headers Map<String,Object> headers, @Header("name") String name,Acknowledgment acknowledgment)  {
        // decide when to acknowledge
        acknowledgment.acknowledge().get();
    }

В соответствии с вашими настройками тайм-аута видимости сообщение снова появится в очереди после истечения времени ожидания видимости в секундах.

...