2011-07-22 84 views
11

我需要設置消息優先級,以便高優先級消息在接收方的低優先級消息之前消耗。JMS消息優先級不工作消息

首先我嘗試使用message.setJMSPriority()方法來設置優先級,但它並沒有在HornetQ和ActiveMQ中工作,所以最後我使用setPriority()方法設置了Message Producer的優先級,現在它工作正常。

爲什麼Messsge.setJMSPriority()不能在任何JMS供應商實現中工作,爲什麼我們需要設置生產者的優先級而不是消息本身來設置消息的優先級?那麼Messsge.setJMSPriority()方法的用法是什麼?

任何建議或意見表示讚賞。

回答

16

要回答這個問題,您只需要閱讀setJMSPriority方法的API文檔,它會告訴您爲什麼。這是相關的文字。

設置此消息的優先級。

JMS提供程序在發送消息時設置此字段。此方法可用於更改已收到消息的值。

的JMS提供者(ActiveMQ的,HornetMQ等)設置優先級的製片人發送給任一4的默認值,或任何值你已經設置爲使用生產商,所以才設定值發送消息本身不會有任何影響。

5

這是JMS規範要求。

您應該更改Message Producer的優先級。

8
msg.setJMSPriority(9); 

在此代碼中,消息優先級設置爲9,表示這是高優先級消息。 但是,當發送消息時,消息將具有4的優先級(正常 優先級)。原因?與消息到期一樣,JMS提供程序將查看消息的消息優先級屬性 ,並調用先於 的setJMSPriority方法將消息放入隊列。由於缺省消息優先級爲4(正常的 優先級),因此消息優先級不會設置爲高優先級消息,正如開發人員最初所預期的那樣。

像郵件過期,也有設置消息優先級的方法有兩種:您 可以調用的MessageProducer上(QueueSender或主題 出版商)的setpriority()可方法或發送消息時設置消息優先級:

//set the default message priority for all messages to 9 (high) 
QueueSender qSender = qSession.createSender(requestQ); 
qSender.setPriority(9); 

qSender.send(msg1); 
//this message is low priority 
qSender.send(msg2, DeliveryMode.PERSISTENT, 1, 30000); 

在這個例子中,MSG1將與圖9(高優先級)的優先級被髮送,而將MSG2與 1(低優先級)的優先級被髮送。