转自:http://blog.csdn.net/suifeng3051/article/details/51721141
本篇文章主要描述了如何配置Spring-JMS,至于为何这样配置及Spring-JMS相关介绍,请阅读这篇文章:Spring整合JMS(消息中间件)。我们这里的消息broker用的是ActiveMQ。
一、相关配置
本篇主要讲解如何在Spring中配置JMS,关于Spring本身的配置本文就不多做介绍了。
1.1 配置maven依赖
在使用Spring-JMS之前,先配置相关依赖。
<!-- Java JMS 原生API -->
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
<version>2.0</version>
</dependency>
<!-- spring-jms API -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- active-mq核心包 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<!-- spring-test类用来测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
1.2 安装并启动ActiveMQ
这里只是简单介绍如何安装启动ActiveMQ,详细请参考官方文档。
- 下载ActiveMQ:http://activemq.apache.org/download.html
-
安装:
- 解压:tar zxvf activemq-x.x.x-bin.tar.gz
- 增加权限:cd [activemq_install_dir]/bin
chmod 755 activemq
-
启动:
cd [activemq_install_dir]/bin
./activemq start
-
检查是否启动成功:
netstat -nl|grep 61616
我们还可以通过监控页面查看ActiveMQ运行情况:http://localhost:8161/admin (默认用户名密码都是admin)
1. 3 配置JMS相关bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:amq="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd">
<!-- 配置连接ActiveMQ的ConnectionFactory -->
<bean id="amqConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory"
p:brokerURL="tcp://localhost:61616"/>
<!--为了提高效率,配置一个连接池-->
<bean id="cachedConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory"
p:targetConnectionFactory-ref="amqConnectionFactory"
p:sessionCacheSize="10"/>
<!-- 配置broker的destination-->
<bean id="destination"
class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="FOO.TEST"/>
</bean>
<!-- 配置Spring的JmsTemplate -->
<bean id="producerTemplate"
class="org.springframework.jms.core.JmsTemplate"
p:connectionFactory-ref="cachedConnectionFactory"
p:defaultDestination-ref="destination"/>
</beans>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
从这个配置中可以看到,这里的配置比Spring整合JMS(消息中间件)文章中介绍的多了一个cachedConnectionFactory
配置。我们知道创建和销毁连接是非常消耗资源的,为了解决创建销毁连接带来的资源消耗,我们一般会引入连接池(Pool)或者缓存(Cache)。普通的JmsTemplate的ConnectionFactory每次发送消息时都需要建立新的连接,这样效率是非常低的,所以在具体配置时,我们要尽量用到连接池或缓存,所以这里的配置中加了一个cachedConnectionFactory
作为缓存。
二、发送消息
写一个JmsMessageProducer异步发送消息:
@Component
public class JmsMessageProducer {
private static final Logger logger = LoggerFactory.getLogger(JmsMessageProducer.class);
@Autowired
protected JmsTemplate jmsTemplate;
protected int numberOfMessages = 10;
public void sendMessages() throws JMSException {
StringBuilder payload = null;
for (int i = 0; i < numberOfMessages; ++i) {
payload = new StringBuilder();
payload.append("Message [").append(i).append("] sent at: ").append(new Date());
jmsTemplate.convertAndSend(payload.toString());
logger.info("Sending message number [" + i + "]");
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
三、接收消息
3.1 方式一:写一个JmsMessageConsumer 同步接收消息
@Component
public class JmsMessageConsumer {
private static final Logger logger = LoggerFactory.getLogger(JmsMessageProducer.class);
@Autowired
private JmsTemplate template;
public void receiveMessages() throws JMSException {
Message message =template.receive();
TextMessage textMessage =(TextMessage)template.receive();
logger.info(textMessage.getText());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3.2 方式二:写一个JmsMessageListener监听器异步接收消息
@Component
public class JmsMessageListener implements MessageListener{
private static final Logger logger = LoggerFactory.getLogger(JmsMessageListener.class);
public void onMessage(Message message) {
try {
TextMessage msg = (TextMessage) message;
logger.info("Consumed message: " + msg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
写完listener之后还需要在配置文件中配置这个listener:
<!-- 注入我们写的listener -->
<bean id="jmsMessageListener" class="com.heaven.spring.jms.JmsMessageListener"/>
<!-- 配置listener到listener-container当中 -->
<jms:listener-container
container-type="default"
connection-factory="cachedConnectionFactory"
acknowledge="auto">
<jms:listener destination="FOO.TEST" ref="jmsMessageListener" method="onMessage"/>
</jms:listener-container>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
四、测试一下
4.1 测试发送异步消息
写一个JmsMessageProducerTest测试一下发送:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/root-context.xml")
public class JmsMessageProducerTest {
@Autowired
JmsMessageProducer jmsMessageProducer;
@Test
public void testSend(){
try {
jmsMessageProducer.sendMessages();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
看一下运行结果:
消息已经异步发送成功,虽然还没有消费者消费,消息就像被成功处理一样。
4.2 测试同步接收消息
写一个JmsMessageConsumerTest 测试一下接收:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/root-context.xml")
public class JmsMessageConsumerTest {
@Autowired
JmsMessageConsumer jmsMessageConsumer;
@Test
public void testSend(){
try {
jmsMessageConsumer.receiveMessages();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
看一下运行结果:
我们可以看到消费者接收到一条消息,这条消息正是上面发送者发送的第一条消息。如果我们再运行一遍则会收到第二条消息。如果所有消息都消费完了,broker中没有消息了,此时JmsMessageConsumerTest进程便会挂起一直等待,直到有新消息产生,大家可以试一下。
4.3测试一下异步消息接收
按照上面3.2节写介绍一个JmsMessageListener
并将其配置到 listener-container
中。此时JmsMessageListener
便会实时监听brokerURL="tcp://192.168.134.128:61616"
这个端口,一旦有消息产生,便会在onMessage()
方法接收到消息。其实此时我们的producer和监听器都在同一个应用中,如果我们再运行producer,可以看到如下结果:
通过运行结果可以看到,每当生产者生产消息,监听器便会实时接收到消息。
相关推荐
**Spring JMS 教程** Spring JMS(Java Messaging Service)是Spring框架的一部分,它提供了一个高级抽象层来简化JMS编程。通过Spring JMS,开发者可以更容易地使用消息传递来构建可伸缩、可靠且分布式的企业级应用...
- **改进的入门体验**:Spring 4.0版本提供了更加友好的入门教程,帮助开发者更快地上手。 - **移除过时的包和方法**:为了保持框架的精简和高效,Spring 4.0移除了不再使用的包和方法。 - **支持Java 8**:Spring ...
2. **AOP**:面向切面编程是Spring提供的另一个重要功能,允许开发者定义“切面”,这些切面可以在程序的多个点(如方法调用)被“织入”以实现通用行为,如日志记录、事务管理等。 3. **MVC框架**:Spring MVC是...
3. 数据访问/集成(Data Access/Integration):涵盖了JDBC、ORM(Object Relational Mapping)、OXM(Object/XML Mapping)、JMS和JTA等,简化了数据存取操作。 4. Web模块:包括Web-Servlet、Web-MVC、Web-Struts...
2. **Data Access/Integration**:包含了JDBC、ORM(对象关系映射)、OXM(对象XML映射)和JMS(Java消息服务)等数据访问层的支持。 3. **Web**:提供MVC(Model-View-Controller)框架,支持RESTful风格的Web服务...
spring常用知识点Spring RestTemplateSpring 3 + Quartz 1.8.6 定时器 任务调度教程:线程池cn/injava/spring/core/feature/concurrent
2. **Core Container**:包括spring-core、spring-beans、spring-context和spring-expression(SpEL)模块。Spring Core提供了依赖注入(DI)和容器的基础,而Spring Beans定义了bean的生命周期和配置。Spring ...
Spring、JMS、ActiveMQ和Tomcat是Java开发中常用的技术组件,它们分别扮演着不同的角色,构建出高效的企业级消息通信系统。本教程将详细阐述这些技术的使用及其相互结合的方式。 首先,Spring是一个开源的Java应用...
### Spring Framework 5.0.0.M1 详尽教程概览 #### 一、Spring框架概述 **1. 开始使用Spring** Spring 框架是一个轻量级且全面的框架,它提供了构建企业级应用程序所需的所有核心功能。本章节主要介绍了如何开始...
Spring官方文档在5.2.8版本中也进行了更新和完善,提供了详尽的教程和参考指南。同时,Spring社区活跃,开发者可以在论坛、Stack Overflow等平台上获取帮助和分享经验。 总之,Spring 5.2.8是一个全面而稳定的版本...
"spring-framework-4.0.5.RELEASE-docs"文档包包含了详尽的API参考、用户指南和开发者教程,帮助开发者快速上手和深入理解Spring框架。此外,Spring拥有活跃的社区和丰富的第三方资源,如Stack Overflow、Spring.io...
本教程将深入探讨如何将这两个强大的工具结合在一起,以创建一个简单的发送JMS消息的入门实例。 首先,我们需要理解ActiveMQ的基本概念。ActiveMQ是Apache软件基金会开发的一个开源消息代理,它实现了JMS规范,提供...
### Spring框架入门教程知识点详解 #### 一、Spring框架基础知识 **1. 依赖注入 (Dependency Injection, DI) 与 控制反转 (Inversion of Control, IoC)** - **依赖注入**: 在运行期间,由外部容器动态地将依赖...
本教程“Spring绝佳入门教程.pdf”旨在为初学者提供一个全面且深入的Spring框架学习路径,帮助他们快速掌握Spring的核心概念和实践技巧。 1. **Spring概述** Spring框架是一个开源的应用程序框架,最初由Rod ...
【ActiveMQ-JMS简单实例使用Tomcat】是一个关于如何在Tomcat环境下集成并使用ActiveMQ进行JMS消息传递的初级教程。ActiveMQ是一款开源的消息中间件,它遵循JMS(Java Message Service)1.1规范,能兼容J2EE1.4及以上...
2. **spring-beans.jar**:包含Bean工厂和IoC容器的实现,负责Bean的创建、配置和管理。 3. **spring-context.jar**:扩展了IoC容器,提供了上下文支持,如国际化、事件传播、AOP代理等。 4. **spring-aop.jar**:...
标题中的"CXF与Spring整合下载文件四"表明这是一个关于整合Apache CXF(一个开源的Java框架,用于构建和开发服务导向架构(SOA)应用程序)和Spring框架的教程或资源集合。Spring是一个广泛使用的Java应用框架,它...
JMS规范 Spring JMS官方教程 JMS基本教程
2. Data Access/Integration,包含数据访问和集成的相关模块,例如JDBC、ORM、OXM、JMS和Transactions等,这些模块为数据访问提供了丰富的支持。 3. Web,包含构建Web应用程序的模块,如Spring MVC,它提供了一个...
Spring 3.0版本引入了许多新特性和改进,包括对Java 5的支持、更详尽的文档、新的文章和教程,以及模块组织和构建系统的更新。其中,值得注意的是核心APIs针对Java 5进行了更新,增强了表达式语言、IoC容器功能,并...