springboot 集成 activemq

文章目录

  • 一:说明
  • 二:e-car项目配置
    • 1 引入activemq依赖
    • 2 application启动类配置消息监听
    • 3 application.yml配置
    • 4 MQConfig.java 配置类
    • 5 ecar 项目中的监听
    • 6 junit 发送消息
  • 三:tcm-chatgpt项目配置
    • 5 MQListener.java 监听消息
  • 三 测试
    • 启动activemq服务
    • 队列![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/76d5be042cbb43069dd723da2ebd60c3.png)
    • 发布订阅模式
  • 四:发送对象消息
    • 配置队列名称
    • 开启监听
    • 测试类
      • 接收ObjectMessage的消息
      • Map接收的消息

一:说明

1-在两个不同的应用发送和接收消息
2-消息发送应用是 e-car 项目,接收端是 tcm-chatgpt项目,当然,同一个项目也是可以发送和接收的

二:e-car项目配置

1 引入activemq依赖

<!-- 集成 ActiveMQ -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

2 application启动类配置消息监听

加上 @EnableJms 注解, 开启JMS

@EnableJms // 开启JMS
@SpringBootApplication(scanBasePackages="com.nrbc.ecar")
@MapperScan("com.nrbc.ecar.dao.mapper")
public class EcarAppClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EcarAppClientApplication.class, args);
    }
}

3 application.yml配置

  • 1 注意: 开启主题策略,默认是关闭 开启主题模式,要设置为true
    如果要使用队列模式,pub-sub-domain 要设置为false jms:
    pub-sub-domain: false
  • 同时使用jms的Queue(队列)和Topic(发布订阅),可查看这边文章: 文章链接
spring:
  # activemq相关配置
  activemq:
    broker-url: tcp://localhost:61616
    user: liping
    password: liping
    packages:
      # 配置信任所有的包,这个配置为了支持发送对象消息(如果传递的是对象则需要设置为true,默认是传字符串)
      trust-all: true
  # 开启主题策略,默认是关闭 开启主题模式
  jms:
    pub-sub-domain: true

# 配置activemq队列的名称和主题名称
amq:
  qname:
    queueName-1:
      queueName-1
  topicName:
    name-1:
      topic-prot-1
    name-2:
      topic-prot-2

4 MQConfig.java 配置类

/**
 * 专门配置mq通道的配置类
 */
@Slf4j
@Configuration
public class MQConfig {

    @Value("${amq.topicName.name-1}")
    private String tpName;

    @Bean(name = "queueName")
    Queue queueName() {
        return new ActiveMQQueue("test_queue");
    }

    /**
     * 主题(发布\订阅模式)通道
     * @author kazaf
     * @date 2024/4/24 16:43
     */
    @Bean(name = "topic1")
    Topic queueFind() {
        log.info("${amq.topicName.name-1}=" + tpName);
        return new ActiveMQTopic("topic-model");
    }

    @Bean(name = "topic2")
    Topic topic2() {
        return new ActiveMQTopic("topic-model2");
    }

    @Bean(name = "topic3")
    Topic topic3() {
        return new ActiveMQTopic(tpName);
    }

}

5 ecar 项目中的监听

/**
 * 专门配置mq通道的配置类
 */
@Slf4j
@Component
public class MQListener {
 
 
    /*@JmsListener(destination = "test_queue")
    public void jiant (String message) {

        System.out.println("监听到消息》:" + message);
        log.info("监听到消息---》:" + message);
    }*/

    @JmsListener(destination = "topic-model")
    public void reciveTopic(String message) {
        log.info("11接收主题消息》:"+message);
    }

    @JmsListener(destination = "topic-model2")
    public void topicReceive2(String message) {
        log.info("topic-2监听到消息---》:" + message);
    }

    /**
     * 主题名称从配置文件中动态获取 
     */
    @JmsListener(destination = "${amq.topicName.name-1}")
    public void topicReceive3(String message) {
        log.info("topic-3监听到消息---》:" + message);
    }
 
}

6 junit 发送消息

  • 调用类需要注入消息模板,队列名称或者主题名称
    也可以编写接口发送,demo随个人习惯
@Slf4j
@SpringBootTest(classes = EcarAppClientApplication.class)
@RunWith(SpringRunner.class)
public class ActivemqTest {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queueName;
    @Autowired
    private Topic topic1;
    @Autowired
    private Topic topic2;
    @Autowired
    private Topic topic3;

    @Test
    public void queueSender()  {
        String message="我是队列发出的信息";
        jmsMessagingTemplate.convertAndSend(queueName, message);
        log.info("queueSender发送--》:"+message);
//        TimeUnit.SECONDS.sleep(60);
    }

    /**
     * 发送 主题消息(广播)
     * @author kazaf
     * @date 2024/4/24 17:09
     */
    @Test
    public void topicSender()  {
        String message="我是topic-1a";
        jmsMessagingTemplate.convertAndSend(topic1, message);
        log.info("topicSender发送--》:"+message);

        String message2="我是topic2";
        jmsMessagingTemplate.convertAndSend(topic2, message2);
        log.info("topic2Sender发送--》:"+message2);

        String message3="我是topic3发送的";
        jmsMessagingTemplate.convertAndSend(topic3, message3);
        log.info("topic3Sender发送--》:"+message3);

    }
}

三:tcm-chatgpt项目配置

  • 1、2、3、5 跟e-car项目一样的配置

5 MQListener.java 监听消息

MQListener类
代码

/**
 * @Description: mq监听类
 * @Author: kazaf
 * @Date: 2024-04-24 9:34
 */
@Slf4j
@Component
public class MQListener {

    @JmsListener(destination = "test_queue")
    public void onMessage(String message) {
        System.out.print(message);
        //获取到消息后可以干一些事情
        log.info("恰恰监听到的消息》:"+message);
    }

    @JmsListener(destination = "topic-model")
    public void reciveTopic(String message) {
        log.info("11接收主题消息》:"+message);
    }

    @JmsListener(destination = "topic-model2")
    public void reciveTopic2(String message) {
        log.info("22接收主题消息》:"+message);
    }
}

三 测试

启动activemq服务

  • window端直接启动 bin\win64\activemq.bat 批处理文件

  • 访问 http://localhost:8161 输入 admin / admin 的默认用户名密码登录(根据自己是否修改过)

  • 启动tcm-chatgpt服务

  • 启动e-car服务

  • 运行 ActivemqTest.java 测试类中的 queue发送消息或者Topic发送消息

    队列在这里插入图片描述

发布订阅模式

在这里插入图片描述

四:发送对象消息

配置队列名称

/**
 * 专门配置mq通道的配置类
 */
@Slf4j
@Configuration
public class MQConfig {

    /**
     *
     * @author kazaf
     * @date 2024/4/25 10:51
     */
    @Bean(name = "textMessageQueue")
    Queue textMessageQueue() {
        return new ActiveMQQueue("textMessage-queue");
    }

    @Bean(name = "objMessageQueue")
    Queue objMessageQueue() {
        return new ActiveMQQueue("objMessage-queue");
    }
}

开启监听

@Slf4j
@Component
public class MQListener {
    /**
     * 主题名称从配置文件中动态获取
     */
    @JmsListener(destination = "textMessage-queue")
    public void queueTextMessageReceive(String message) throws JMSException {

        log.info("queueTextMessageReceive监听到消息---》:" + message);
    }

    @JmsListener(destination = "objMessage-queue")
    public void queueMapMessageReceive(Map<String,Object> map)  {
        log.info("queueObjMessageReceive-Map-监听到消息---》:"
                + map.get("name")+"--money="+map.get("money"));
    }

    /**
     * 主题名称从配置文件中动态获取
     */
    @JmsListener(destination = "objMessage-queue")
    public void queueObjMessageReceive(Message message) throws JMSException {
        if (message instanceof TextMessage) {
            log.info("queueObjMessageReceive-Text-监听到消息---》:" + ((TextMessage) message).getText());
        } else if (message instanceof MapMessage) {
            MapMessage mapMessage = (MapMessage) message;
            log.info("queueObjMessageReceive-Map-监听到消息---》:"
                    + mapMessage.getString("name")+"--money="+mapMessage.getString("money"));
        } else if (message instanceof ObjectMessage) {
            ObjectMessage objectMessage = (ObjectMessage) message;
            User user = (User) objectMessage.getObject();
            log.info("queueObjMessageReceive-obj-监听到消息---》:" + user);
        }
        log.info("queueObjMessageReceive-监听到消息--");
    }

测试类

@Slf4j
@SpringBootTest(classes = EcarAppClientApplication.class)
@RunWith(SpringRunner.class)
public class ActivemqTest {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private Queue textMessageQueue;
    @Autowired
    private Queue objMessageQueue;
    

    @Test
    public void senderTextMessage() {
        jmsTemplate.send(textMessageQueue, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage();
                message.setText("发送TextMessage消息");
                return message;
            }
        });
    }

    @Test
    public void senderObjMessage() {
        /*
        User user = new User();
        user.setUsername("李哥哥");
        user.setPassword("mima123");
        jmsMessagingTemplate.convertAndSend(objMessageQueue, user);
        */
        Map<String, Object> map = new HashMap<>();
        map.put("name", "掐果果");
        map.put("money", 1231111111.55);
        jmsMessagingTemplate.convertAndSend(objMessageQueue, map);

    }
}

接收ObjectMessage的消息

在这里插入图片描述

Map接收的消息

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/579657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker② —— Cgroups详解

1. 概述 Cgroups 的全称是control groups&#xff0c;cgroups为每种可以控制的资源定义了一个子系统。Cgroups分为三个部分&#xff1a; cgroup 本身&#xff1a;对进程进行分组hierarchy&#xff1a;将 cgroup 形成树形结构subsystem&#xff1a;真正起到限制作用的部组件 cp…

【vscode】2024最新!vscode云端配置同步方案:code settings sync

小tian最近对电脑进行了系统重装&#xff0c;结果vscode相关配置和插件都没有保存记录&#xff0c;还好公司电脑里还有。痛定思痛&#xff0c;决定写一篇vscode云端同步配置方案&#xff0c;以作记录和分享~ 步骤一&#xff1a;安装vscode插件&#xff1a;code settings sync …

云贝餐饮连锁V2-2.9.9源码

云贝餐饮连锁V2独立版、版本更新至2.9.9&#xff0c;小程序、公众号版本&#xff0c;全插件&#xff0c;公众号小程序端&#xff0c;独立版&#xff1b; 带商家端&#xff0c;修复收银台、排队点餐、堂食点餐&#xff1b;最新版更新 搭建环境教程: 系统环境&#xff1a;CentO…

【04】JAVASE-循环语句【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

算法学习笔记Day9——动态规划基础篇

一、介绍 本文解决几个问题&#xff1a;动态规划是什么&#xff1f;解决动态规划问题有什么技巧&#xff1f;如何学习动态规划&#xff1f; 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法&#xff0c;只不过在计算机问题上应用比较多&#xff…

微信小程序小游戏开发,微信开发者工具提示该目录下的项目(wxapp2)已在工具中创建,怎么办

微信小程序小游戏开发&#xff0c;微信开发者工具提示该目录下的项目&#xff08;wxapp2&#xff09;已在工具中创建&#xff0c;怎么办 情况描述&#xff0c; 导入一个项目的时候&#xff0c;导入成了小游戏项目了 想换成小游戏项目&#xff0c;变不了了&#xff0c;提示 “…

未来已来:解锁AGI的无限潜能与挑战

未来已来&#xff1a;解锁AGI的无限潜能与挑战 引言 假设你有一天醒来&#xff0c;发现你的智能手机不仅提醒你今天的日程&#xff0c;还把你昨晚做的那个奇怪的梦解释了一番&#xff0c;并建议你可能需要减少咖啡摄入量——这不是科幻电影的情节&#xff0c;而是人工通用智能…

解决Milvus官网提供的单机版docker容器无法启动,以及其它容器进程与Milvus容器通信实现方案【Milvus】【pymilvus】【Docker】

文章目录 问题预备知识方案获取pymilvus获取milvus 实例多容器通信 问题 我的需求是做混合检索单机版可以满足&#xff0c;要走Docker容器部署&#xff0c;还需要和另一个容器中的程序做通信。官方文档提供的Milvus安装启动Milvus方案&#xff0c;见文档&#xff1a;传送门 我…

wlan二层直连组网实验(ensp)

目录 1. VLAN 端口类型及参数设计2. IP 地址规划3. WLAN数据规划(1) DHCP服务器配置(2) AC 源接口地址、认证方式配置(3) AP 组的创建(4) 创建域管理模板、国家码认证(5) 创建安全模板(6) 创建SSID模板(7) 创建VAP模板(8) AP组绑定模板(9) 查看&#xff1a; 1. VLAN 端口类型及…

以太网LAN双向透明传输CH9120透传芯片实现以太网转232串口转485转TTL串口

网络串口透传芯片 CH9120 1、概述 CH9120 是一款网络串口透传芯片。CH9120 内部集成 TCP/IP 协议栈&#xff0c;可实现网络数据包和串口数据的双向透明传输&#xff0c;具有 TCP CLIENT、TCP SERVER、UDP CLIENT 、UDP SERVER 4 种工作模式&#xff0c;串口波特率最高可支持到…

03 Docker入门Dockerfile详解及镜像创建

1.1 使用 Dockerfile 构建镜像 新建一个 Dockerfile 文件vi Dockerfile 将下面的内容复制粘贴进去:## Base Images ## 从天池基础镜像构建(from的base img 根据自己的需要更换,建议使用天池open list镜像链接:https://tianchi.aliyun.com/forum/postDetail?postId=67720) F…

【Unity动画系统】动画状态基本属性与相关API、IK简单概述

动画状态基本属性与相关API Tag&#xff1a;判断是否当前播放着相对应Tag的动画&#xff0c;如果是&#xff0c;那么玩家的输入就是无效的。 using UnityEngine.InputSystem;public AnimatorStateInfo stateInfo;void State(){//stateInfo animator.GetCurrentAnimatorStateIn…

AcrelEMS-MH民航机场智慧能源管平台解决方案【可靠供电/降低能耗/高效运维】

民航机场行业背景 自2012年以来&#xff0c;我国民航运输规模出现了显著增长&#xff0c;旅客运输量&#xff1a;从2012年的3.19亿人次上升至2019年的6.6亿人次&#xff08;注&#xff1a;为剔除疫情影响&#xff0c;此处采取疫情前2019年的数据&#xff0c;下同&#xff09;&…

数据结构七:线性表之链式栈的设计

在上篇博客&#xff0c;学习了用数组实现链的顺序存储结构&#xff0c;那是否存在用单链表实现栈的链式存储结构&#xff0c;答案是当然的&#xff0c;相比于顺序栈&#xff0c;用数组实现的栈效率很高&#xff0c;但若同时使用多个栈&#xff0c;顺序栈将浪费很多空间。用单链…

用NuGet安装 Oracle ODP.NET

oracle官网原文&#xff1a;Using NuGet to Install and Configure Oracle Data Provider for .NET Using NuGet to Install and Configure Oracle Data Provider for .NET In this section, you will install ODP.NET NuGet packages from nuget.org. Select View > Solut…

PDF 正确指定页码挂载书签后,书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另做一篇原因是一篇文章附带一个与该文章主题不相关的问题时&#xff0c;不利于被遇到该问题的人快速搜索发现以解决其遇到的…

8_手眼标定总结_auboi5机械臂与海康平面相机

经过不断地学习与调试&#xff0c;不断地学习网络上其他同志分享的资料&#xff0c;opencv手眼标定迎来了阶段性结束。实际测试结果在机械臂坐标系中X方向差5mm左右。 代码参考《https://blog.csdn.net/wanggao_1990/article/details/81435660》 注意事项&#xff1a; ①标定…

AG32 MCU在触摸屏的应用(AGM FPGA/MCU行业应用)

传统的屏驱MCU常见应用于洗衣机、空调、空调面板、仪器仪表等人机交互界面显示场景中&#xff0c;通常是以段码的形式显示设备运转的时间、温度、测量结果等简单运行数据&#xff0c;随着人机交互需求丰富化&#xff0c;智能家居设备、摩托车、电动车等产品也逐步增加了屏幕显示…

如何在 Ubuntu 12.04 上使用 Apache 配置 WebDAV 访问

简介 WebDAV 是内置在 HTTP 中的分布式网络编辑实现&#xff0c;允许您轻松共享文件并与他人协作。 我们可以在 Web 服务器中安装此扩展&#xff0c;以允许通过 Web 浏览器远程读写访问本地文件。在本指南中&#xff0c;我们将在带有 Apache Web 服务器的 Ubuntu 12.04 VPS 上…

【小沐学Java】VSCode搭建Java开发环境

文章目录 1、简介2、安装VSCode2.1 简介2.2 安装 3、安装Java SDK3.1 简介3.2 安装3.3 配置 4、安装插件Java Extension Pack4.1 简介4.2 安装4.3 配置 结语 1、简介 2、安装VSCode 2.1 简介 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器&#xff0c;可在桌面上…