2012-04-24 73 views
1

我想將消息放入帶有日期/時間的隊列作爲消息屬性,並在該屬性滿足當前日期的條件時從隊列中拉出消息。我可以與JMS消息選擇器的當前日期進行比較嗎?

作爲一個例子,假設我想在3:00到使用該消息。我的想法是設置屬性爲3:00,然後有一個消息選擇器,如event_timestamp <= CURRENT_TIMESTAMP

我知道JMS API的消息選擇器是基於SQL的,所以我想以我要查詢數據庫的方式使用它,在那裏我可能有一個關鍵字,如CURRENT_TIMESTAMPNOW()或類似的。在消息選擇器表達式語法中是否有類似的內容,或者是否有其他方式來實現這種結果?

回答

2

據我所知在JMS規範中沒有可用於選擇器的函數。根據the message selector reference,可能有一些存在於供應商特定的實施擴展中,但不在tibco中。

由於消息選擇是特定MessageConsumer一個固定的參數,你必須製作您的selector字符串以當前日期(或其他),每次這個選擇查詢更改來電Session.createConsumerSession.createDurableSubscriberSession.createBrowser

我建議你把你所有的消費者一樣連接和會話,以保持合理的性能。

另一種選擇是使用消息瀏覽器打開的郵件屬性來計算你的情況,然後再決定是否匹配,但這種想法絕對是一個普通的輪詢和它打破消息理念,以有效地使用它。

我猜你在未來發布消息進行處理,確定的時間戳之後。也許有另一種方式來實現您的要求,由於消息到期。一般來說,代理可以配置爲將過期的消息從隊列A移動到另一個隊列B,因此它可以爲您完成這項工作:您的消費者僅在隊列B過期後才監聽隊列B上可用的消息。

0

任何東西都可以放入用戶定義的消息屬性中。例如,用戶屬性MyTimeStamp和該屬性的值設置爲3.00,那麼您可以使用選擇器,您可以使用選擇器作爲MyTimeStamp='3.00'。消息一到達隊列就會被傳遞給等待的消費者。這並不意味着當系統時間是3PM時,消息將被傳送給消費者。

+0

對,所以這個問題的角度是如何,我可以比較當前的時間,而不是一些預定義的時間.. – Ray 2012-04-25 10:58:56

0

可以使用JMSTimestamp這在Unix時間/信號出現時間(自1970年以來#seconds)。這是一個漫長的過程。

我沒有嘗試這個,但它似乎很容易。

+1

您可能要提供一些代碼來展示如何進行比較 – Cyril 2017-04-05 22:11:51

1

如果你的服務器是JMS 2.0兼容,使用延遲交付功能:JMSProducer.setDeliveryDelay(long deliveryDelay)
當您將消息放入隊列時,計算達到所需時間的延遲。
消息將成爲「看得見」的時候,延時結束 JMS 2.0 new features

相關問題