我有N个顾客,他们每个人都有自己的队列使用扇形交换:q-1que-2.Que
发布者将消息发布到扇形交换,即Publisher->pub msg->(对所有Que-1 - Que-N)
每个客户都会读取自己的队列客户i- reads Que-i。
问题是:
我如何解决这个问题:如果没有客户在K分钟内阅读这个Que-*,那么这个Que应该用消息删除。也就是说,发布者可以发布消息,但如果没有客户阅读,则应该删除它。
发布于 2021-12-18 08:34:46
参数x-expires完成了我所需的任务:
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-expires", 1800000);
channel.queueDeclare("myqueue", false, false, false, args);
发布于 2022-02-08 07:09:26
TTL也可以设置在队列上,而不仅仅是队列内容。队列只有在没有使用时才会在一段时间后过期(例如,没有使用者)。此特性可与自动删除队列属性一起使用。
可以通过将x-expires
参数设置为queue.declare
或通过设置expires
策略来设置给定队列的过期时间。这控制队列在被自动删除之前可以被使用多久。未使用意味着队列没有使用者,队列最近没有被重新声明(重新声明更新租约),并且至少在过期期间没有调用basic.get
。
x-expires
参数或expires
策略的值描述过期时间(以毫秒为单位)。它必须是正整数(与message不同,不能是0)。因此,值1000意味着将删除一个未使用1秒的队列。
使用策略为队列定义队列TTL
以下策略使所有队列在上次使用后30分钟后过期:
rabbitmqctl set_policy expiry ".*" '{"expires":1800000}' --apply-to queues
在声明期间使用x参数为队列定义队列TTL。
Java中的这个示例创建了一个队列,该队列在未使用30分钟后过期。
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-expires", 1800000);
channel.queueDeclare("myqueue", false, false, false, args);
有关详细信息,请参阅下面的链接:
https://stackoverflow.com/questions/70392605
复制相似问题