spring源码分析之spring-jms模块详解
0 概述
spring提供了一個jms集成框架,這個框架如spring 集成jdbc api一樣,簡化了jms api的使用。
jms可以簡單的分成兩個功能區,消息的生產和消息的消費。JmsTemplate類用來生成消息和同步接受消息。和其它java ee的消息驅動樣式一樣,對異步消息,spring也提供了許多消息監聽容器用來創建消息驅動的POJO(MDPs)。spring同時也提供了創建消息監聽器的聲明方式。
org.springframework.jms.core 提供了使用JMS的核心功能,它包含JmsTemplate類,該類類似于jdbc中的jdbdTemplate,它通過對資源的創建和釋放處理來簡化jms開發。spring的模板類作為一種設計原則在spring框架中廣泛使用,模板類對簡單操作提供了幫助方法;對復雜操作,通過繼承回調接口提供了重要處理過程的代理。jmsTemplate同樣遵循這一設計原則,它提供了發送消息、同步消費消息、為用戶提供JMS session和消息生產者的多種便利方法。
org.springframework.jms.support提供了JmsException轉譯功能。它將checked的JmsException層次轉換成uncheckedd異常的鏡像層次。若拋出的異常不是javax.jms.JmsException的子類,這個異常將被封裝成unchecked異常UncategorizedJmsException。
org.springframework.jms.support.converter 提供了在java對象和jms消息之間轉換的抽象MessageConverter。
org.springframework.jms.support.destination提供了管理jms destination的多種策略,如對存放在jndi的destionation提供服務定位功能。
org.springframework.jms.annotation通過使用@JmsListener提供了對注解驅動的監聽端的支持。
org.springframework.jms.config 支持jms命名空間的解析,同時也支持配置監聽容器和生成監聽端。
最后,org.springframework.jms.connection提供了適用于standonle應用的ConnectionFactory的實現。它也了spring PlatFormTransactionManager對jms的事務管理實現jmsTranscationmanager. 這允許jms 作為事務資源無縫的集成到spring事務管理機制中。
1. 異常處理類模塊
? ?
?
異常的轉換在JmsUtils中來做的:
/*** Convert the specified checked {@link javax.jms.JMSException JMSException} to a* Spring runtime {@link org.springframework.jms.JmsException JmsException} equivalent.* @param ex the original checked JMSException to convert* @return the Spring runtime JmsException wrapping the given exception*/public static JmsException convertJmsAccessException(JMSException ex) {Assert.notNull(ex, "JMSException must not be null");if (ex instanceof javax.jms.IllegalStateException) {return new org.springframework.jms.IllegalStateException((javax.jms.IllegalStateException) ex);}if (ex instanceof javax.jms.InvalidClientIDException) {return new InvalidClientIDException((javax.jms.InvalidClientIDException) ex);}if (ex instanceof javax.jms.InvalidDestinationException) {return new InvalidDestinationException((javax.jms.InvalidDestinationException) ex);}if (ex instanceof javax.jms.InvalidSelectorException) {return new InvalidSelectorException((javax.jms.InvalidSelectorException) ex);}if (ex instanceof javax.jms.JMSSecurityException) {return new JmsSecurityException((javax.jms.JMSSecurityException) ex);}if (ex instanceof javax.jms.MessageEOFException) {return new MessageEOFException((javax.jms.MessageEOFException) ex);}if (ex instanceof javax.jms.MessageFormatException) {return new MessageFormatException((javax.jms.MessageFormatException) ex);}if (ex instanceof javax.jms.MessageNotReadableException) {return new MessageNotReadableException((javax.jms.MessageNotReadableException) ex);}if (ex instanceof javax.jms.MessageNotWriteableException) {return new MessageNotWriteableException((javax.jms.MessageNotWriteableException) ex);}if (ex instanceof javax.jms.ResourceAllocationException) {return new ResourceAllocationException((javax.jms.ResourceAllocationException) ex);}if (ex instanceof javax.jms.TransactionInProgressException) {return new TransactionInProgressException((javax.jms.TransactionInProgressException) ex);}if (ex instanceof javax.jms.TransactionRolledBackException) {return new TransactionRolledBackException((javax.jms.TransactionRolledBackException) ex);}// fallbackreturn new UncategorizedJmsException(ex);}2. config模塊
支持jms命名空間的解析,同時也支持配置監聽容器和生成監聽端。其結構如下:
其中,在JmsNamespaceHandler中使用到了監聽容器,如下:
public class JmsNamespaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {registerBeanDefinitionParser("listener-container", new JmsListenerContainerParser());registerBeanDefinitionParser("jca-listener-container", new JcaListenerContainerParser());}}3. connection模塊
提供了適用于standonle應用的ConnectionFactory的實現。它也了spring PlatFormTransactionManager對jms的事務管理實現jmsTranscationmanager. 這允許jms 作為事務資源無縫的集成到spring事務管理機制中。其結構如下:
JmsTemplate需要一個ConnectionFactory的引用,ConnectionFactory作為jsm規范的一部分,是作為和jms交互中一個關鍵因素,用來作為工廠創建和jms 提供者連接客戶端應用的connection,并且封裝了多種類型的配置參數,這些參數一般由jsm 提供者指明,例如ssl 配置選項。
SingleConnectionFactory 創建連接時返回同一個連接Connectin而忽略了close()調用。它適用于測試環境和standalone環境,因為相同的connection可以被多個JmsTemplate調用,這些調用可以跨越多個事務。SingleConnectionFactory有一個可能來自于jndi的標準ConnectionFactory引用。
? ? ?CachingConnectionFactory擴展了SingleConnectionFactory的功能,增加了session的緩存,MessageProducer和messageConsumer。緩存的初始化size設置為1,使用
4. core模塊
提供了使用JMS的核心功能。
使用jmsTemplate時只需要繼承callback接口,通過繼承call接口可以定義一個高級別的協議,MessageCreator callback接口在指定session創建一個消息,它只可以被JmsTemplate調用。為滿足更jms api更復雜的應用,SessionCallBack給用戶提供了jms session,ProducerCallback暴露了session和messageProducer兩個。
jms api提供兩種類型的send方法,一種設置delivery模式,優先級,存活時間(time-to-live)作為qos參數,另一種不提供qos參數而使用默認值。
5. Listener模塊
? ?消息監聽容器(MessageListenerContainer)用來從jms 消息隊列中接受消息,然后推送注冊到它內部的消息監聽器(MessageListener)中。spring提供了兩種標準的jms 消息監聽容器,特色如下:
??SimpleMessageListenerContainer:在啟動時,創建固定數目的jms 會話和一個消費者,使用標準的jms MessageConsumer.setMessageListener()方法來注冊監聽器,讓jms 提供者來讓監聽器返回。
DefaultMessageListenerContainer:支持在運行時動態適應,并且能參與到外部受管理事務。每個接收到的消息使用JtaTransactionManager注冊為XA 事務,因而可以充分利用xa 事務語義進行處理。
6. remoting模塊
?
org.aopalliance.intercept.MethodInterceptor 用來接收基于jms的遠程服務。
? ?JmsInvokerClientInterceptor:序列化遠程觸發對象和反序列化遠程觸發結果對象,使用java序列化方法,例如RMI.
??JmsInvokerProxyFactoryBean:jms觸發代理的工廠bean,暴露bean引用的代理服務,使用特定的服務接口。
?JmsInvokerServiceExporter:jms消息監聽器,暴露特定服務bean作為jsm消息的終端,通過jms 觸發代理獲取之。
小結
spring提供了一個jms集成框架,這個框架如spring 集成jdbc api一樣,簡化了jms api的使用。
轉載于:https://www.cnblogs.com/davidwang456/p/4451757.html
總結
以上是生活随笔為你收集整理的spring源码分析之spring-jms模块详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Design Pattern - Ser
- 下一篇: mysql 批量插入数据过多的解决方法