一、前面我们一直发送的是字符串类型,其实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; @Override
public 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

学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型的更多相关文章

  1. Java-五种线程池,四种拒绝策略,三种阻塞队列(转)

    Java-五种线程池,四种拒绝策略,三种阻塞队列 三种阻塞队列:    BlockingQueue<Runnable> workQueue = null;    workQueue = n ...

  2. 记住 Python 变量类型的三种方式

    title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...

  3. hibernate(五)核心开发接口与对象的三种状态

    本文链接:http://www.orlion.ml/37/ 一.Configuration 1.AnnotationConfiguration 2.进行配置信息的管理 3.configure()方法通 ...

  4. 性能测试学习 第八课--LR12中针对WebServices协议的三种脚本开发模式

    一,webservices协议简介 webservices是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接, 其中最基本的协议包括soap,wsdl,uddi ...

  5. 【2016-10-21】【坚持学习】【Day11】【.net 自带的三种委托】

    三种自带委托: Action Predicate Func Action: 无返回类型 Predicate 返回类型是bool类型 Func 自定义返回类型 Action:没有参数没有返回值 Acti ...

  6. JSP学习(2)---四种基本语法与三种编译指令

    JSP的异常可以不处理,即使是checked异常. 四种基本语法: jsp声明,jsp注释,jsp表达式,jsp脚本 三种编译指令: page,include,taglib 下面是具体的练习. sho ...

  7. Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

    1.configuration(配置信息管理,产生sessionfactory) sessionfactory管理一系列的连接池 opensession 永远打开新的,需要手动close getcur ...

  8. SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式

    在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...

  9. C++中实现回调机制的几种方式(一共三种方法,另加三种)

    (1)Callback方式Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows的窗口消息处理函数就是这种类型. 比如下面的示例代码,我们在Down ...

随机推荐

  1. Arduino语言介绍

    Arduino语言介绍 Arduino语言是建立在C/C++基础上的,其基础是C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让不了解AV ...

  2. TCP-IP详解笔记6

    TCP-IP详解笔记6 用户数据报协议和IP分片 UDP是一种保留消息边界的面向数据报的传输层协议. 不提供差错纠正, 队列管理, 重复消除, 流量控制和拥塞控制. 提供差错检测, 端到端(end-t ...

  3. 【原创】大叔经验分享(18)hive2.0以后通过beeline执行sql没有进度信息

    一 问题 在hive1.2中使用hive或者beeline执行sql都有进度信息,但是升级到hive2.0以后,只有hive执行sql还有进度信息,beeline执行sql完全silence,在等待结 ...

  4. 【原创】大叔问题定位分享(21)spark执行insert overwrite非常慢,比hive还要慢

    最近把一些sql执行从hive改到spark,发现执行更慢,sql主要是一些insert overwrite操作,从执行计划看到,用到InsertIntoHiveTable spark-sql> ...

  5. [PHP]获取静态方法调用者的类名和运用call_user_func_array代入对象作用域

    一.获取静态方法调用者的类名 方法一: class foo { static public function test() { var_dump(get_called_class()); } } cl ...

  6. iOS URL Cache文章推荐 (待完成)

    推荐链接是:http://www.cnblogs.com/Mike-zh/archive/2016/02/24/5210169.html http://blog.csdn.net/y550918116 ...

  7. Mysql 常用SQL语句集锦

    基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day from table_name" ...

  8. npm安装less和less-loadernpm或者stylus和stylus-loader

    vue-cli 构建的项目默认是不支持 less 的,需要自己添加. 首选,安装 less 和 less-loader ,在项目目录下运行如下命令 npm install less less-load ...

  9. Zabbix告警发送邮件时附带性能图

    脚本处理逻辑分析: 通过zabbix传递给脚本的message参数,筛选出报警信息的itemid; 通过itemid获取到图片并保存; 将报警信息和图片组装成html; 发送邮件. 后续脚本里面的处理 ...

  10. hdu4507 数位dp+推公式

    推公式的能力需要锻炼.. /* dp的时候要存结构体 里面三个元素: cnt,就是满足条件的个数 sum1,就是满足条件的数字和 sum2,满足条件的数字平方和 推导过程:还是用记忆化搜索模板 dp[ ...