目前,我有一个SQS队列,在5次重试后将消息移动到DLQ,我使用spring SqsListener读取队列:
@SqsListener(
value = ["\${messaging.queue.orders}"],
deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS
)
fun handleOrders(message: String) {
// process order
}现在,我试图使用一个功能切换来暂停侦听器,但是我找不到一种方法,我尝试手动使用Acknowledgment,但是如果我不发送成功的ack事件,则消息移动到DLQ:
@SqsListener(
value = ["\${messaging.queue.orders}"],
deletionPolicy = SqsMessageDeletionPolicy.NEVER
)
fun handleOrders(message: String, ack: Acknowledgment) {
if(toggle.orders.enabled) {
// process order
ack.acknowledge()
}
// else don not process or ack the message
}正如我所说的,上面的解决方案的问题是,如果我不执行ack.acknowledge(),消息在第五次之后被移动到DLQ,所以如果禁用切换,我需要暂停/停止SqsListener来从队列中提取消息,如果再次启用它,则启动/恢复。
发布于 2022-03-21 08:57:29
您可以使用SqsListener切换@ConditionalOnExpression的创建
比如:
@SqsListener(
value = ["\${messaging.queue.orders}"],
deletionPolicy = SqsMessageDeletionPolicy.NEVER
)
@ConditionalOnExpression("\${toggle.orders.enabled:false}")
fun handleOrders(message: String) {
// process order
}并在application.yaml中添加以下内容
toggle:
orders:
enabled: true如果更改该属性,则除非使用spring进行配置,否则必须重新启动服务器。
您也可以使用@ConditionalOnProperty(prefix = "toggle", name = "orders.enabled")
https://stackoverflow.com/questions/71551988
复制相似问题