我最近开始为我的一个项目使用SQS。我正在使用 @SQSListner 使消费者收听消息和进行处理。
public class SQSListener {
private static Object lock = new Object();
String queueName = "my_queue"
@SqsListener(value = queueName, deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
@JmsListener(destination = queueName)
public void handle(String message) throws Exception {
synchronized (lock) {
log.info("received message {} from queue '{}'", message, queueName);
try {
JSONObject jsonObject = new JSONObject(message);
String val = jsonObject.getString("key");
if(val != null) {
//Hit external service
} else {
throw new IllegalArgumentException("Invalid data");
}
} catch (JSONException e) {
log.error("Error occurred while getting merchantId :" ,e);
} catch (Throwable t) {
log.error ("catch....")
}
}
}
}
在我的情况下,删除策略为 ON_SUCCESS 。 文档说:
/**
* Deletes message when successfully executed by the listener method. If an exception is thrown by the
* listener method, the message will not be deleted.
*/
ON_SUCCESS
我的疑问:
我进行了很多搜索,但没有明确提及出现异常时它将如何处理消息。我可以假设我得到了JSONException。在那种情况下会发生什么。它是否从队列中删除消息。就我而言,我再也找不到消息了(如果侦听器方法抛出异常,则消息将不会被删除)是什么意思。
解决方案: 我已经解决了。问题出在这里,我发现了错误。相反,当我抛出错误时它起作用了。
进一步查询 重新排队spring或AWS-SQS的属性吗?