Spring之JMS之消息监听容器
EJB中JMS消息最常用的用法之一是驱动消息
@JmsListener注解。
一个消息监听容器可以从一个JMS消息队列中接受消息并驱动MessageListener,用于注入到容器中。监听容器响应所有线程的消息接受并分发到监听器进行处理。一个消息监听容器是MDP和消息提供器的中间件,并考虑注册接受消息,事物参与,资源获取和释放,异常转换等。这个允许你作为一个应用程序开发者写与接受消息关联的业务逻辑(可能对其作出响应),并分派到与框架关联的JMS底层设置。
这里Spring提供了两个标准的JMS消息监听容器,每个都有自己特定的功能。
SimpleMessageListenerContainer
这个消息监听容器是两者中比较简单的一个。它在启动时创建了固定数量的JMS会话和消费者,使用标准JMS的MessageConsumer.setMessageListener()方法注册监听器,并留给JMS提供者执行监听回调。这个变量不允许根据运行需要动态变动或者不允许参与外面事物管理。兼容性方面,与单独的JMS规范很相似,但是与Java EE的JMS规范一般不兼容。
DefaultMessageListenerContainer
这个消息监听容器是用的最多的一个。与SimpleMessageListenerContainer相比,这个容器变量允许根据运行需要动态适应,并可参与事物管理中。每个接受的消息当配置JtaTransactionManager时,使用XA事物注册;所以这样的处理可能充分利用XA 事物语义。这个监听容器可在JMS提供器的低需求,高级功能(比如事物参与)和Java EE环境的兼容上达到一个很好的平衡。
容器的缓存级别可以定制化。注意当不用缓存时,针对每个消息的接受创建一个新的连接和一个新的会话。结合到非持久的订阅和高加载方式可能导致消息丢失。确保在这样的例子中使用一个合适的缓存。
当代理崩溃时这个容器有恢复的能力。默认地,一个简答的BackOff实现每五秒重试一次。可能针对更多恢复选项指定一个定制的BackOff实现类。查看ExponentialBackOff 这个例子。
23.2.5 Transaction management(事物管理)
Spring提供了JmsTransactionManager管理单一JMS的ConnectionFactory的事物。这个允许JMS应用程序利用Spring的事物管理功能。JmsTransactionManager执行本地资源事物,从指定的ConnectionFactory到线程,绑定一个JMS连接/会话对。JmsTemplate自动探查这样的事物资源并据此作出响应操作。
在Java环境中,ConnectionFactory将池化连接和会话,所以这些资源通过事物高效重用。在一个单一的环境中,使用Spring的SingleConnectionFactory 将创建一个共享的JMS连接,其每个事物都有其自己独立的会话。作为可选地,考虑使用一个指定提供器的池化的适应器,比如ActiveMQ的PooledConnectionFactory类。
JmsTemplate也可与JtaTransactionManager和XA-capable JMSConnectionFactory共用,来执行分布式事物。注意:这要求使用一个JTA事物管理器,也需要一个XA配置的ConnectionFactory。
贯穿在一个管理的和不受管理的事物环境的代码重用,当使用JMS API从连接中创建会话时,可能比较混乱。这是因为JMS API 仅有一个工厂方法创建会话并且针对事物和确认模式需要值。在一个管理环境中,这些值得设定负责环境中的事物底层,因此这些值由于供应商封装到JMS连接中而被忽略。当在一个管理环境中使用
JmsTemplate
,你可以通过sessionTransacted
和sessionAcknowledgeMode
属性的使用指定这些值。当使用JmsTemplate
的PlatformTransactionManager
,模板将总是给定一个事务性的JMS会话。
更多推荐
所有评论(0)