Spring + ActiveMQ 整合实现点对点(point to point)消息发送案例

server/2024/11/9 16:37:29/

本节演示点对点模式的消息发送的 Spring + ActiveMQ 代码。

Spring + ActiveMQ 整合
1、依懒包

spring:4.2.5.RELEASE,activemq-all:5.15.0

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.9.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.9.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.0</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.15.0</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.4.2</version></dependency>
2、工程介绍
  • producer 生产者工程

  • consumer 消费者工程

3、整合关键类 JmsTemplate

Spring 官方提供了一个 JmsTemplate 的类,这个类就专门用来处理JMS的,在该类的Bean配置标签中有两个属性connectionFactory-ref 和 defaultDestination-ref 正好对应 JMS 中的 ConnectionFactory 和 Destination。

点对点(point to point)消息发送
1、生产者代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 创建一个ConnectionFactory,为了提升性能用了连接池 --><bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"destroy-method="stop"><property name="connectionFactory"><bean class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL"><value>tcp://localhost:61616</value></property></bean></property><property name="maxConnections" value="50" /></bean><!-- 创建消息目的地,constructor-arg是目的地的名称,此处为spring-queue --><bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg index="0" value="spring-queue" /></bean><!-- 构建JmsTemplate --><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="destination" /><property name="messageConverter"><beanclass="org.springframework.jms.support.converter.SimpleMessageConverter" /></property></bean></beans>
  • 生产者关键代码:SpringMessageSender

package producer;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;/*** 点对点(point to point)消息发送,spring整合* * @author JPM*/
public class SpringMessageSender {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/springContext-activemq.xml");JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");jmsTemplate.send(new MessageCreator() {public Message createMessage(Session session) throws JMSException {TextMessage message = session.createTextMessage();message.setText("hello,spring-queue!");return message;}});context.close();}
}

运行 SpringMessageSender 类,查看 ActiveMQ 管理界面

4f77713cb10940dbc7621a07062c708a.png

说明消息已经发送到了 spring-queue 中。

2、消费者代码(receive方法获取消息)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"destroy-method="stop"><property name="connectionFactory"><bean class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL"><value>tcp://localhost:61616</value></property></bean></property><property name="maxConnections" value="50" /></bean><bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg index="0" value="spring-queue" /></bean><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="destination" /><property name="messageConverter"><beanclass="org.springframework.jms.support.converter.SimpleMessageConverter" /></property></bean></beans>
  • 消费者关键代码:SpringMessageReceiver

package consumer;import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;/*** 点对点(point to point)消息接收,spring整合* * @author JPM*/
public class SpringMessageReceiver {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/springContext-activemq.xml");JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");String message = (String) jmsTemplate.receiveAndConvert();System.out.println(message);context.close();}
}

运行 SpringMessageReceiver 类,查看控制台和 ActiveMQ 管理界面

8df5e77ec7856bf93799de06e324520e.png

538e7417b74350ce06937cfb237984c4.png

说明消费者读取到了消息,并打印到控制台显示。

3、消费者代码(使用消息监听器获取消息)
  • 使用刚才的生产者,再次发送一条消息

20c896f723403991c3d7a89768a52fa4.png

spring 关键代码:springContext-activemq.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"destroy-method="stop"><property name="connectionFactory"><bean class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL"><value>tcp://localhost:61616</value></property></bean></property><property name="maxConnections" value="50" /></bean><bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg index="0" value="spring-queue" /></bean><bean id="jmsContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory" /><property name="destination" ref="destination" /><property name="messageListener" ref="messageListener" /></bean><bean id="messageListener" class="consumer.SpringMessageListener" /></beans>

消费者关键代码:SpringMessageListener

java">package consumer;import java.io.IOException;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 点对点(point to point)消息接收,spring整合,使用Listener* * @author JPM*/
public class SpringMessageListener implements MessageListener {public void onMessage(Message message) {String msg = null;try {msg = ((TextMessage) message).getText();} catch (JMSException e) {e.printStackTrace();}System.out.println(msg);}public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/springContext-activemq.xml");try {System.in.read();} catch (IOException e) {e.printStackTrace();}context.close();}}

运行 SpringMessageListener 类,查看控制台和 ActiveMQ 管理界面

c0996282bd3284fb313dbec78fdb1f9d.png

47a60cea2c7750514d9114c581537555.png

说明消费者读取到了消息,并打印到控制台显示。

使用 Listener 和 receive方法的区别在于 Listener 会一直运行,主动监听消息的变化,及时消费。

Listener 验证,再次运行生产者,观察 ActiveMQ 管理界面

2baa2228b56ac534ffd779f873e01c12.png


http://www.ppmy.cn/server/112648.html

相关文章

电脑知识:如何恢复 Word、媒体和存档文件?

如果您是 Word 用户&#xff0c;那么您一定对无法打开 Word 文档的问题很熟悉。当文档包含大量关键信息时&#xff0c;情况会变得更加复杂。如果您遇到这种情况&#xff0c;那么您将如何处理&#xff1f; 我们再怎么强调在外部存储位置&#xff08;如外部硬盘、网络位置&#…

每天1亿Amazon EC2实例稳定启动背后:解密亚马逊云科技如何构建可靠的云服务

如今&#xff0c;全球大部分互联网应用&#xff0c;以及相当一部分企业服务都跑在云上。云服务一旦出现宕机、服务中断&#xff0c;将为整个经济社会带来巨大的经济损失。尤其是对于那些依赖实时数据处理和分析的行业&#xff0c;如金融交易、在线零售和社交媒体平台&#xff0…

【Python】企业排名、地域分布与词云分析可视化

目录 数据处理 Pyecharts 各国数量 分布地图 数量占比 城市分布 营业收入 利润转化 数据处理 2021世界五百强企业数据&#xff0c;包含公司名称、公司链接、营业收入(百万美元)、利润(百万美元)、国家等信息。数据集下载&#xff1a;Python企业排名、地域分布与词云分…

cocotb的接收和发送逻辑,还是没有弄明白

发送有两种方式 1、定义这样的发 通过前缀连接DUT里面的信号 发送的时候&#xff0c;通过.去访问就可以 2、如果是AXI总线&#xff0c;可以直接调用cocotb的库文件 AXIS总线可以包含以下的信号 通过这个类&#xff0c;可以产生一个AXIS的一帧数据 类的实现大概如下 然后也…

springboot项目引入Sentinel熔断

本文是springboot项目+nacos进行引入,sentiel需自行按照部署 1.springboot包要是2.2.5或以上 <dubbo.version>2.7.7</dubbo.version><spring-boot.version>2.2.5.RELEASE</spring-boot.version><chainwork-boot.version>1.0.5-SNAPSHOT</ch…

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 2

利刃出鞘_Tomcat 核心原理解析&#xff08;十一&#xff09;-- Tomcat 附加功能 WebSocket – 2 一、Tomcat专题 - WebSocket - 案例 - 登录功能 1、在项目 dzs168_chat_room 中&#xff0c;导入 tomcat 项目依赖&#xff08; dzs168_chat_room/web/lib/ &#xff09; idea -…

Javascript 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

考虑一个矩形 ABCD&#xff0c;我们给出了边 AD 和 BC 中点&#xff08;分别为 p 和 q&#xff09;的坐标以及它们的长度 L&#xff08;AD BC L&#xff09;。现在给定参数&#xff0c;我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子&#xff1a; 输入&#xff1a;p (1,…

python数据分析库

python数据分析库之Numpy笔记 导入numpy模块 import numpy as np通过列表创建一个数组 arr np.array([1,2,3,4,5]) # 输出 array([1, 2, 3, 4, 5])使用type函数查看数组对象类型 type(arr) # 输出 <class numpy.ndarray> 使用dtype属性查看数组元素的数据类型 arr…