2016-08-17 80 views
1

在WildFly 8.2(使用JMS提供者HornetQ)上創建一個JMS隊列,並且讓這個隊列「激活」了一個消息驅動bean,我看到如果生產者連續快速地向隊列發送多條消息,消息驅動bean不會按照它們發送的順序處理它們。是否可以配置WildFly,以便按照發送順序處理消息(先進先出)?有沒有辦法通過MDB在WildFly上進行消息隊列處理?

回答

2

(我覺得已經明白閱讀https://stackoverflow.com/a/6744508/999264後會發生什麼)

有其執行消息驅動Bean(MDB),每個消息一個線程的onMessage方法,因此,如果多個郵件到達時多線程幾乎同時,人們無法知道哪個消息將首先被處理(因爲無法知道哪個線程將首先執行onMessage執行)。唯一的方法是確保線程數爲1:在這種情況下,唯一的線程首先處理第一條消息,然後處理第一條消息,依此類推。

在WildFly和JBoss中,註釋@MessageDriven具有「激活配置屬性」maxSession,據我瞭解,它控制用於處理從隊列到達MDB的消息的最大線程數。其值設置爲1,如下面

@MessageDriven(activationConfig = { 
       @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/myOwnQueue"), 
       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
       @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")}) 
public class MyOwnMDB implements MessageListener { 

    public void onMessage(Message message) { 
     System.out.println("message received " + message.toString()); 
    } 

} 

和運行代碼,我看到確實消息正在處理,由消息驅動bean,在其中它們被髮送的順序。

自改名爲之後,我改變了問題的標題「是否有辦法在WildFly FIFO上創建消息隊列?」,看起來不正確:隊列本身 FIFO(實際上,我發現寫在某處這是JMS規範的一部分,但我無法確定確切的位置)。

+0

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/5/html/HornetQ_User_Guide/ch30s03.html – 99Sono

相關問題