一、前面我们一直发送的是字符串类型,其实activemq一共支持五种消息类型:

1.String消息类型:发送者:消费者:

1.String消息类型:发送者:消费者:

1.String消息类型:发送者:消费者:

1.String消息类型:发送者:消费者:

1.String消息类型:发送者:消费者:

二、3种监听器:

1.MessageListener:

  MessageListener是最原始的消息监听器,它是JMS规范中定义的一个接口。其中定义了一个用于处理接收到的消息的onMessage方法,该方法只接收一个Message参数。我们前面在讲配置消费者的时候用的消息监听器就是MessageListener.

2.SessionAwareMessageListener:

  SessionAwareMessageListener是Spring为我们提供的,它不是标准的JMS MessageListener。MessageListener的设计只是纯粹用来接收消息的,假如我们在使用MessageListener处理接收到的消息时我们需要发送一个消息通知对方我们已经收到这个消息了,那么这个时候我们就需要在代码里面去重新获取一个Connection或Session。SessionAwareMessageListener的设计就是为了方便我们在接收到消息后发送一个回复的消息,它同样为我们提供了一个处理接收到的消息的onMessage方法,但是这个方法可以同时接收两个参数,一个是表示当前接收到的消息Message,另一个就是可以用来发送消息的Session对象,

3.MessageListenerAdapter:

  MessageListenerAdapter类实现了MessageListener接口和SessionAwareMessageListener接口,它的主要作用是:1.将接收到的消息进行类型转换,然后通过反射的形式把它交给一个普通的Java类进行处理。2.自定义反射类。3.自动回复发送者消息

重点说一下这个MessageListenerAdapter,

新建自定义监听器java类:有两个方法handleMessage和receiveMessage,其代码如下(参数可以是五种消息类型,根据作用1可知这是自动根据反射转换的,所以不需要像上面讲的消息那样在onmessage中转换,你发送的文本就进入参数是String的,你发送的是实体类就进入到参数是实体类的)

package com.easylab.jms.consumer;import com.easylab.jms.entity.Student;public class  myListenner {//方法里面的参数可以是那五种消息类型,在接受的时候会自动通过反射转换,而不是想别的监听器需要在onmessage房中手动转换public void handleMessage(Student message) {System.out.println("ConsumerListener通过handleMessage接收到一个纯文本消息,消息内容是:" + message.toString());}public void receiveMessage(Student message) {System.out.println("ConsumerListener通过receiveMessage接收到一个纯文本消息,消息内容是:" + message.toString());}public void handleMessage(String message) {System.out.println("ConsumerListener通过handleMessage接收到一个纯文本消息,消息内容是:" + message.toString());}//一旦defaultListenerMethod设置的方法,返回值不是null,就说明要把返回值自动回复给发送者public String receiveMessage(String message) {System.out.println("ConsumerListener通过receiveMessage接收到一个纯文本消息,消息内容是:" + message.toString());return"自动给你回复消息了哦,你接到了吗?";}
}

在xml配置文件中配置自己的监听器和容器和队列,监听哪个队列、用哪个方法接收、用哪个方法回复、回复到哪个队列都可以设置

 <!--以下是使用MessageListenerAdapter监听器相关==============================================================================--><!-- 消息监听适配器 第一种方法通过构造方法参数设置 --><!--<bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"><constructor-arg><bean class="com.easylab.jms.consumer.myListenner"/></constructor-arg></bean>--><!-- 消息监听适配器 第二种方法通过delegate属性设置 --><bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"><property name="delegate"><bean class="com.easylab.jms.consumer.myListenner"/></property><!--默认接受到消息后调用哪个方法--><property name="defaultListenerMethod" value="receiveMessage"/><!--设置监听器回复消息的队列(用的以前的点对点队列),也可以通过发送者发送方中的方法setJMSReplyTo设置--><property name="defaultResponseDestination" ref="queueDestination"/></bean><!-- 消息监听适配器对应的监听容器 --><bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory"/><property name="destination" ref="adapterQueue"/><property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter来作为消息监听器 --></bean><!-- 用于测试消息监听适配器的队列目的地 --><bean id="adapterQueue" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg><value>adapterQueue</value></constructor-arg></bean>

发送者:

//以下是使用MessageListenerAdapter监听器相关
@Resource(name = "adapterQueue")Destination destination;@Resource(name = "queueDestination")Destination responseQueue;@Overridepublic void sendMessageByAdapter(String message){// 使用JmsTemplate发送消息jmsTemplate.send(destination, new MessageCreator() {public Message createMessage(Session session) throws JMSException {TextMessage textMessage = session.createTextMessage(message);System.out.println("发送消息:");//通过setJMSReplyTo设置监听器回复消息的队列,也可以通过xml中配置defaultResponseDestination设置/* textMessage.setJMSReplyTo(responseQueue);*/return textMessage;}});}

运行java类:

service.sendMessageByAdapter("测试MessageListenerAdapter");

运行结果:

结果可以看到接收到了消息,也自动回复了消息。

项目代码链接:https://github.com/MrLiu1227/ActiveMQ

转载于:https://www.cnblogs.com/liuyuan1227/p/10771460.html

学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型相关推荐

  1. Redis 消息队列的三种方案选型

    文章目录 Redis 消息队列的三种方案选型 消息队列(Message Queue,简称 MQ) 消息队列使用场景 Redis 消息队列应用背景,选型思考 Redis消息队列发展历程 在Redis中提 ...

  2. Spring的4种事务管理(1种编程式事务+三种声明事务)

    2019独角兽企业重金招聘Python工程师标准>>> Spring的4种事务管理(1种编程式事务+三种声明事务) 一.Spring事务的介绍 二.编程式事务xml的配置 注入后直接 ...

  3. 安川伺服总线通讯方式_plc通讯方式有哪三种?plc常见的三种通讯方式

    原标题:plc通讯方式有哪三种?plc常见的三种通讯方式 PLC = Programmable Logic Controller,可编程逻辑控制器,一种数字运算操作的电子系统,专为在工业环境应用而设计 ...

  4. golang: 密码中允许出现数字、大写字母、小写字母、特殊字符,但至少包含其中2种且长度在8-16之间(四种符号任意满足三种即可)

    要求: 密码中允许出现数字.大写字母.小写字母.特殊字符(.@$!%*#_~?&^),但至少包含其中2种且长度在8-16之间(四种符号任意满足三种即可) package mainimport ...

  5. 鬼谷子:深交四种人,绝交三种人

    导读: 鬼谷子是中国历史上一位极具神秘色彩的人物,被誉为千古奇人,创建鬼谷门派,长于持身养性,精于心理揣摩,深明刚柔之势,通晓纵横捭阖之术,独具通天之智.鬼谷子身怀旷世绝学,智慧卓绝,精通百家学问,是 ...

  6. 鬼谷子:深交四种人,绝交三种人!

    和什么样的人在一起,就有什么样的人生. 朋友是我们选择的亲人. 日夜相处,耳濡目染,朋友的模样,就是自己的模样. 跟着蜜蜂能找到花蜜,跟着苍蝇只能找到水沟. 选择朋友,就是选择自己的命运. 不是所有人 ...

  7. ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略

    ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略 目录 三.模型训练 ...

  8. 广播泛洪_一分钟了解交换机四种报文中的三种:广播、组播、未知单播

    随着互联网的发展,各种应用层出不穷,日新月异,对网络设备的要求也越来越高,对广大设备厂商也提出更多的要求.不过这些事情都与二层交换机没有关系:) ,因为各种应用的数据到达二层交换机时,都只会变成一个一 ...

  9. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

最新文章

  1. 佩恩:京奥了不起 10年后“水落石出”
  2. 遗传算法就是创造力的本质
  3. SQL Server :DBLINK创建及使用
  4. tensorflow错误:Shape (10, ?) must have rank at least 3
  5. sqlserver表分区
  6. cheerio api
  7. 在构造函数/析构函数中调用virtual函数带来的影响
  8. “新基建”横空出世,9本书助你把握7+2大领域风口
  9. 191202-GETJOB-捡历的写法
  10. IDEA如何打包可运行jar,外部引用jar包版
  11. Java 源码 —— List
  12. Observer模式(观察者设计模式)
  13. vue 实现文本的拖拽_基于Vue实现拖拽效果
  14. 电视直播源码2.0-全站HTML文件
  15. 安装oh-my-zsh+、插件zsh-syntax-highlighting、zsh-autosuggestions、zsh-autosuggestions、autojump修改配置
  16. winhex 比较详细的图文使用教程
  17. 剑与家园服务器维护,《剑与家园》杀鸡取卵式运营 如何拯救短命的区服?
  18. python代码情话_python教你谈恋爱-之-土味情话5000条
  19. centos7上先要关闭httpd服务之后再卸载,反正卸载之后就是安装不上一脸懵逼
  20. Word如何调整页边距

热门文章

  1. Asp深度揭密(下)
  2. jQuery实现多个MP3音频播放
  3. HEML、CSS、Javascript基础知识总结
  4. 「Vue」vuex 的使用
  5. 科研汪的日常--“键皇”,静电容的又一座高峰(REALFORCE RFU联名版开箱)
  6. OpenCV3学习(11.6) ORB特征检测器及BRIEF描述符
  7. java成绩前五名的代码_java 如何选出成绩排前5名的学生呢
  8. java for class_Java ObjectStreamClass forClass()方法与示例
  9. 解压大于4g的文件_python解压压缩包
  10. 解锁树莓派root账号