2013-04-15 71 views
0

我是Java Messaging Service的新手,並不完全確定它是如何工作的。我在NetBeans中使用JMS和Java EE項目。我使用的服務器類型是glassfish 3.這是我的情況:Java EE和glassfish服務器發生Java消息傳遞服務問題

我有一個程序創建兩個線程,A和B.這兩個線程通過我創建的兩個隊列服務器資源在彼此之間發回消息和第四個消息。下面是一系列的假設被傳遞迴和第四A和B.

之間的消息

什麼是假設發生:

1. A is started 
2. B is started 
3. A sends B a message, M1 (producer.send(m1)) 
4. B receives M1 and does some stuff (consumer.receive()) 
5. B sends A a message, M2 
6. A receives M2 and does some stuff 
7. A sends B a message, M3 
8. B receives M3 and does some stuff 

實際發生的:

1. A is started 
2. B is started 
3. B receives M3 and does some stuff (consumer.receive()) 

這種情況自從我在所有發送的消息之間的某個地方做了一個session.commit()之後就開始彈出。它幾乎就像我將隊列的狀態提交給某個文件或服務器,現在每次運行我的程序時,都會從保存的狀態初始化隊列。

我之所以首先添加提交的原因是因爲我的一條消息M2沒有被線程A接收到。線程B正在到達它的代碼部分,它通過生產者將M2發送到線程A .send(M2)(其中producer是一個MessageProducer對象)。線程A只會掛在consumer.receive()(其中consumer是MessageConsumer對象)。我再次檢查是否將M2發送到正確的Queue資源。

回答

0

我終於明白了。原來我每次都需要session.commit()線程B發送一條消息。另外,我的代碼中有一個錯誤,導致程序過早結束,這意味着仍然有未收到的消息,這些消息會延續到下一次運行時間。我最終做了什麼來解決這個問題,只是繞着consumer.receive(100)循環,直到它在啓動我的線程之前返回一個空值。