Селектор сообщений с ReceiveNoWait()

Будут ли селекторы сообщений работать с методом receiveNowait() для синхронного процесса. он работает с методом Receive (), но хотел знать для ReceiveNoWait для IBM mq. Селектор сообщений добавлен при создании потребителя.

РЕДАКТИРОВАТЬ 1: Я протестировал с помощью метода receiveNowait(), и селектор не работает. Я не знаю, проблема в моем селекторе или методе Receivenowait. Ниже приведен селектор, который я использовал:

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

это означает, что получатель должен получать только те сообщения, которые на 3 минуты старше текущего времени. Может кто разобрался в чем дело.

Обновлено еще раз: после полного тестирования я обнаружил, что проблема связана с селектором, каким может быть правильное использование JMSTimeStamp в выражении селектора?

...Ты это пробовал? Есть ли в центре знаний что-нибудь, что указывало бы на то, что это не сработает?

JoshMc 06.03.2019 14:29

JoshMc в центре знаний ничего нет, но не нашел ни одного примера по нему, так что сомневался. Я собираюсь попробовать это сейчас. Будет видно, работает или нет.

Harsha 06.03.2019 15:08

Как отметил @JustinBertram, я не вижу причин, по которым это не сработает.

JoshMc 06.03.2019 18:11

Селектор не работает с ReceiveNoWait по результатам моего теста. Я обновлю код через некоторое время

Harsha 11.03.2019 13:29

Если вы используете receive() или receive(long), работает ли селектор так, как вы ожидаете?

Justin Bertram 11.03.2019 15:05

нет, не работает, только что проверил. проблема с селектором. Мы не можем использовать JMSTimeStamp так, как я использовал

Harsha 11.03.2019 16:17

Привет, Харша, что касается первоначального вопроса, я думаю, что на него был дан ответ, правильно подумать, что нужно принять один из ответов. Что касается вашего «EDIT 2», удалите его из этого вопроса и откройте новый вопрос по этому вопросу, это сайт с одним вопросом и одним ответом, а не дискуссионный форум.

JoshMc 11.03.2019 17:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
302
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не могу конкретно говорить о реализации IBM MQ, но с точки зрения JMS в спецификации JMS нет ничего, что ограничивало бы использование селекторов с помощью receiveNoWait, поэтому я ожидаю, что это будет работать в любой совместимой реализации.

Я отредактировал свой вопрос, добавил код селектора, проверьте

Harsha 11.03.2019 14:54

receive(), receive(long timeout) и receiveNoWait() должны работать точно так же с точки зрения того, что доставляется. На самом деле несколько реализаций реализуют один, вызывая другой метод.

Я отредактировал свой вопрос, добавил код селектора, проверьте

Harsha 11.03.2019 14:54

вы когда-нибудь заставляли его работать с MQ JMS? Я пробовал, но не вижу, чтобы это работало. Может быть, ошибка в MQ JMS? У меня был такой вывод: селектор: JMSTimestamp < 1552325982237 JmsConsumer: ожидание сообщения.... получено: JMSTimestamp: 1552326165700

Axel Podehl 11.03.2019 18:44

Да, это не работает, я также пробовал использовать оператор BETWEEN, он работает по-другому.

Harsha 13.03.2019 13:41
Ответ принят как подходящий

pepared Значение system.currnetTimeMillis() не обновляется при запуске селектора.

Здесь вы фиксируете «текущую» метку времени при инициализации селектора. Вы должны сделать запрос типа "endValidityDate <= (JMSTimestamp-24601000)" для вашего запроса (та же проблема, что и любой запрос SQL с фиксированными значениями вместо динамических).

Другие вопросы по теме