今天也是阳光正好

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  39 随笔 :: 0 文章 :: 5 评论 :: 42780 阅读

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

posted on   今天也是阳光正好  阅读(2360)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示