Spring之集成之JMS(Java Message Service)

23.1 介紹

Spring提供了一個JMS集成框架,其簡化了JMS API使用,就像spring集成JDBC API。


JMS可以大略的分爲兩個功能點,即消息的產生和消費。JmsTemplate類用於消息創建和同步消息接收。對於異步接收與Java EE的消息驅動bean類型相似,Spring提供了大量的消息監聽器容器,用於創建消息驅動的POJOs(MDPs)。

org.springframework.jms.core包提供了使用JMS的核心功能。其包含了JMS模板類,指定了JMS的用法,通過處理資源的創建和釋放,與JDBC的JdbcTemplate很相似。設計原則,對於普通的Spring模板類,是提供輔助類執行普通的操作,對於更復雜的用法,處理任務的實質,是實現回調接口。

JMS模板遵循同樣的設計。類提供不同方便的方法,處理消息的發送,異步消費消息並提供給用戶JMS會話和消息創建器。


org.springframework.jms.support包提供了JMSException轉換功能。這個轉換將檢查型JMSException等級轉爲非檢查型異常層級。如果有檢查型javax.jms.JMSException異常的子類的提供器,這個異常封裝爲非檢查型UncategorizedJmsException異常。


org.springframework.jms.support.converter包提供了一個MessageConverter抽象,用於在Java對象和JMS消息之間轉換。


org.springframework.jms.support.destination包提供了不同的策略來管理JMS目的,比如JNDI中的終點提供一個業務定位。


org.springframework.jms.config包爲jms空間提供瞭解析實現類,如同Java配置提供了配置監聽容器並創建監聽端點。


最終,org.springframework.jms.connection包提供了ConnectionFactory實現類,這適用於單獨的應用程序中。其也包含了針對JMS(命名爲JmsTransactionManager)spring的PlatformTransactionManager的一個實現。這允許無縫整合JMS,將其事物資源整合到Spring的事物管理機制中。



23.2 Spring JMS的使用

23.2.1 JmsTemplate

JmsTemplate,這個類是JMS核心包中的核心類。其指定了JMS的使用,因爲當發送或同步接受消息時,其處理資源的創建和釋放。


使用JmsTemplate的編碼只需要實現回調接口,並給定了一個清晰的高級約束。MessageCreator接口回調創建了一個消息,通過調用JmsTemplate的代碼提供一個會話。爲了更好地使用JMS API,SessionCallback回調提供了JMS會話的使用和回調ProducerCallback,暴露一個會話和MessageProducer。


JMS API提供了兩類發送方法,一個是分發模式,優先使用,並超時時間作爲QOS參數,另一個是沒有QOS參數,其使用默認的值。由於在JmsTemplate有許多發送方法,QOS參數封裝爲一個bean屬性,來避免在發送方法中重複設置。同樣地,異步接受調用的超時值的設置使用屬性setReceiveTimeout完成。


一些JMS提供器允許系統默認設置QOS值,通過ConnectionFactory的配置。MessageProducer發送方法send(Destination destination, Message message)使用不同的QOS的默認值比那些在JMS規範中使用那些指定的值更有效果。爲提供QOS值得統一管理,因此JmsTemplate必須通過設置isExplicitQosEnabled屬性爲true來使用其自己的QOS值。


注意:JmsTemplate類的實例一旦配置即爲線程安全的。這很重要,因爲意味着你可以設置JmsTemplate的單一實例,並稍後安全地將共享引用注入到多個合作者。要清楚,JmsTemplate是有狀態的,雖然其保有了一個ConnectionFactory的引用,但是這個狀態不是會話狀態。


自Spring框架 4.1起,JmsMessagingTemplate構建於JmsTemplate頂部,並提供了消息抽象的集成,即org.springframework.messaging.Message。這個允許你在一般的方式中創建發送的消息。


23.2.2 連接


JmsTemplate需要一個ConnectionFactory引用。ConnectionFactory是JMS規範的一部分,並提供了JMS的入口點。由客戶端應用程序作爲一個工廠來創建JMS提供器的連接並封裝多個配置參數使用,其中有許多是廠商規定的,比如SSL配置選項。


當在一個EJB中使用JMS時,廠商提供了JMS接口的實現,這樣它們可以參與到聲明式事物管理並執行連接池和會話處理。爲使用這個實現類,Java EE容器一般要求你聲明一個JMS連接工廠,作爲EJB內部的resource-ref或者servlet的部署描述符。爲確保EJB內部JmsTemplate的功能的使用,客戶端應用程序應該確保其引用到ConnectionFactory的管理實現。


緩存消息資源

標準API包含了許多中間件對象。爲發送一條消息,API執行流程如下:

ConnectionFactory---->Connection---->Session------>MessageProducer---->send


在ConnectionFactory和send操作之間,有三個中間件對象需要創建和銷燬。爲充分利用資源和提高執行效率,提供了兩個ConnectionFactory的實現。


SingleConnectionFactory

Spring 提供了ConnectionFactory接口的實現類,SingleConnectionFactory,調用createConnection()將返回相同的Connection並忽略調用close()方法。這在測試和單獨環境中很有用的,這樣同樣的連接可以用於多個JmsTemplate調用,其可以跨度許多事物。SingleConnectionFactory獲取一個標準ConnectionFactory的引用(來自JNDI)。


CachingConnectionFactory

CachingConnectionFactory擴展了SingleConnectionFactory的功能並添加了緩存的會話,MessageProducers(消息生產者)和MessageConsumers(消息消費者)。初始緩存大小設置爲1。,使用屬性SessionCacheSize增加緩存會話的數量。注意真正緩存會話的數量比基於承諾模式緩存的要多,這樣當SessionCacheSize設置爲1的時候,實際上可能有四個緩存會話實例,每個對應一個AcknowledgementMode。消息生產者和消息消費者緩存在自己的會話中並在緩存時也考慮生產者和消費者唯一性屬性。消息生產者緩存基於它們的目的地。消息消費者基於目的,選擇器,非定位配送標示和訂閱名緩存(如果創建永久的消費者)。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章