2015-04-05 124 views
5

這是我第一次與春季JMS(並與JMS一般)和我有一些懷疑相關的回調的概念JmsTemplate什麼是Spring JMS中的JmsTemplate回調?

我知道JmsTemplate的是從Spring提供的一類:

  • 減少樣板代碼。
  • 透明地管理資源。
  • 將檢查的異常轉換爲運行時等效。
  • 提供便捷方法和回調。

並且它用於消息產生和同步消息接收。它簡化了JMS的使用,因爲它在發送或同步接收消息時處理資源的創建和釋放。

讀春官方文檔(此處http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html)我發現:使用JmsTemplate只需要實現回調 接口給他們一個明確的高水平合同

代碼。 MessageCreator回調接口在JmsTemplate中的調用代碼提供的會話 中創建一條消息。

這並不明確。這些回調究竟是什麼?

在開始時我認爲回調是從JmsTemplate提供的方法,但在這裏閱讀它似乎更類似於我必須實現的接口。怎麼運行的?

我還發現本例中:

發送POJO THROUGHT JMS(使用JmsTemplate):

public class JmsOrderManager implements OrderManager { 
    @Autowired JmsTemplate jmsTemplate; 
    @Autowired Destination orderQueue; 

    public void placeOrder(Order order) { 
     String stringMessage = "New order " + order.getNumber(); 
     jmsTemplate.convertAndSend("messageQueue", stringMessage); 
     // use destination resolver and message converter 
     jmsTemplate.convertAndSend(orderQueue, order); // use message converter 
     jmsTemplate.convertAndSend(order); // use converter and default destination 
    } 
} 

我認爲convertAndSend()方法是一個JmsTemplate的回調但可能這個說法是不正確的。

你能解釋一下JmsTemplate回調到底是什麼嗎?

回答

6

常見的Spring模板類的設計原則是提供 助手方法去執行公共操作 和更復雜的使用,委託 處理任務到用戶實現的回調接口的精髓。

在JMS連接將從工廠

=>從該連接會話被創建來獲得,一個SEESION是一個工作單元,它也提供了事務

=>從會話創建不同類型的JMS消息,如TextMessage,ObjectMessage,MapMessage,BytesMessage和StreamMessage,以下面的方式 session.createTextMessage(「hello queue world」); session.createObjectMessage(someSerializedObject)等

=>在同一會話還負責MessageProducer上session.createProducer(目的地)和的MessageConsumer session.createConsumer(目的地)

的創建實例,可以有以下convertAndSend可能性(Overloaded methods):

 jmsTemplate.convertAndSend(message) 
     jmsTemplate.convertAndSend(destination, message) 
     jmsTemplate.convertAndSend(message, postProcessor) 
     jmsTemplate.convertAndSend(destinationName, message) 
     jmsTemplate.convertAndSend(destination, message, postProcessor) 
     jmsTemplate.convertAndSend(destinationName, message, postProcessor) 

發生了什麼事? 第3個第5和第6個簽名的回調的基本用法是通過配置的MessageConverter將對象轉換爲JMS消息 後,您可以更改消息。 您看到一個實際的目的地將由DestinationResolver在6th的情況下解決,您沒有通過它,它將從JNDI解析,如果它在那裏註冊。

這是什麼意思?

jmsTemplate.send(this.queue, new MessageCreator() { 
public Message createMessage(Session session) throws JMSException { 
     return session.createTextMessage("hello queue world"); 
    } 
}); 

在這裏,在這個例子中,你正在使用JMS模板您提供匿名implemetation(回調)其中的方法,您可以訪問到Session對象,並從該會話 您創建自定義會話的send()方法看.createTextMessage(「hello queue world」)消息。在convertAndSend

同樣的方式(你可以訪問後處理器修改)

public void ConvertSend() { 
Map map = new HashMap(); 
map.put("Name", "Vimal"); 
map.put("Age", new Integer(45)); 
jmsTemplate.convertAndSend("jmsQueue", map, new MessagePostProcessor() { 
    public Message postProcessMessage(Message message) throws JMSException { 
     message.setIntProperty("ID", 9999); 
     message.setJMSCorrelationID("123-99999"); 
     return message; 
     } 
    }); 
} 

消息對象被創建,但要修改它(增加了兩個屬性,除了姓名和年齡)。 MessagePostProcessor接口允許您在消息被轉換後,但在發送之前訪問該消息。

換句話說!設置消息屬性,標題和正文不能封裝在轉換器類(SimpleMessageConverter)中,但MessagePostProcessor接口允許您在消息被轉換之後,但在發送之前訪問該消息。

3

它允許您對JMS實體進行低級別訪問(例如使用​​與Session,SessionCallback),同時在操作完成時仍然可靠地釋放資源。

+0

嗯,它仍然是我晦澀的東西。那麼這些回調是什麼(除了SessionCallback),所以我會嘗試搜索一些示例。 – AndreaNobili 2015-04-05 18:01:50

+2

您可以執行操作,例如,直接在'Session'上 - 讀取JMS規範。和Javadocs瞭解更多信息。 – 2015-04-05 19:00:22