使用Ballerina RabbitMQ客户端设置RabbitMQ队列的TTL与过期时间
在Ballerina RabbitMQ客户端设置TTL的两种实现方式
1. 队列级TTL(队列自动过期删除)
当队列在指定时间内无任何操作(无消费者、无消息入队/出队),RabbitMQ会自动删除该队列。在Ballerina中声明队列时,通过arguments参数指定x-expires(单位:毫秒)完成配置。
示例代码:
import ballerina/rabbitmq; public function main() returns error? { rabbitmq:Client rabbitmqClient = check new rabbitmq:Client(rabbitmq:DEFAULT_HOST); // 声明60秒未使用则自动删除的队列 rabbitmq:QueueConfiguration queueConfig = { arguments: { "x-expires": 60000 } }; check rabbitmqClient->declareQueue("expiring-queue", queueConfig); // 后续业务操作:发送/消费消息等 check rabbitmqClient->close(); }
2. 消息级TTL(队列中消息自动过期)
队列中的未消费消息会在指定时间后被自动丢弃,支持两种配置方式:
2.1 队列默认消息TTL(所有消息统一过期)
声明队列时通过arguments设置x-message-ttl(单位:毫秒),队列内所有未被消费的消息都会遵循该过期时间。
示例代码:
import ballerina/rabbitmq; public function main() returns error? { rabbitmq:Client rabbitmqClient = check new rabbitmq:Client(rabbitmq:DEFAULT_HOST); // 声明队列,设置所有消息默认10秒后过期 rabbitmq:QueueConfiguration queueConfig = { arguments: { "x-message-ttl": 10000 } }; check rabbitmqClient->declareQueue("message-ttl-queue", queueConfig); // 发送消息,自动继承队列的TTL配置 check rabbitmqClient->publishMessage({content: "Hello, RabbitMQ with TTL".toBytes()}, queue = "message-ttl-queue"); check rabbitmqClient->close(); }
2.2 单个消息自定义TTL(针对特定消息设置过期时间)
发送消息时,通过rabbitmq:MessageProperties的expiration字段(字符串形式的毫秒数)为单个消息设置独立TTL,优先级高于队列默认TTL。
示例代码:
import ballerina/rabbitmq; public function main() returns error? { rabbitmq:Client rabbitmqClient = check new rabbitmq:Client(rabbitmq:DEFAULT_HOST); // 声明普通队列(也可同时设置默认TTL) check rabbitmqClient->declareQueue("per-message-ttl-queue"); // 发送一条5秒后过期的消息 rabbitmq:MessageProperties props = { expiration: "5000" }; check rabbitmqClient->publishMessage( {content: "Message with 5s TTL".toBytes(), properties: props}, queue = "per-message-ttl-queue" ); // 发送一条15秒后过期的消息 props.expiration = "15000"; check rabbitmqClient->publishMessage( {content: "Message with 15s TTL".toBytes(), properties: props}, queue = "per-message-ttl-queue" ); check rabbitmqClient->close(); }
注意事项
x-expires和x-message-ttl需传入非负整数,0表示立即过期(队列立即删除/消息立即丢弃)。- 单个消息的
expiration字段必须是字符串类型的数字,不能直接传入整数。 - 消息过期后不会被立即删除,会在RabbitMQ内部清理任务触发时移除,或当消费者尝试消费该消息时被检测并丢弃。
内容的提问来源于stack exchange,提问作者Azeem Muzammil
相关产品推荐
相关产品推荐

