RabbitMQ流插件x-stream-offset参数支持的正确日期格式是什么?
关于RabbitMQ Stream插件x-stream-offset参数的时间戳传参说明
报错原因
x-stream-offset参数的合法取值有三类,时间戳类的取值必须是AMQP 0.9.1协议定义的timestamp专属类型,不能直接传字符串或普通整数:
- 预定义字符串:
first/last/next,直接传字符串即可生效 - 消息偏移量:普通整数,代表从第N条消息开始消费
- 时间戳:必须为AMQP timestamp类型,代表从该时间点之后的第一条消息开始消费
你之前的所有错误写法都不符合类型要求:
- 传ISO8601、YYYY-MM-DD格式的字符串:属于长文本类型,不在预定义字符串范围内,直接触发参数校验失败
- 传毫秒级整数:既不属于合法的消息偏移量范围,也不被识别为时间戳类型
- 直接传
Time.now.to_i生成的秒级Unix时间戳整数:会被识别为普通整数类型的消息偏移量,数值远大于当前队列的最大消息序号,所以校验不通过
正确写法(Ruby Bunny客户端)
Bunny客户端提供了Bunny::Timestamp类用于封装AMQP timestamp类型的参数,你只需要把秒级Unix时间戳传入该类封装后再赋值给x-stream-offset即可:
require 'bunny' require 'json' # 目标时间解析为Time对象 target_time = Time.parse('2021-08-28T13:40:31-07:00') # 封装为Bunny::Timestamp类型,传入秒级时间戳 timestamp_offset = Bunny::Timestamp.new(target_time.to_i) opts = { exclusive: false, manual_ack: true, block: true, arguments: { 'x-stream-offset': timestamp_offset } } queue.subscribe(opts) do |delivery_info, _properties, payload| msg = JSON.parse(payload) puts msg ch.ack(delivery_info.delivery_tag, false) end
内容的提问来源于stack exchange,提问作者alilland
相关产品推荐
相关产品推荐

