2015-04-17 14 views
1

我想了解這兩個API:setJMSRedeliveredgetJMSRedelivered爲我的項目。 鏈接:使用http://docs.oracle.com/javaee/5/api/javax/jms/Message.html#getJMSRedelivered()JMS - 消息API setJMSredelivered和getJMSredelivered如何工作?

步驟:我們要一個主題發佈消息

  1. 呼叫setJMSRedelivered(true)

  2. 發佈消息。

  3. 消費該消息。致電getJMSRedelivered()上的消息。

它應該是正確的。但它的重新調整是錯誤的。 我錯過了什麼嗎?

回答

3

不,您不應在發佈消息時設置JMSRedelivered屬性。消息傳遞提供程序在多次傳遞消息時將設置此屬性。

根據JMS規範

如果客戶收到與JMSRedelivered指標集的消息,這是有可能的,但不能保證,這個消息已被傳遞,但在過去沒有得到確認。通常,提供者在重新傳遞消息時必須設置消息的JMSRedelivered消息頭字段。如果該字段設置爲true,則表明該消息應用程序可能已經傳遞了該消息,並且該應用程序應該採取額外的預防措施以防止重複處理。

該標題字段在發送時沒有意義,並且由 發送方法保持未分配狀態。

仔細閱讀最後一行,它說JMSRedelivered具有no意思是什麼時候發送消息。

在你的情況下,由於消息有被交還時,getJMSRedelivered屬性調用返回FALSE

更新

示例代碼來測試JMSRedelivered財產。

// Create JMS objects 
connection = cf.createConnection(); 
System.out.println("Created connection to " + queueManager); 
// Create a transacted session. 
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); 
System.out.println("Session created"); 

Destination topicScore = session.createTopic("/SCORE"); 
MessageConsumer consScore = session.createConsumer(topicScore); 

JMSBytesMessage msg=null; 
// Receive message first 
msg = (JMSBytesMessage) colesConsumer.receiveNoWait(); 
System.out.println(msg.getJMSRedelivered); 

// Rollback the previous receive, to force messaging provider to redeliver the message 
session.rollback(); 

// receive message again 
msg = (JMSBytesMessage) colesConsumer.receiveNoWait(); 
// This time JMSRedelivered will be true. 
System.out.println(msg.getJMSRedelivered); 

希望這對你有幫助。

+0

因此,如果我再次重新發送相同的消息,並將此標誌消耗後設置爲真正的.....它應該工作? – anon

+1

它是需要重新傳遞郵件的郵件提供程序,而不是您的發件人應用程序。在上面的更新中查看代碼片段。 – Shashi

0

setJMSredelivered由容器管理,如果將其設置爲true併發布消息[尚未'redelivered'],則容器將setJMSredelivered設置爲false。

當消息傳遞時,例如發生致命事件時,容器將回滾該調用並將setJMSredelivered設置爲true。