【问题标题】:Message selector with receiveNoWait()带有 receiveNoWait() 的消息选择器
【发布时间】:2021-02-11 17:13:29
【问题描述】:

消息选择器是否也可以与 receiveNowait() 方法一起用于同步过程。它适用于receive() 方法,但想知道IBM mq 的receiveNoWait。 创建消费者时添加消息选择器。

编辑 1: 我已经使用 receiveNowait() 方法进行了测试,并且选择器不起作用。我不知道问题出在我的选择器或 receivenowait 方法上。以下是我使用的选择器:

String messageSelector = "JMSTimestamp <= " + System.currentTimeMillis() - 180000;
 receiver = (MessageConsumer) session.createConsumer(replyQueue, messageSelector);

这意味着,接收者只能接收比当前时间早 3 分钟的消息。 谁能弄清楚是什么问题。

编辑 2: 经过完整测试,我发现问题出在选择器上,JMSTimeStamp 在选择器表达式中的正确用法是什么?

【问题讨论】:

  • ...你试过了吗?知识中心是否有任何东西表明它不起作用?
  • JoshMc 知识中心里什么都没有,但连一个例子都没有,所以有疑问。我现在要试试。看看它是否有效。
  • 正如@JustinBertram 所指出的,我认为它没有理由不起作用。
  • 根据我的测试结果,选择器无法与 receiveNoWait 一起使用。我会在某个时候更新代码
  • 如果您使用receive()receive(long),选择器是否按预期工作?

标签: java jms selector ibm-mq


【解决方案1】:

pepared system.currnetTimeMillis() 值在选择器运行时不会更新。

在这里,您正在修复初始化选择器时的“当前”时间戳。 您应该为您的查询执行类似“endValidityDate 601000)”的查询(与任何使用固定值而不是动态值的 SQL 查询相同的问题)。

【讨论】:

    【解决方案2】:

    我不能专门谈论 IBM MQ 实现,但从 JMS 的角度来看,JMS 规范中没有任何内容限制使用 receiveNoWait 的选择器,所以我希望它可以在任何兼容的实现中工作。

    【讨论】:

    • 我已经编辑了我的问题,添加了选择器代码,请检查
    【解决方案3】:

    receive()、receive(long timeout) 和 receiveNoWait() 在交付内容方面应该完全相同。事实上,有几个实现是通过调用另一种方法来实现的。

    【讨论】:

    • 我已经编辑了我的问题,添加了选择器代码,请检查
    • 你有没有让它与 MQ JMS 一起工作?我已经尝试过,但我认为这不起作用。也许是 MQ JMS 中的一个错误?我有这个输出:选择器:JMSTimestamp
    • 是的,它不起作用,我也尝试使用 BETWEEN 运算符,它的工作方式不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多