转载自:http://windows9834.blog.163.com/blog/static/27345004201311841121335/
这是官方推荐要看的原文的翻译:http://codedependents.com/2009/10/16/efficient-lightweight-jms-with-spring-and-activemq/
异步性(asynchronicity),是高伸缩性系统的首要的 设计 原则,对Java来说,这意味着JMS,然后又意味着ActiveMQ。但是我如何高效的使用JMS呢?一个人很有可能会不知所措,在谈论容器、框架、和一堆选项时。那么让我们分开来探讨下。
框架
ActiveMQ文档中提及两个框架:Camel和Spring。那么要做决定就取决于简单性和功能性的对比。Camel支持大量的企业集成模式(Enterprise Integration Patterns),它可以大大简化集成组件间的大量服务和复杂的消息流。如果你的系统需要这样的功能,它当然是非常好的选择。然而,如果你寻找简单性,仅仅支持基本的最佳实践,那么Spring是好的选择。
JCA (使用它或放弃它)
阅读ActiveMQ的Spring支持时,开发者立刻被介绍了JCA容器和ActiveMQ很多的代理和适配器选项的概念。然而这些都不适应。JCA是EJB规范的一部分,对于大部分EJB规范,Spring都没有提供很好的支持。这时,就提到了Jencks,”为Spring提供的轻量级JCA容器”,它可以作为ActiveMQ的JCA容器。 乍看上去,这是个非常好的解决方案,但是我在这里告诉你不要这样做。Jencks最后更新时间是2007年1月。那时ActiveMQ的版本是 4.1x,Spring的版本是2.0.x,但是时间过了很多,事情也变化了很大。甚至是试图从Maven库中获取ActiveMQ4.1的依赖包 Jencks都会失败,因为它已经不存在了。简单的事实是有更好和更简单的方式来缓存资源。
发送消息
Spring消息发送的核心架构是JmsTemplate。在传统的Spring模板方式中,JmsTemplate隔离了像打开、关闭Session和Producer的繁琐操作,因此应用开发人员仅仅需要关注实际的业务逻辑。然而ActiveMQ快速的指出了JmsTemplate gotchas,大多是因为JmsTemplate被设计在每次调用时都打开和关闭session及producer。JmsTemplate损害了ActiveMQ的PooledConnectionFactory对session和消息producer的缓存机制而带来的性能提升。然而,这个太过时了。从Spring2.5.3开始,它开始提供自己的CachingConnectionFactory,我相信该类在缓存方面更加强大。然而,这里有一个点需要注意。默认情况下,CachingConnectionFactory只缓存一个session,在它的JavaDoc中,它声明对于低并发情况下这是足够的。与之相反,PooledConnectionFactory的默认值是500。这些设置,在很多情况下,需要亲自去测试并验证。我将其设置为100,对我来说还是很不错。
接收消息
可能你已经注意了,JmsTemplate gotchas强 烈的不建议你使用JmsTemplate的receive()调用,同样也是因为没有session和consumer的池机制。更多的原因是在 JmsTemplate上的所有调用都是同步的,这意味着调用线程需要被阻塞,直到方法返回。这在使用JmsTemplate发送消息时,没有任何问题, 因为该方法几乎是立即返回。然而,当调用receive方法时,线程将阻塞,直到接收到一个消息为止,这对性能影响很大。不幸的是,JmsTemplate gotchas和Spring支持文档中都没有对该问题提供简单的解决方案。实际上,它们均提倡使用Jencks,我们之前已经说过。实际的解决方案,使用DefaultMessageListenerContainer,已经写在了how do I use JMS efficiently文 档中。DefaultMessageListenerContainer允许异步接收消息并缓存session和消息consumer。更有趣的 是,DefaultMessageListenerContainer可以根据消息数量动态的增加或缩减监听器的数量。简而言之,我们可以完全忽视 JCA。
合并起来
Spring Context配置文件
<? xml version ="1.0" encoding ="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">
<!-- enables annotation based configuration -->
<context:annotation-config/>
<!-- scans for annotated classes in the com.company package -->
<context:component-scanbase-package="net.javasight"/>
<!--
allows for ${} replacement in the spring xml configuration from the
system.properties file on the classpath
-->
<context:property-placeholderlocation="classpath:system.properties"/>
<!-- creates an activemq connection factory using the amq namespace -->
<amq:connectionFactoryid="amqConnectionFactory"
brokerURL="${jms.url}"userName="${jms.username}"password="${jms.password}"/>
<!--
CachingConnectionFactory Definition, sessionCacheSize property is the
number of sessions to cache
-->
<beanid="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-argref="amqConnectionFactory"/>
<propertyname="exceptionListener"ref="jmsExceptionListener"/>
<propertyname="sessionCacheSize"value="100"/>
</bean>
<!-- JmsTemplate Definition -->
<beanid="jmsTemplate"class="org.springframework.jms.core.JmsTemplate">
<constructor-argref="connectionFactory"/>
</bean>
<!--
listener container definition using the jms namespace, concurrency is
the max number of concurrent listeners that can be started
-->
<jms:listener-containerconcurrency="10">
<jms:listenerid="QueueListener"destination="Queue.Name"
ref="queueListener"/>
</jms:listener-container>
</beans>
这里有两点需要注意。首先,我添加了amq和jms的命名空间。第二,我使用了Spring2.5的基于注解的配置。通过使用基于注解的配置,我可以简单的添加@Component注解到我的Java类上,而不是使用XML文件显式的在spring配置文件中定义它们。另外,我可以在我的构造方法中使用@Autowired来将像JmsTemplate这样的对象注入到我的对象中。
QueueSender
package net.javasight; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component publicclassQueueSender{ privatefinalJmsTemplate jmsTemplate; @Autowired publicQueueSender(finalJmsTemplate jmsTemplate){ this.jmsTemplate = jmsTemplate; } publicvoid send(finalString message){ jmsTemplate.convertAndSend("Queue.Name", message); } }
Queue Listener
package net.javasight;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.springframework.stereotype.Component;
@Component
publicclassQueueListenerimplementsMessageListener{
publicvoid onMessage(finalMessage message){
if(message instanceofTextMessage){
finalTextMessage textMessage =(TextMessage) message;
try{
System.out.println(textMessage.getText());
}catch(finalJMSException e){
e.printStackTrace();
}
}
}
}
JmsExceptionListener
package net.javasight;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import org.springframework.stereotype.Component;
@Component
publicclassJmsExceptionListenerimplementsExceptionListener{
publicvoid onException(finalJMSException e){
e.printStackTrace();
}
}
相关推荐
Tomcat 6是一个轻量级的应用服务器,主要用来运行Java Servlet和JavaServer Pages(JSP)。在构建基于Spring和ActiveMQ的应用时,Tomcat可以作为部署环境,承载应用的Web容器部分。 构建JMS系统通常涉及到以下步骤...
在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,而JMS(Java Message Service)则是一种标准接口,用于在分布式系统中进行异步消息传递。ActivemQ是Apache软件基金会的一个项目,它实现了JMS规范,...
Spring框架则是一个广泛应用的轻量级容器,它简化了Java应用程序的开发,包括对JMS的支持。Spring通过其`org.springframework.jms`包提供了丰富的API和抽象,使得配置和使用JMS变得更加简单。 整合ActiveMQ和Spring...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而ActiveMQ则是Apache组织提供的一个开源消息中间件,常用于实现应用程序之间的异步通信。本案例将详细讲解如何将Spring与ActiveMQ整合,以提升系统的...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而ActiveMQ则是Apache组织提供的一个开源消息中间件,用于实现应用间的异步通信和解耦。本篇文章将详细探讨如何在Spring环境中整合并使用ActiveMQ,...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而ActiveMQ则是Apache组织开发的一款开源消息中间件,常用于实现应用程序间的异步通信。本文将深入探讨如何将Spring与ActiveMQ进行整合,以提升系统的...
ActiveMQ是Apache软件基金会的一个项目,它是一款高性能、轻量级的消息中间件,支持多种协议,如OpenWire、STOMP、AMQP、MQTT等。它允许应用程序之间通过消息传递进行通信,从而实现解耦和异步处理,提高系统的可...
Tomcat是一款轻量级的Java应用服务器,主要用于部署Servlet和JSP应用。它符合Java Servlet和JavaServer Pages规范,是许多小型和中型项目的首选服务器。Tomcat与Spring框架配合良好,可以通过Spring的...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而JMS(Java Message Service)则是Java平台上的消息中间件标准,用于应用程序之间的异步通信。本篇文章将详细探讨如何通过Spring框架整合JMS,特别是...
这是一个典型的分布式系统中的消息通信场景,其中SpringBoot作为应用程序框架,ActiveMQ作为消息中间件,而MQTT(Message Queuing Telemetry Transport)则是一种轻量级的发布/订阅消息协议,适用于低带宽、高延迟或...
**Apache Camel** 是一个流行的轻量级集成框架,它提供了丰富的组件库,可以方便地连接各种企业服务和系统。Camel使用EIP(Enterprise Integration Patterns)来设计和实现集成方案,通过简单的DSL(Domain Specific...
Spring框架是Java开发中广泛使用的轻量级框架,它提供了一整套完整的解决方案来简化企业级应用的开发。在本项目中,我们将讨论如何将Spring框架与ActiveMQ消息队列进行整合,以及如何使用Java单独操作ActiveMQ。 ...
Spring框架则是Java领域广泛使用的轻量级应用框架,它简化了Java企业级应用的开发。将ActiveMQ与Spring整合,可以方便地在Spring应用中使用消息队列功能。 首先,我们需要理解JMS(Java Message Service),它是...
MyBatis是一个轻量级的持久层框架,它简化了Java应用与数据库之间的交互。MyBatis允许开发者编写SQL语句,将它们与Java代码直接关联,避免了传统的ORM框架带来的性能开销。在Spring MVC应用中,MyBatis可以通过...
BlazeDS是Spring提供的一个开源项目,提供了一个轻量级的HTTP/HTTPS服务器,用于在Flex客户端和Spring应用之间进行数据推送和远程调用。 6. 测试和部署:项目中的"testspringflex"可能包含了测试用例和部署配置,这...
Spring框架则是Java领域广泛应用的轻量级容器,它简化了Java应用的开发和管理。将ActiveMQ与Spring整合,可以方便地在Spring应用中使用消息队列,实现异步处理和分布式通信。 **一、ActiveMQ安装与配置** 在Linux...
MyBatis是一个轻量级的持久层框架,它简化了Java应用中的SQL操作。与传统的JDBC相比,MyBatis通过XML或注解定义SQL语句,将SQL与Java代码分离,使数据库操作更加直观和易于维护。在Spring中整合MyBatis,可以利用...
- **Tomcat 6.0.30**:Tomcat 是一个免费开源的轻量级 Web 服务器软件,主要用来部署和运行基于 Java 的 Web 应用。Tomcat 6.0.30 版本在此领域也是较为成熟的版本之一。 #### 二、Spring 对 JMS 的支持 Spring ...