2008-12-22 95 views
6

在Java Web應用程序中,我有類型A的循環消息加載(例如,每小時20,000個)。然後我有第二種類型的消息(類型B)偶爾出現,但比A類(比如3,000)具有更高的優先級。我希望能夠使用開源軟件在一臺或多臺機器上處理這些消息。帶優先級的消息處理

在我看來,如果我有一個JMS服務器可以根據優先級從其隊列發送消息(例如,發送B類型的三條消息,然後發送A類型的消息,即使所有消息類型A位於消息隊列的頂部)。

你知道一個可以做到這一點的JMS服務器 - 或者你知道另一種實現方法嗎?

回答

2

當您在MessageProducer(QueueSender等)上調用「send(..)」時,設置消息優先級。或者,您可以在MessageProducer上設置0-9的默認優先級(9最高)。在消息本身上設置優先級將不起作用。它被生產者覆蓋。

Uri是正確的 - 優先級是否被尊重是特定於實現的。我相信OpenJMS通常尊重開箱即用的優先權,但不保證它。

JMS規範指出:"JMS does not require that a provider strictly implement priority ordering of messages; however, it should do its best to deliver expedited messages ahead of normal messages."

6

JMS標準支持的消息優先級默認爲4,您可以指定其他)。我認爲你需要在消息生產者和消息本身中設置它(兩者都有方法)。

我認爲ActiveMQ支持它。

但是,許多JMS代理默認情況下已禁用優先級處理。 有一個標誌,您可能需要更改,比如「supportJMSPriority」,在代理配置中的某處。

此外,Apache Camel允許您編寫自己的消息重排器,以便您可以實現任何形式的優先級。

0

爲什麼不考慮使用其他MDB明確過程中的其他消息類型。上面的優先級細節仍然適用,對於每種消息類型,您還可以更多地控制併發處理。

對於大多數情況下,我更喜歡每個消息類型1 mdb或消息接收器。如果這樣一個事務回滾,你馬上就知道這消息的類型引起的問題

卡爾

0

你可以使用多個主題。即使有優先級,如果你的處理器捆綁處理較低優先級的消息,它也不會停止它的工作。

如果您有獨立的處理器,高優先級消息可以在交付後立即開始處理,而不是等待任何其他消息處理。