一、简介
JMS(Java Message Service) java异步消息服务
1.JMS是什么?
jms是一个标准,定义了使用消息的通用API,类似于jdbc这样用户可以用同样的接口操作不同的消息服务实现
2.JMS的应用场景?
jms代表应用之间的异步通信,对应的有同步通信,所谓同步通信就是当消息发出后,客户端需要一直等到服务器响应,即使服务器只是返回了一个空。异步消息类似于寄信,当我们把信件放进邮筒并假定它肯定能正确被投递,我们不用等着回信,甚至不用关心信件什么时候寄出去,并且我们相信信件肯定会得到正确的处理!异步消息就是我们将消息发出给消息代理服务器,并假定消息肯定能够送到指定目的地,相信消息肯定能得到处理。
3.JMS涉及的概念?
- jms是一个规范,既然是规范,那肯定有实现规范的服务比如(ActiveMQ)
- 消息代理服务器(类似于邮局)
- 目的地(类似于收信地址)包含点对点的queue和发布/订阅的topic
- 我们将消息发给代理服务器,由代理服务器发送到指定的目的地,就是这么简单!
4.消息队列和发布订阅介绍
消息队列就是点对点,当消息发出后会有一个服务可以接收到,但关注的服务不只一个,发送方不关心是谁接收了消息。这样做的好处是我们可以通过添加更多的接收者来提升性能
发布订阅,当消息发布后,所有订阅了该消息主题的用户都可以接收到消息,但发送者并不知道谁订阅了自己的消息,想象一个场景,当一个新员工来到公司,HR部门会为该员工建立一些档案等,财务部门会为该员工登记工资信息,后勤部会给该员工分配办公用品等等,也就是说,同样的消息当不同的应用获取后可以进行不同的处理。
二、从一个helloworld开始
不要急按着步骤一步步来。
第一步、下载ActiveMQ(下载地址就自己去网上搜吧!)
第二步、解压后,在如图所示的bin目录下启动代理服务器
第三步、将解压后的lib目录下的activemq-broker-5.9.1.jar和activemq-client-5.9.1.jar拷进你的classpath下,或者在你的pom文件中引入对应版本的依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.9.1</version>
</dependency>
第四步、发送方代码(生产者)
//创建连接工厂 ActiveMQ服务默认的端口号是:61616
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection conn = null;
Session session = null;
try {
//创建连接
conn = connectionFactory.createConnection();
conn.start();
//创建会话
session = conn.createSession(false,session.AUTO_ACKNOWLEDGE);
//创建目的地(点对点目的地,发布订阅是(ActiveMQTopic对象))
Destination destination = new ActiveMQQueue("gamelife.alert.queue");
//创建消息发送者
MessageProducer producer = session.createProducer(destination);
//创建文本消息
TextMessage message = new ActiveMQTextMessage();
message.setText("Hello world!");
//发送消息
producer.send(destination,message);
} catch (JMSException e) {
e.printStackTrace();
} finally {
//资源不要忘了关闭
try {
if (conn != null) {
conn.close();
}
if (session != null) {
session.close();
}
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
第五步、接收方代码(消费者)
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection conn = null;
Session session = null;
try {
conn = connectionFactory.createConnection();
conn.start();
session = conn.createSession(false,session.AUTO_ACKNOWLEDGE);
Destination destination = new ActiveMQQueue("gamelife.alert.queue");
//创建消息接收者
MessageConsumer consumer = session.createConsumer(destination);
//接收消息
TextMessage message = (TextMessage) consumer.receive();
System.out.println(message.getText());
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
if (session != null) {
session.close();
}
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
这样就完成了一个简单的helloworld
三、利用spring的JmsTemplate消灭重复代码
第一步、配置ConnectionFactory、和JmsTemplate
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
第二步、发送消息代码
ApplicationContext context = new ClassPathXmlApplicationContext("/conf/applicationContext.xml");
JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
//可以通过convertAndSend()直接发送实现了序列化接口的对象,第一个参数是目的地,默认是消息队列如果希望是发布订阅的主题可以传一个对象
jmsTemplate.convertAndSend("gamelife.alert.queue",new User("username","password"));
第三步、接收消息
ApplicationContext context = new ClassPathXmlApplicationContext("/conf/applicationContext.xml");
JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
System.out.println(jmsTemplate==null);
User user= (User) jmsTemplate.receiveAndConvert("gamelife.alert.queue");
System.out.println(user.getUsername());
完成了。
四、利用spring创建消息驱动的POJO
首先要知道之前的操作有什么不好呢?就是每次接收方去取消息的时候recive方法会阻塞,知道有消息到达为止,这样不是我们想要的,我们需要一个基于事件驱动的消息系统,就是说当有消息的时候会自动调用我们的方法。
第一步、创建用于监听消息的对象
//仅仅是一个简单的实现了MessageListener接口的POJO
public class JmsHandler implements MessageListener{
public void onMessage(Message message) {
try {
User user = (User) ((ObjectMessage) message).getObject();
System.out.println(user.getUsername());
System.out.println(user.getPassword());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
第二步、配置消息监听对象**
<bean id="jmsHandler" class="jmslistener.JmsHandler"></bean>
<jms:listener-container>
<jms:listener destination="gamelife.alert.queue" ref="jmsHandler" />
</jms:listener-container>
启动服务器后,当有消息到来的时候会自动调用对应的方法
到这里就算结束了,快去动手搭建自己的JMS服务器吧,发布订阅模型就不敲重复的代码了只不过是Destination不同(ActiveMQTopic),对象不同而已,自己跟着IDE的提示走就没问题。
相关推荐
Spring Boot提供了自动配置的能力,使得开发者无需过多关注配置细节,就能快速搭建起基于JMS的消息处理系统。然而,在高并发、高可用性等场景下,还需要考虑消息的持久化、重试策略以及错误处理机制,以确保消息的...
Spring+MyBatis环境搭建 本篇资源摘要信息主要介绍了如何搭建Spring 3.0.6 + MyBatis 3.0.6环境。...本篇资源摘要信息提供了详细的 Spring 3.0.6 + MyBatis 3.0.6 环境搭建指南,旨在帮助读者快速搭建开发环境。
在实际应用中,我们可以结合Spring Boot和Spring JMS,利用其自动配置特性快速搭建JMS应用。对于源码探索,可以深入Spring框架的JMS模块,了解其实现细节和工作原理。而"工具"标签可能暗示了在实际开发中,可能还会...
### Spring快速入门教程知识点详解 #### 一、理论知识概览 **1. 依赖注入与控制反转** - **依赖注入(Dependency Injection, DI)**:在Spring框架中,依赖注入是一种设计模式,用于实现控制反转。它允许在运行...
标题中的"Struts2+Spring3.0+MyBatis3.0平台搭建"涉及到的是一个常见的企业级Java Web开发框架组合。这个平台基于Struts2作为MVC框架,Spring3.0作为核心容器,负责依赖注入(DI)和面向切面编程(AOP),而MyBatis...
虽然Spring5文档主要聚焦于核心框架,但Spring Boot是基于Spring的快速开发工具,它简化了Spring应用的初始搭建和配置。Spring Boot默认配置了很多常见需求,使得开发者可以快速构建独立运行的应用。 五、Spring...
Spring还提供了大量的企业级服务,如数据访问、JMS、邮件服务等。 MyBatis是一个优秀的持久层框架,它简化了数据库操作。MyBatis将SQL语句与Java代码分离,允许开发者在XML配置文件或注解中编写SQL,提高了SQL的...
Spring全家桶是企业级应用开发中广受欢迎的解决方案,它包括了一系列的模块和工具,可以...在不断的发展中,Spring全家桶还包含了Spring Boot、Spring Cloud等更多模块,帮助开发者快速搭建和部署基于微服务的应用。
Spring整合ActiveMQ是Java消息服务(JMS)在Spring框架中的应用,用于实现生产者与消费者的解耦。...通过理解上述步骤,开发者可以快速搭建起生产者和消费者的示例,进一步探索JMS在实际项目中的应用。
在描述中提到的"项目搭建整合包"通常包含了一系列预配置好的文件和配置,帮助开发者快速启动一个新的Spring项目。这个包可能包括了Spring的jar包,web.xml配置文件,Spring的配置文件如applicationContext.xml,以及...
在下载的"spring3+cxf2.7 整合jar包"中,可能包含了Spring 3.x版本和CXF 2.7版本的库文件,以及相关的示例配置文件,这些可以帮助开发者快速搭建和运行一个Spring+CXF的环境。使用时,开发者需要根据自己的项目需求...
4. **Spring Context**:这是Spring框架的上下文模块,它扩展了Core Container的概念,引入了环境感知能力,如bean的国际化、事件传播以及对其他Spring模块(如JDBC、JMS、JMX等)的支持。 5. **Spring JDBC**:...
Spring Boot是为了简化Spring应用的初始搭建以及开发过程而诞生的。它默认配置了许多常见的功能,如嵌入式Web服务器、健康检查端点、自动配置等,让开发者能够快速启动和运行项目。 7. **Spring Security** ...
7. **Spring Boot**:虽然不直接在“spring-jars”中,但Spring Boot是Spring的一个重要组成部分,它简化了Spring应用的初始搭建以及开发过程,通过自动配置和起步依赖,可以快速创建独立的、生产级别的基于Spring的...
压缩包中的“lib (1)”很可能包含了所有这些必要的jar文件,确保了开发者可以快速搭建一个支持Spring和AOP的开发环境,进行基础的Spring应用开发。 总的来说,这个“Spring+AOP全套jar包”是一个非常实用的开发资源...
- Spring Boot提供了一种快速搭建Spring应用的方法,它默认配置了很多常用的特性,如内嵌的Tomcat服务器、自动配置等功能。 #### 2. **使用Spring Security进行安全控制** - Spring Security是一个强大的安全框架,...
Java Spring框架是一个非常流行的开源框架,主要用于简化Java应用的开发。Spring为Java提供了全面的编程和配置模型,从而可以...通过以上内容的学习和实践,可以快速入门并掌握Spring框架的基本使用和相关开发技巧。
- **分发 ZIP 文件**:Spring 提供 ZIP 分发包,便于没有构建工具的环境快速搭建开发环境。 - **日志**:Spring 支持多种日志框架,包括 Commons Logging、SLF4J 和 Log4J。 #### 二、Spring Framework 4.x 新功能...
Spring Boot简化了Spring应用的初始搭建和配置过程,它内置了Tomcat服务器,支持自动配置,以及“起步依赖”功能,让开发者能够快速启动项目。 6. **Spring Data** Spring Data提供了与各种持久化技术(如JPA、...