JmsTemplate发送消息

使用Jmstemplate向队列中发送数据 NULL 博文链接:https://13813962825.iteye.com/blog/2066980 立即下载

参考文章 https://www.cnblogs.com/java-synchronized/p/7750283.html

JmsTemplate提供了3组*3,共计9个发送用的方法。

发送的方法有3组:

基本的发送
转换并发送
转换、后处理再发送

必需的资源

javax.jms.ConnectionFactory

ConnectionFactory是客户端编程的开始,由它依次获取Connection、Session、Message、MessageProducer或MessageConsumer,从而做好了发送或接收的准备。

我们如何提供ConnectionFactory给JmsTemplate?凭借JmsTemplete提供的构造器或setter方法:

public JmsTemplate(ConnectionFactory connectionFactory)
public void setConnectionFactory(ConnectionFactory connectionFactory)

javax.jms.Destination

Destination是发送的目的地,或者接收的源。

我们如何提供Destination给JmsTemplate?

我们有两个机会做这件事,第一次是在初始化的时候提供一个默认的Destination,第二次是在发送的时候提供一个明确的Destination。相关的方法:

设置默认的Destination
public void setDefaultDestination(Destination destination)
将消息发送到指定的Destinatio
public void send(Destination destination, MessageCreator messageCreator)

以及MessageCreator接口用来提供创建消息的回调方法,后面再讲。

实际上,我们提供了上述的资源之后,我们就是做了这样的指令:让JmsTemplate连接到Destination,从我们提供的ConnectionFactory中获取连接资源。

DynamicDestinationResolver

JmsTemplate还提供了另一种获取Destination的方式:基于Destination解析器、Destination类型、Destination名字的获取。这里解析器默认为DynamicDestinationResolver

public class DynamicDestinationResolver implements DestinationResolver {
    @Override
    public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain)
            throws JMSException {
        Assert.notNull(session, "Session must not be null");
        Assert.notNull(destinationName, "Destination name must not be null");
        // 是否是发布订阅模式,决定了Destination类型是Topic还是Queue,默认为false
        if (pubSubDomain) {
            return resolveTopic(session, destinationName);
        }
        else {
            return resolveQueue(session, destinationName);
        }
    }
  
    protected Topic resolveTopic(Session session, String topicName) throws JMSException {
        return session.createTopic(topicName);
    }
    protected Queue resolveQueue(Session session, String queueName) throws JMSException {
        return session.createQueue(queueName);
    }
}

你可以使用下面的代码来指定解析器、Destination类型:

1 // jt is instance of JmsTemplate
2 jt.setDestinationResolver(new DynamicDestinationResolver()); // set Destination解析器
3 jt.setPubSubDomain(false); // set Destinantion类型

Destination解析器要实现org.springframework.jms.support.destination.DestinationResolver接口。
解析器有默认的值,就是DynamicDestinationResolver

除非你要使用其他的解析器,否则不必调用setDestinationResolver。所以,第2行代码是多余的。
Destination类型有2个:false-Queue类型,true-Topic类型;默认为false。所以,第3行代码是多余的。

设置了解析器、类型,或者直接使用默认的值之后,就可以设置destination的name。
JmsTemplate提供了两个方法:

设置defaultDestination。这个方法和setDefaultDestination(Destination destination)做同样的事情,只是这个方法依赖于解析器和类型。
public void setDefaultDestinationName(String destinationName)
将消息发送到指定的Destination。这个方法和send(Destination destination, MessageCreator messageCreator)做同样的事情,只是这个方法依赖于解析器和类型
public void send(String destinationName, MessageCreator messageCreator)

如何根据destinationName创建Destination实例?
其实上面已经提到了,javax.jms.Session提供了两个方法,分别创建两种类型的Destination:

根据name创建Queue类型的Destination
Queue createQueue(java.lang.String queueName)
根据name创建Topic类型的Destination
Topic createTopic(java.lang.String topicName)

根据这份源码,可以帮助理解pubSubDomain的机制,以及将JMS的api和Spring的Destination解析器这两个知识点连接起来。

发送方法

使用MessageCreator创建消息

jms中的Message,是以接口javax.jms.Message为首的接口家族,这个家族的图谱是这样的:

javax.jms.Message
|---- BytesMessage
|---- MapMessage
|---- ObjectMessage
|---- StreamMessage
|---- TextMessage

JMS将Message细分为5种类型,并在javax.jms.Session接口中分别定义了创建上述Message的多个方法,通常以create*Message为名,返回对应的Message类型。

在JMS的api中,只有javax.jms.Session能创建消息。

所以在Spring中,如果我们要创建Message,就要有Session。但是我们只有现成的ConnectionFactory,我们不应该走一遍从ConnectionFactory到Session的路,否则我们也不需要JmsTemplate帮我们发送了,因为剩下的工作也没多少了——关键是我们并没有从JMS的API中解脱出来。

所以有了MessageCreator的接口,它定义了一个回调的方法:

Message createMessage(Session session)

只要我们把MessageCreator的实例传给JmsTemplate,它就会在合适的时候调用这个方法,并发送返回的消息。那么这个MessageCreator实例怎么来吗,我们可以自己简单实现,但通常使用JmsTemplate自带的匿名内部类实现,后面会有提到。

new MessageCreator() {
			public Message createMessage(Session session) throws JMSException {
				return getRequiredMessageConverter().toMessage(message, session);
			}

1. 基本的发送方法

将消息发送到指定的Destination
public void send(Destination destination, MessageCreator messageCreator)
这个方法和上面做同样的事情,只是这个方法依赖于解析器和类型以解析Destination。
public void send(String destinationName, MessageCreator messageCreator)
将消息发送到defaultDestination。这个方法要求提前设置defaultDestination
public void send(MessageCreator messageCreator)

2. 转换并发送的方法

我们需要将数据装进JMS的Message,然后再发送。JMS的Message有5种具体的类型,不同的类型适合装载不同的数据。如果你不想做这段工作,而是希望能直接把数据丢给谁,然后由它来封装成Message,你只想准备数据,然后发送。那么接下来要介绍的方法,正适合你。

	public void convertAndSend(Destination destination, final Object message) throws JmsException {
		send(destination, new MessageCreator() {
			public Message createMessage(Session session) throws JMSException {
				return getRequiredMessageConverter().toMessage(message, session);
			}
		});
	}

Spring为转换定义了一个接口:org.springframework.jms.support.converter.MessageConverter,定义了下面的两个方法:

发送时用到
Message toMessage(Object object, Session session)
接收时用到
Object fromMessage(Message message)

一般情况下,我们既不需要为MessageConverter提供实现,也不需要面向MessageConverter进行编程,所以我们实在没有必要关注上面的两个方法,扫一眼,有个大概的印象就够了。

说回JmsTemplate,它定义了下面的方法来设置Converter:

public void setMessageConverter(MessageConverter messageConverter)

而且在初始化的时候,会自动赋值一个SimpleMessageConverter类型的实例,所以我们甚至也不需要关心setMessageConverter方法了。

	public JmsTemplate() {
		initDefaultStrategies();
	}
	protected void initDefaultStrategies() {
		setMessageConverter(new SimpleMessageConverter());
	}

转换发送

public void convertAndSend(Destination destination, Object message)
将message转换成JMS的Message,并发送到指定的Destination public void
convertAndSend(String destinationName, Object message)
将message转换成JMS的Message,并发送到指定的Destination。 public void
convertAndSend(Object message)
将message转换成JMS的Message,并发送到defaultDestination。

基本发送

public void send(Destination destination, MessageCreator messageCreator)
将消息发送到指定的Destination
public void send(String destinationName, MessageCreator messageCreator)
将消息发送到指定的Destination。
public void send(MessageCreator messageCreator)
将消息发送到defaultDestination。

这两个系列的方法相似度很高,只是在创建消息的问题上有不同的处理:转换发送隐藏了消息的创建,基本发送需要实现MessageCreator接口来创建消息。

3. 转换、后处理再发送的方法

javax.jms.Message定义了很多的方法用来为消息添加头部信息或属性。但是如果我们要用转换并发送的方法,我们就接触不到Message类型的消息了,自然也无法为其添加任何信息。JmsTemplate提供了另一套发送的方法,允许我们使用自动转换,还允许我们能接触到转换后的消息,以便我们能做些什么。之后我们会返回处理后的Message,交给JmsTemplate发送。

Spring定义了org.springframework.jms.core.MessagePostProcessor接口来做后处理的事,它定义了一个唯一的方法:

对消息进行处理,并返回处理后的消息
Message postProcessMessage(Message message)

转换、后处理、发送

public void convertAndSend(Destination destination, Object message, MessagePostProcessor postProcessor)
public void convertAndSend(String destinationName, Object message, MessagePostProcessor postProcessor)
public void convertAndSend(Object message, MessagePostProcessor postProcessor)

spring-jms:Spring JmsTemplate演示 简单使用 public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml"); JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsQueueTemplate"); Destination destination = (Destination) context.getBean("defaultQueueDestination"); JmsUtil.sendMessage(jmsTemplate, de 立即下载

相关推荐

逆向实战:360加固DEX解密全流程解析(附Frida脚本与SoFixer修复技巧)

本文深入解析360加固DEX解密的全流程,涵盖动态Hook技术、Frida脚本应用及SoFixer修复技巧。通过实战案例详细展示如何识别加固特征、定位关键函数、实现ELF文件修复,并解析RC4和zlib解密算法,为逆向工程师提供全面的技术指导。

weixin_29323551的博客 613

MQ 系列之 JMSTemplate

JMSTemplate 是由 Spring 提供的一个 JMS 消息发送模板,可以用来方便地进行消息的发送,消息发送方法 convertAndSend 的第一个参数是消息队列,第二个参数是消息内容,@JmsListener 注解则表示相应的方法是一个消息消费者。

Demo_Null 1万+

西门子RS485自由口通信Modbus RTU 通信协议

部分西门子的RS485模块不能使用西门子自带的Modbus RTU通信指令,需要通过自己拼接、发送、接收和解析报文完成Modbus RTU通信。通过多次尝试完成该功能: #R_TRIG_Instance(CLK := #触发, Q => #触发上升沿); IF #触发上升沿 THEN // 触发后先将读取完成复位 #读写完成 := 0; END_IF; CASE #功能码 OF 1: // 线圈状态读取 ; 2:

qq_20792765的博客 1万+

消息驱动:如何使用 JMS Template 集成 ActiveMQ?

针对 ActiveMQ,目前有两个实现项目可供选择,一个是经典的 5.x 版本,另一个是下一代的 Artemis,关于这两者之间的关系,我们可以简单地认为 Artemis 是 ActiveMQ 的未来版本,代表 ActiveMQ 的发展趋势。而在 SpringCSS 案例中,Kafka、ActiveMQ 及 16 讲将要介绍的 RabbitMQ 都是消息中间件,在案例系统运行过程中,我们需要选择其中一种中间件演示消息发送和接收到过程,这样我们就需要针对不同的中间件设置不同的 Profile 了。

我乐了的博客 1333

交通小白首投TRB就中Oral?我的完整时间线与避坑指南(附Editorial Manager实操截图)

本文详细解析了交通领域新手如何高效完成TRB国际会议投稿的全流程,从选题策略到投稿系统实操,再到评审过程解析和常见误区避坑指南。特别针对初次投稿者提供了实用建议,包括时间规划、选题考量、Editorial Manager系统操作技巧,以及如何应对评审意见。文章还分享了从录用到会议参与的关键步骤,帮助研究者提升投稿成功率。

weixin_27303545的博客 388

如何适配自定义激光雷达数据到LIO-SAM:解决ring和time参数缺失问题

本文详细解析了如何将非标准激光雷达(如速腾、Livox)适配到LIO-SAM框架中,重点解决ring和time参数缺失问题。提供了从源码修改到通用适配中间件的多层级解决方案,并包含实机测试与性能调优指南,帮助开发者高效完成雷达数据适配。

weixin_42551227的博客 421

AMQ学习笔记 - 08. Spring-JmsTemplate之发送

概述 JmsTemplate提供了3组*3,共计9个发送用的方法。 发送的方法有3组: 基本的发送 转换并发送 转换、后处理再发送 必需的资源 必需的资源有: javax.jms.ConnectionFactoryConnectionFactory是客户端编程的开始,由它依次获取Connection、Session、Message、Messag...

weixin_30512043的博客 402

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7185

JMSTemplate发送消息

操作步骤 第一步:初始化一个spring容器 第二步:从容器中获得JMSTemplate对象。 第三步:从容器中获得一个Destination对象 第四步:使用JMSTemplate对象发送消息,需要知道Destination 思路分析 在配置文件中,配置JMSTemplate 通过加载Spring容器,初始化JMSTemplate对象 再从容器中,获取JMSTemplate对...

天高任鸟飞 5244

深入剖析 YOLOv11 中的 C2PSA 注意力机制

YOLOv11中的C2PSA注意力机制在目标检测领域取得突破性进展。该机制通过跨通道分组交互和轻量级位置编码,在仅增加0.6%计算量的情况下提升mAP 1.5-2.3个百分点。C2PSA创新性地结合局部跨通道交互、位置编码和双分支并行调制,采用纯卷积实现自注意力,避免传统注意力机制的高计算复杂度。实验表明,C2PSA在COCO数据集上以微小计算代价显著提升检测性能,特别是对小目标和遮挡目标效果突出。该模块可直接嵌入YOLO架构,为轻量级目标检测提供新的优化方向。

shrgegrb的博客 3401

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc +开发单片机程序的经验。(这里不解释 gcc 是什么)。

嵌入式技术开发 1845

Spring的JmsTemplate发送消息生成连接过多问题.md

我在使用SpringCloud框架重构我司的采集适配器时,使用的消息中间件有两个,一个是kafka,接收处理网关上报的原始数据。通过采集器的数据处理器之后,封装成为平台对象,发送到ActiveMq,进入平台业务系统。ActiveMq生产的功能,就简单使用Spring提供的jmsTemplate。但是在测试时发现了个问题。有天发现activeMq有些异常。 问题描述: 当采集器短时间内发送大量消息(...

AndyCat的知识库 2607

Labview如何0基础自学快速入门?(纯干货帖)

讲解了如何学习Labview,Labview如何0基础入门,自学Labview的方法。什么都不会如何学好Labview的分享,欢迎关注文章~文章提供《Labview宝典》pdf下载,和《Labview虚拟仪器数据采集与通信控制》pdf下载

关注我,更多技术问题欢迎私聊~ 2万+

2.2、使用 JmsTemplate 向 ActiveMQ 发送 Queue 类型消息

文章目录前言发送类的编写创建 类 JmsTemplateQueueProduct方法一 send方法二 convertAndSend使用 convertAndSend 发送 Java 对象测试代码先看下 http://localhost:8161/admin/queues.jsp参考资料[1].《Spring 实战 第4版》 [2].https://blog.youkuaiyun.com/winter_che...

༺ bestcxx的专栏 ༻ 4317

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

轻量级Spring 之 JmsTemplate 接收消息和发送消息

Spring是一个完整的J2EE框架和解决方案,完整并且模块化,你可以用的他的全部也可以只用他的一部分特性,Spring 包含 IoC, AOP, 事务处理,ORM, 也包括一个简单的MVC框架.            用Spring,自我感觉,可以使你的代码至少节约30%,它的很多template很不错的,比如简单封装后的jdbctemplate,jmstemplate等。ioc用后就会爱不释

chengchanglun'Blog 4369

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ActiveMQ通过JmsTemplate来发送接收消息

添加activemq依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> 配置文件配置消息队列的地址 spr...

zzuhai的博客 8636

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

2.4、使用 JmsTemplate 向 ActiveMQ 发送和获取 Topic 类型消息

文章目录前言回顾 Queue 类型消息的发送和请求过程ActiveMQTopic 和 JmsTemplateTopic 类型消息的特性 前言 本篇文章的内容会非常之少,因为 Topic 类型的数据的发送和接收本身在代码上并没有太大的差别,唯一的差别在于声明 JmsTemplate 时注入的是 ActiveMQQueue 还是 ActiveMQTopic,所以本文仅就这部分差别进行阐述,并且强调一...

༺ bestcxx的专栏 ༻ 2698

淘淘商城——Spring与ActiveMQ的整合及用JmsTemplate发送消息

之前我们一直都是在学习如何使用Junit测试ActiveMQ的发送/接收消息。本文我们将一起学习下ActiveMQ如何与Spring进行整合。 首先,我们要在taotao-manager-service工程的pom.xml文件中添加以下两个依赖(由于我们搭建这个工程的时候就已经添加了对这两个jar的依赖,因此我们不用做这步了)。&lt;dependency&gt; ...

一诺 316

ActiveMQ使用spring JmsTemplate发送消息

下载地址:http://activemq.apache.org/download-archives.html 解压 启动bin\activemq.bat 生产者接口: public interface ProducerService { /** * 向指定队列发送消息 */ void sendMessage(Destination destination, final String msg); /...

vitozhujava的博客 586

spring的jms:用spring的JmsTemplate发送和接收消息

Spring是一个完整的J2EE框架和解决方案,完整并且模块化,你可以用的他的全部也可以只用他的一部分特性,Spring 包含 IoC, AOP, 事务处理,ORM, 也包括一个简单的MVC框架. 用Spring,自我感觉,可以使你的代码至少节约30%,它的很多template很不错的,比如简单封装后的jdbctemplate,jmstemplate等。 ioc用后就会爱不释手,它让你的代码风格...

技术代码资料库 206

activemq jmsTemplate 发送消息速度太慢

http://activemq.apache.org/async-sends.html http://bbs.youkuaiyun.com/topics/370062485 转载于:https://www.cnblogs.com/dongqiSilent/p/5651944.html

weixin_34290000的博客 835

用Spring的jmsTemplate同步发送消息

首先是spring的配置文件   &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http:/

iteye_5769的博客 261

淘淘商城第74讲——Spring与ActiveMQ的整合以及使用JmsTemplate发送和接收消息

之前我们一直都是在学习如何使用Junit测试ActiveMQ的发送/接收消息。本文我们将一起学习下ActiveMQ如何与Spring进行整合。 首先,我们要在taotao-manager-service工程的pom.xml文件中添加以下两个依赖(由于我们搭建这个工程的时候就已经添加了对这两个jar的依赖,因此我们不用做这步了)。<dependency> <groupId>org.sprin

李阿昀的博客 3189
上一篇: IDEA使用习惯及小技巧记录
下一篇: Gson使用踩坑(json)
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值