我的问题不是很容易,但我相信我会在你的帮助下找到解决我的问题的办法。我有一个微服务,可以读取AWS队列中的消息,并将其保存在Redis中。
在AWS上,我有两个队列:
我想:
我该怎么做?在AWS上,我已经将标准队列(AQueue)设置为在消息将失败5次时向DeadLetterQueue发送消息。
我的听众:
@SqsListener(value = "${amazon.sqs.destination}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
public void receive(String requestJSON, Acknowledgment acknowledgment) {
try (Jedis jedis = jedisPool.getResource()) {
if (redisPassword != null && !redisPassword.isEmpty()) {
jedis.auth(redisPassword);
}
long key = jedis.incr("Trace:");
Trace trace = Trace.fromJSON(requestJSON);
trace.setTechnicalId(Long.toString(key));
traceRepository.save(trace);
acknowledgment.acknowledge();
}catch (IOException e) {
log.error("Parse error: " + e.getMessage());
queueMessagingTemplate.convertAndSend(deadLetterQueue, requestJSON);
acknowledgment.acknowledge();
} catch(Exception e){
log.error("Problem with NOSQL database Redis: " + e.getMessage());
}不幸的是,即使我没有调用acknowledgment.acknowledge();,5次尝试之后我的消息也会转移到DeadLetterQueue。
发布于 2018-10-24 17:21:32
听起来你的逻辑被颠倒了--不加标记意味着它将被视为失败(并重新尝试,并最终移到死信队列中)。当您想要将消息标记为已消耗的消息时,不要对其进行ACK,如果您希望它重试/DLQ。
(注意-我不熟悉这里涉及的spring工具,但我假设直接映射到核心SQS概念)
发布于 2018-10-24 22:16:29
逻辑应该是:
MessageHandle删除消息MessageHandle。https://stackoverflow.com/questions/52967781
复制相似问题