Могу ли я сравнить с текущей датой для селектора сообщений JMS?

Я хотел бы помещать сообщения в очередь с датой/временем в качестве свойства сообщения и извлекать сообщение из очереди, когда это свойство соответствует критериям в отношении текущей даты.

В качестве примера предположим, что я хочу использовать сообщение в 3:00. Моя идея состоит в том, чтобы установить свойство на 3:00, а затем иметь селектор сообщений, например event_timestamp <= CURRENT_TIMESTAMP.

Я понимаю, что селектор сообщений JMS API основан на SQL, поэтому я хотел бы использовать его таким же образом, как я буду запрашивать базу данных, где у меня может быть ключевое слово, такое как CURRENT_TIMESTAMP или NOW(), или подобное. Есть ли что-то подобное в синтаксисе выражения селектора сообщений или другой способ добиться такого результата?


person Ray    schedule 24.04.2012    source источник
comment
Вы когда-нибудь догадывались об этом. Является ли ответ НЕТ, вы не можете использовать этот синтаксис сравнения в селекторе?   -  person jdawiz    schedule 05.11.2019


Ответы (4)


Насколько мне известно, в спецификации JMS нет функций для селектора. Возможно, некоторые существуют в расширениях реализации конкретного поставщика, но не в tibco в соответствии с справочник по селектору сообщений.

Поскольку селектор сообщений является фиксированным параметром для определенного MessageConsumer, вам нужно создать строку selector с текущей датой (или любой другой) и вызвать Session.createConsumer, Session.createDurableSubscriber или Session.createBrowser при каждом изменении этого запроса селектора.

Я рекомендую вам сохранить одно и то же соединение и сеанс для всех ваших потребителей, чтобы поддерживать разумную производительность.

Другой вариант - использовать браузер сообщений, чтобы открыть свойство сообщений, чтобы вычислить ваше состояние, а затем решить эффективно использовать его, если оно совпадает, но эта идея определенно является регулярным опросом и нарушает философию обмена сообщениями.

Я предполагаю, что вы отправляете сообщение для обработки в будущем после определенной временной метки. Возможно, есть другой способ реализовать ваше требование благодаря истечению срока действия сообщения. В общем, брокер может быть настроен на перемещение сообщений с истекшим сроком действия из очереди A в другую очередь B, поэтому он выполняет эту работу за вас: ваш потребитель просто прослушивает сообщения, доступные в очереди B, только после истечения срока ее действия.

person Yves Martin    schedule 03.05.2012

Если ваш сервер совместим с JMS 2.0, используйте функцию задержки доставки: JMSProducer.setDeliveryDelay(long deliveryDelay).
Когда вы помещаете сообщение в очередь, вычисляйте задержку до нужного времени.
Сообщение станет «видимым», когда задержка истечет. новые функции JMS 2.0

person titou10    schedule 07.04.2017

Что угодно может быть помещено в определяемое пользователем свойство сообщения. Например, свойство пользователя MyTimeStamp и значение свойства установлено как 3.00, тогда вы можете использовать селектор, где у вас может быть селектор как MyTimeStamp='3.00'. Сообщение будет доставлено ожидающему потребителю, как только оно поступит в очередь. Это не означает, что сообщение будет доставлено потребителю, когда системное время будет 15:00.

person Shashi    schedule 25.04.2012
comment
Итак, суть вопроса заключалась в том, как я могу сравнить с текущим временем, а не с каким-то предопределенным временем. - person Ray; 25.04.2012

Вы можете использовать JMSTimestamp, который соответствует времени/эпохе Unix (# секунд с 1970 года). Это долго.

Я не пробовал это, но это кажется легким.

person Erik Aarts    schedule 05.04.2017
comment
Вы можете предоставить некоторый код, чтобы показать, как сделать сравнение - person Cyril; 06.04.2017