JMS
JMS的全称是Java Message Service,即Java消息服务。它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应;另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收
本质:通过JMS消息服务器,使生产者和消费者之间解耦。这种技术类似于JDBC,同样是一种规范,各个厂商之间对JMS规范进行实现,在使用时,导入相应厂商的实现类,同类产品有activeMQ、JbossMQ、kafka等
本文通过Spring集成activeMQ实现一个producer程序、和consumer程序,两者通过MQ进行通讯,具体如下:
1.producer工程和consumer工程目录图
2.maven依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.7.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.13.0</version> </dependency> </dependencies>
3.spring-jms.xml配置文件
这里的配置类似于jdbc的配置,需要注意的是消息监听器有几种实现方式,
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <context:component-scan base-package="com.besttone.jms" /> <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 --> <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /> </bean> <!-- 链接对象进行池化,提高效率,类似于jdbc中的 c3p0/druid等连接池 --> <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"> <property name="connectionFactory" ref="targetConnectionFactory" /> <property name="maxConnections" value="10" /> </bean> <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> <property name="targetConnectionFactory" ref="pooledConnectionFactory" /> </bean> <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> <property name="connectionFactory" ref="connectionFactory" /> <!-- 向jmsTemplate注入消息转换器,会自动帮我们转换为我们需要的对象 --> <property name="messageConverter" ref="objConverter"/> </bean> <!--这个是队列目的地,点对点的 --> <!-- <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg> <value>besttone</value> </constructor-arg> </bean> --> <!--这个是主题目的地,一对多的 --> <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg value="topic" /> </bean> <!-- 默认的消息回复队列 --> <bean id="defaultResponseTopic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg> <value>defaultResponseTopic</value> </constructor-arg> </bean> <!-- 类型转换器 --> <!-- producer: object-> Message ; consumer: Message -> object --> <bean id="objConverter" class="com.besttone.jms.converter.ObjectConverter"/> <!-- 消息监听适配器 --> <bean id="defaultResponseTopicListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <property name="delegate"> <bean class="com.besttone.jms.listener.ConsumerListener" /> </property> <!-- 在监听到该topic有消息时,便调用ConsumerListener内的receiveMessage --> <property name="defaultListenerMethod" value="receiveMessage" /> </bean> <!-- 消息监听适配器对应的监听容器 --> <bean id="defaultResponseTopicListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="defaultResponseTopic" /> <property name="messageListener" ref="defaultResponseTopicListenerAdapter" /> </bean> </beans>
4.MessageConverter转换类
这个类在producer端,将Object 转换为javax.jms.Message; 在consumer端,可以将javax.jms.Message 转换为Object
public class ObjectConverter implements MessageConverter { public Object fromMessage(Message message) throws JMSException, MessageConversionException { ObjectMessage objMessage = (ObjectMessage) message; return objMessage.getObject(); } public Message toMessage(Object obj, Session session) throws JMSException, MessageConversionException { return session.createObjectMessage((Serializable) obj); } }
5.ProducerResponseListener类
在produce 端发送消息到Topic之后,如果consumer端消费之后,会返回一个消息,这个类就是处理producer接收回复类
public class ConsumerListener { public void receiveMessage(Object obj) { Msg msg = (Msg) obj; if(msg.getCode()==1){ System.out.println("回复接收成功~"); }else{ System.out.println("回复接收失败!"); } } }
6.生产消息类
jmsTemplate.convertAndSend(destination, obj) // 这个方法会调用上面的转换类
@Component("producerService") public class ProducerServiceImpl implements ProducerService { @Autowired private JmsTemplate jmsTemplate; public void sendObjMsg(Destination destination, Serializable obj) { jmsTemplate.convertAndSend(destination, obj);// 需要定义自己的MessageConverter 或者是使用默认的 } }
7.测试类:
public class ProducerConsumerTest { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring-integration.xml"); Destination destination = (Destination) ac.getBean("topicDestination"); ProducerService producerService = (ProducerService) ac.getBean("producerService"); for (int i=0; i<1; i++) { Msg msg = new Msg(); msg.setCode(0); msg.setMsg("start"); producerService.sendObjMsg(destination,msg); } } }
consumer工程和producer的类似,下面提供下载
下面这些是在学习MQ的时候,比较好的学习资料:
2.http://blog.csdn.net/jwdstef/article/details/17380471
3.http://haohaoxuexi.iteye.com/category/347649
相关推荐
### Spring+JMS+ActiveMQ+Tomcat 实现消息服务 #### 一、技术栈介绍 在本案例中,我们采用的技术栈为Spring 2.5、ActiveMQ 5.4.0 和 Tomcat 6.0.30。这些技术的结合能够有效地构建一个可靠的消息传递系统。 - **...
标题 "jms Spring+ActiveMQ 5.4.2" 涉及的是Java消息服务(JMS)在Spring框架中的应用,以及ActiveMQ作为消息代理的使用。在这个主题下,我们将深入探讨JMS的基本概念、Spring对JMS的支持以及ActiveMQ 5.4.2版本的...
在本教程中,我们将探讨如何整合Spring框架与ActiveMQ消息队列,实现前后台的消息传递。这有助于提升系统的可扩展性和响应速度,降低不同组件之间的耦合度。 首先,Spring框架是Java企业级应用开发的事实标准,它...
ActiveMQ作为JMS的实现,承担起消息队列的职责,确保消息的可靠传输。Tomcat则作为运行环境,承载着整个应用,使得用户可以通过HTTP请求与应用进行交互。 具体实现时,开发者通常会创建一个Spring配置文件,定义JMS...
基于Spring+JMS+ActiveMQ+Tomcat,做一个Spring4.1.0和ActiveMQ5.11.1整合实例,实现了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,简单实例,不包含任何业务。
在本文中,我们将深入探讨如何使用SpringBoot、ActiveMQ和MQTT来实现消息的发送与接收。这是一个典型的分布式系统中的消息通信场景,其中SpringBoot作为应用程序框架,ActiveMQ作为消息中间件,而MQTT(Message ...
ActiveMQ作为JMS的实现,可以通过Spring的配置来轻松集成,使得应用程序能够方便地发送和接收消息。 1. **Spring JMS配置** 在Spring配置文件中,我们需要定义一个`ConnectionFactory`,它是与消息服务器建立连接...
在与ActiveMQ集成时,Spring框架的`spring-jms`模块提供了对JMS(Java Message Service)的抽象,使得我们可以方便地管理和使用消息队列。 **ActiveMQ** ActiveMQ是Apache软件基金会的一个开源项目,它是JMS的实现...
综上所述,Spring整合JMS和ActivemQ提供了一套完整的解决方案,帮助开发者轻松地在应用中实现消息的发送和接收。通过这种方式,可以构建出高可用、松耦合、可扩展的分布式系统,提高系统的稳定性和响应速度。在实际...
4. 配置消息监听器:如果需要实现消息的自动消费,可以配置`DefaultMessageListenerContainer`,并指定消息处理器类,该类需要实现`MessageListener`接口。 5. 实现业务逻辑:在生产者端,通过`JmsTemplate`的`send...
- `Producer`: 负责创建和发送消息到ActiveMQ队列或主题。 - `Consumer`: 实现`MessageListener`接口,当有新消息到达时会被调用。 - `Message`: 携带数据的实体,可以是JMS的`TextMessage`、`ObjectMessage`等。...
在IT行业中,Spring框架与ActiveMQ的集成是一个常见的任务,特别是在构建分布式系统和微服务架构时,消息队列起着至关重要的作用。本示例主要关注如何将Spring框架与ActiveMQ整合,以便实现异步通信和解耦系统组件。...
标题 "activemq学习(2) spring+activemq" 暗示了这篇内容将探讨如何在Spring框架中集成ActiveMQ,一个流行的开源消息代理和消息中间件。ActiveMQ允许应用程序之间通过消息传递进行通信,而Spring则是一个广泛使用...
同时,消息中间件ActiveMQ作为Apache出品的一款开源JMS(Java Message Service)实现,被广泛用于处理异步通信和解耦系统组件。本示例将详细讲解如何在Windows环境下,利用Maven构建工具,将Spring与ActiveMQ进行...
将Spring与ActiveMQ整合,可以轻松地在Spring应用中实现消息队列的功能,提高系统的可扩展性和可靠性。 首先,让我们了解Spring框架如何支持消息传递。Spring提供了JmsTemplate类,这是一个模板类,用于简化发送和...
Spring框架作为Java领域最流行的开发框架之一,提供了强大的依赖注入和面向切面编程功能,而ActiveMQ则是Apache软件基金会的一个开源消息中间件,实现了Java Message Service (JMS) 规范,用于在应用程序之间高效、...
本文将深入探讨如何在Spring环境中使用ActiveMQ来实现消息的发送与接收,以提高系统的可扩展性和解耦性。 首先,我们需要了解Spring对ActiveMQ的支持。Spring提供了`spring-jms`模块,它包含了一组丰富的API和配置...
1. **MessageProducer**: 这是发送消息的组件,它利用Spring的JmsTemplate或JMS Template的配置,可以方便地将消息发送到ActiveMQ的队列或主题。 2. **MessageConsumer**: 这是接收消息的组件,通常是一个监听器,...