Expiry (MQLONG)
这是由放置消息的应用程序设置的以十分之一秒为单位的时间段。 在此时间段经过之前,尚未从目标队列中移除的消息将变得可被废弃。
例如,要为到期时间设置 1 分钟,需要设置 MQMD。Expiry 到 600。
此值将递减,以反映消息在目标队列以及任何中间传输队列 (如果放置到远程队列) 上所花费的时间。 消息通道代理程序还可以对其进行递减,以反映传输时间 (如果这些时间很重要)。 同样,将此消息转发到另一个队列的应用程序可能会在必要时减小该值 (如果它已保留此消息相当长的时间)。 但是,到期时间被视为近似,并且无需减小该值以反映较小的时间间隔。
当应用程序使用 MQGET 调用检索消息时,
Expiry
字段表示仍保留的到期时间。
在经过消息的到期时间之后,队列管理器将有资格将其废弃。 当发生浏览或非浏览 MQGET 调用时,如果消息尚未到期,那么将废弃该消息。 例如,非浏览 MQGET 调用 (MQGMO 中的 MatchOptions 字段设置为从 FIFO 有序队列读取 MQMO_NONE) 会废弃所有到期消息,直到第一个未到期消息为止。 使用优先级排序队列时,同一调用将废弃优先级较高的到期消息和在第一条未到期消息之前到达队列的优先级相同的消息。
不会将已到期的消息返回到应用程序 (通过浏览或非浏览 MQGET 调用) ,因此成功 MQGET 调用后消息描述符的 Expiry 字段中的值大于零或特殊值 MQEI_UNLIMITED。
如果将消息放在远程队列上,那么在消息到达目标队列之前,消息在中间传输队列上时可能会到期 (并被废弃)。
如果消息指定了其中一个 MQRO_EXPIRATION_ * 报告选项,那么将在废弃到期消息时生成报告。 如果未指定任何这些选项,那么不会生成此类报告; 假定消息在此时间段后不再相关 (可能是因为稍后的消息已取代该消息)。
- 如果消息的
Expiry时间为零或大于 999 999 999 ,那么 MQPUT 或 MQPUT1 调用将失败,原因码为 MQRC_EXPIRY_ERROR; 在这种情况下不会生成报告消息。要启用原因码 2013 MQRC_EXPIRY_ERROR ,必须启用环境变量 AMQ_ENFORCE_MAX_EXPIRY_ERROR。
以下示例用于 Linux®:
请注意:$ export AMQ_ENFORCE_MAX_EXPIRY_ERROR=True- 重要的是导出变量
- 实际值将被忽略,但是,使用
True可能会在查看设置时有所帮助。
- 因为具有已经过的到期时间的消息可能要到以后才会废弃,所以队列上可能存在已超过其到期时间的消息,因此不适合检索这些消息。 但是,出于所有目的 (包括深度触发) ,这些消息将计入队列中的消息数。
如果订户/使用者 (客户机) 尝试获取消息,并且该消息已到期,那么客户机不会接收任何内容,因为该消息已废弃,因为它太旧。 此外,客户机将不会收到任何错误消息。
- 如果请求,将在废弃消息时生成到期报告,而不是在其符合废弃条件时生成到期报告。
- 废弃已到期的消息并生成到期报告 (如果请求) 从来不是应用程序工作单元的一部分,即使消息已调度为作为在工作单元中运行的 MQGET 调用的结果而废弃。
- 如果工作单元内的 MQGET 调用检索到接近到期的消息,并且随后回退了该工作单元,那么该消息可能有资格在再次检索之前被废弃。
- 如果使用 MQGMO_LOCK 的 MQGET 调用锁定了接近到期的消息,那么在使用 MQGMO_MSG_UNDER_CURSOR 的 MQGET 调用检索该消息之前,该消息可能会被废弃; 如果发生此情况,那么会在此后续 MQGET 调用上返回原因码 MQRC_NO_MSG_UNDER_CURSOR。
- 检索到到期时间大于零的请求消息时,应用程序可以在发送应答消息时执行下列其中一项操作:
- 将剩余到期时间从请求消息复制到应答消息。
- 将应答消息中的到期时间设置为大于零的显式值。
- 将应答消息中的到期时间设置为 MQEI_UNLIMITED。
- 触发器消息始终使用 MQEI_UNLIMITED 生成。
Format名称为 MQFMT_XMIT_Q_HEADER 的消息 (通常在传输队列上) 在 MQXQH 中具有第二个消息描述符。 因此,它有两个关联的Expiry字段。 在这种情况下,应注意以下补充要点:- 当应用程序将消息放在远程队列上时,队列管理器会将消息初始放在本地传输队列上,并以 MQXQH 结构作为应用程序消息数据的前缀。 队列管理器将两个
Expiry字段的值设置为与应用程序指定的值相同。如果应用程序将消息直接放在本地传输队列上,那么消息数据必须已以 MQXQH 结构开头,并且格式名称必须为 MQFMT_XMIT_Q_HEADER。 在这种情况下,应用程序无需将这两个
Expiry字段的值设置为相同。 (队列管理器会检查 MQXQH 中的Expiry字段是否包含有效值,以及消息数据是否足够长以包含该值)。 对于可以直接写入传输队列的应用程序,应用程序必须使用嵌入式消息描述符创建传输队列头。 但是,如果写入传输队列的消息描述符中的到期值与嵌入式消息描述符中的值不一致,那么将发生到期错误拒绝。 - 当从队列中检索到
Format名称为 MQFMT_XMIT_Q_HEADER 的消息 (无论是正常队列还是传输队列) 时,队列管理器会将 这两个Expiry字段与在队列中等待所花费的时间一起递减。 如果消息数据的长度不足以在 MQXQH 中包含Expiry字段,那么不会发生任何错误。 - 队列管理器使用单独的消息描述符 (即, MQXQH 结构中嵌入的消息描述符中的字段) 中的
Expiry字段来测试消息是否适合废弃。 - 如果两个
Expiry字段的初始值不同,那么检索消息时单独的消息描述符中的Expiry时间可能大于零 (因此该消息不适合废弃) ,而根据 MQXQH 中的Expiry字段的时间已过去。 在这种情况下, MQXQH 中的Expiry字段设置为零。
- 当应用程序将消息放在远程队列上时,队列管理器会将消息初始放在本地传输队列上,并以 MQXQH 结构作为应用程序消息数据的前缀。 队列管理器将两个
- 除非在 MQIIH 的 "标志" 字段中设置 MQIIH_PASS_EXPIRATION ,否则从 IMS 网桥返回的应答消息的到期时间不受限制。 请参阅 标志 以获取更多信息。
- MQEI_UNLIMITED
- 消息具有无限的到期时间。
这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 MQEI_UNLIMITED。