2014-05-08 91 views
1

我很難理解Spring JMS用來發送消息的模式。 JmsTemplate類將MessageCreator作爲參數。像這樣:爲什麼Spring JMS框架使用MessageCreator?

JmsTemplate.send(MessageCreator messageCreator) 

沒有選項可以直接傳遞Message對象。這看起來很反Spring,因爲MessageCreator不能是Singleton。如果它是單身人士,則由於此方法而不是線程安全的:

MessageCreator.createMessage(Session session) 

createMessage方法只接受一個會話對象。所以爲了讓這個對象創建一個消息,它需要用某種狀態初始化,如果它有狀態,那麼它不能是單例。

那麼強迫我使用MessageCreator有什麼意義呢?因爲在任何真實情況MyMessageCreator永遠是這樣的:

public MyMessageCreator(String message) { 
    this.message = message; 
} 
public createMessage(Session session) throws JMSException { 
    return session.createTextMessage(message); 
} 

由於生成消息總是需要一些豆類或其他動態值。爲什麼一些這個類的消息構造如果都是都不能做?

如果唯一的原因是我們有一個Session對象的引用,那麼我肯定有一個更好的方法來從Spring bean訪問這個實例(通過注入它,從模板本身獲取它,或者使用一些工廠方法)。

我錯過了什麼嗎?或者是MessageCreator毫無意義?

回答

2

Session鏈接到您的發送操作,它不是一個單身人士。而且您需要訪問此Session才能創建javax.jms.Message

您無法通過javax.jms.MessageJmsTemplate,因爲您需要首先創建會話並且該會話實際上由JmsTemplate在內部管理。

你應該以相反的方式做事。您應該有一個返回MessageCreator而不是您想要構建的Message的方法。該方法可以放在Spring bean中,並且可以擁有任何你需要的注入。因爲這是你的一種方法,你可以傳遞你想要的任何動態值。這就是說,能夠受益於Spring 4.0的消息抽象(org.springframework.messaging.Message)是一個好主意,因爲它可以讓你以獨立於協議的方式按照你想要的方式構建消息。我們爲您創建了SPR-11772

+0

當Spring提供MessageConverter抽象時,爲什麼要使用Session對象?只是不能想到這個MessageCreator的任何用例都無法用其他結構來完成。 – luboskrnac

+0

不知道你在想什麼'MessageConverter'抽象,但是JMS需要這個會話。出於一個明顯的原因,當您創建一個'javax.jms.Message'時,JMS API需要您傳遞會話。 –