Spring+ActiveMQ
1. 环境搭建
1.1 env-version
| JDK | 1.8 |
| Spring | 2.7.13 |
| Maven | 3.6 |
| ActiveMQ | 5.15.2 |
1.2 docker-compose.yml
version: '3.8'services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment:- ACTIVEMQ_ADMIN_LOGIN=admin- ACTIVEMQ_ADMIN_PASSWORD=admin- ACTIVEMQ_CONFIG_MINMEMORY=512- ACTIVEMQ_CONFIG_MAXMEMORY=2048
# volumes:
# - ./data/activemq:/var/activemq/data
# - ./conf/activemq.xml:/var/activemq/conf/activemq.xmlnetworks:- activemq-network networks:activemq-network:driver: bridge
在这个docker-compose.yml文件中:
-
activemq服务使用了rmohr/activemqDocker镜像,这是一个社区维护的ActiveMQ镜像。请确保选择一个与你的Spring Boot版本兼容的ActiveMQ版本。 -
container_name设置了容器的名称。 -
ports映射了ActiveMQ的JMS端口(61616)和管理控制台端口(8161)到宿主机的相同端口。 -
environment部分设置了管理员账号和密码,以及JVM的最小和最大内存配置。这些可以根据需要进行调整。 -
volumes部分映射了宿主机的目录到容器内部,用于持久化ActiveMQ的数据和配置文件。你需要创建相应的目录并放置你的activemq.xml配置文件。 -
networks定义了一个自定义网络,以便ActiveMQ服务可以连接到其他可能需要的Docker服务。
在使用这个docker-compose.yml文件之前,请确保你已经创建了data和conf目录,并且在conf目录中放置了自定义的activemq.xml配置文件。如果不需要持久化存储,可以移除volumes部分。
1.3 添加依赖
<!-- ActiveMQ 依赖 -->
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-spring -->
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring</artifactId><version>5.15.4</version><!-- 排除依赖 --><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion>
</exclusions>
</dependency><!-- Spring Boot 与 JMS 集成的 starter -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-activemq -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId><version>2.7.12</version>
</dependency>
2. 工程结构
activemq/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/
│ │ │ │ ├── xiaokai/
│ │ │ │ │ ├── ActiveMQApplication.java // 应用程序的主类,通常包含main方法
│ │ │ │ │ ├── config/ // 配置包
│ │ │ │ │ │ └── JmsConfig.java // ActiveMQ的配置类
│ │ │ │ │ ├── event/ // 事件包
│ │ │ │ │ │ ├── Eventinfo.java // 事件信息类:构建消息、send topic
│ │ │ │ │ ├── listener/ // 监听器包
│ │ │ │ │ │ └── MessageListener.java // 消息监听器类
│ │ │ │ │ ├── service/ // 服务包
│ │ │ │ │ │ └── ActiveMQService.java // ActiveMQ服务类
│ │ │ │ │
│ │ │ ├── resources/ // 资源文件
│ │ │ │ └── application.yml // Spring配置文件
│ │ │
│ │ ├── test/ // 测试代码
│ │ │ ├── java/ // 测试Java代码
│ │ │ │ ├── com/
│ │ │ │ │ ├── xiaokai/
│ │ │ │ │ └── ActiveMQTest.java // ActiveMQ的测试类
└── pom.xml // Maven构建配置文件(未在文件内容中列出)
ActiveMQApplication.java:项目的主类,通常包含启动Spring应用程序的main方法。
JmsConfig.java:配置ActiveMQ的Java配置类。
Eventinfo.java:可能用于表示事件信息的类。
MessageListener.java:消息监听器,用于监听并处理ActiveMQ消息。
ActiveMQService.java:服务类,可能包含与ActiveMQ交互的业务逻辑。
application.yml:Spring Boot的配置文件,用于配置应用程序的各种参数。
ActiveMQTest.java:用于测试ActiveMQ功能的测试类。
3. 示例代码
JmsConfig.java
package com.xiaokai.config;import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;import javax.jms.ConnectionFactory;/*** Author:yang* Date:2024-10-19 15:57*/
@Configuration
@EnableJms
public class JmsConfig {@Beanpublic ActiveMQConnectionFactory connectionFactory() {ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();connectionFactory.setBrokerURL("tcp://116.198.242.56:61616");connectionFactory.setUserName("admin");connectionFactory.setPassword("admin");return connectionFactory;}@Beanpublic DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setSessionTransacted(true);return factory;}}
MessageListener.java
package com.xiaokai.listener;import lombok.extern.slf4j.Slf4j;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;/*** Author:yang* Date:2024-10-19 15:55*/
@Component
@Slf4j
public class MessageListener {// 监听队列test.queue@JmsListener(destination = "test.queue")public void onMessage(String message) {log.info("Received message: " + message);}}
ActiveMQService .java
package com.xiaokai.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;/*** Author:yang* Date:2024-10-19 16:01*/
@Service
@Slf4j
public class ActiveMQService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;public void send(String message) {log.info("Sending message: {}", message);jmsMessagingTemplate.convertAndSend("test.queue", message);}
}
注:JmsMessagingTemplate作为Spring相关bean,封装了JmsTemplate 。总的来说JmsTemplate更底层,但是在使用过程中不需要过多关注底层实现。
@Autowired private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired private JmsTemplate jmsTemplate;
application.yml
spring:activemq:broker-url: tcp://116.198.242.56:61616user: adminpassword: admin
注:在JmsConfig.java配置文件中配置后,可以不需要配置文件,二者选其一。
测试:
package com.xiaokai;import com.xiaokai.service.ActiveMQService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** Author:yang* Date:2024-10-21 10:28*/
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class ActiveMQTest {@Autowiredprivate ActiveMQService activeMQService;@Testpublic void testSend(){activeMQService.send("test");}
}
结果:
Sending message: testStarted ActiveMQApplication in 1.368 seconds (JVM running for 1.799)Received message: test
注:在ActiveMQ提供的可视化控制台可以查看相关信息。
访问:http://116.198.242.56:8161/admin/index.jsp


4. 消息模型
4.1 P2P模型
bean
@Bean
public Destination queue() {return new ActiveMQQueue("test.queue");
}
消息监听器
@Component
@Slf4j
public class MessageListener {// 监听队列test.queue@JmsListener(destination = "test.queue")public void onMessage1(String message) {log.info("Received queue message1: " + message);}// 监听队列test.queue@JmsListener(destination = "test.queue")public void onMessage2(String message) {log.info("Received queue message2: " + message);}}
消息服务
@Service
@Slf4j
public class ActiveMQService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Destination queue;// 发送点对点消息public void sendP2P(String message) {log.info("Sending queue message: {}", message);jmsMessagingTemplate.convertAndSend(queue, message);}}
application.yml
spring:activemq:broker-url: tcp://116.198.242.56:61616user: adminpassword: admin# true表示使用发布/订阅模式,false表示使用点对点模式jms:pub-sub-domain: false
结论:点对点消息模式是将消息推送到queue中,消费者通过轮训的方式消费消息
4.2 发布/订阅模型
Bean
@Bean
public Destination topic() {return new ActiveMQTopic("test.topic");
}
消息监听器
@Component
@Slf4j
public class PubMessageListener {// 监听主题test.topic@JmsListener(destination = "test.topic")public void onMessage3(String message) {log.info("Received topic message1: " + message);}// 监听主题test.topic@JmsListener(destination = "test.topic")public void onMessage4(String message) {log.info("Received topic message2: " + message);}}
消息服务
@Service
@Slf4j
public class ActiveMQService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Destination topic;// 发送发布订阅消息public void sendPubSub(String message) {log.info("Sending topic message: {}", message);jmsMessagingTemplate.convertAndSend(topic, message);}}
application.yml
spring:activemq:broker-url: tcp://116.198.242.56:61616user: adminpassword: admin# true表示使用发布/订阅模式,false表示使用点对点模式jms:pub-sub-domain: true
注:需要将发布/订阅开关打开
结论:发送消息后,订阅主题的消费者都能收到同一条消息去消费。
5. 消息类型
5.1 普通消息
普通消息如上述案例,生产者生产消息后,由消费者消费消息,中间不需要做额外的事情。
5.2 延迟消息
延迟消息指在生产者生产带有延迟时间的消息后,broker接收到消息后,并不立即投送到队列或者主题,而是到达延迟时间后,再将消息投送到队列、主题。
配置ActiveMQ支持延迟消息: 修改ActiveMQ的配置文件activemq.xml,确保<broker>标签包含schedulerSupport="true"属性。这允许ActiveMQ的计划任务功能,从而支持延迟消息。
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
修改配置后,需要重启ActiveMQ服务器以使更改生效。
发送延迟消息
// 发送延迟消息
public void sendDelay(String message) {HashMap<String, Object> properties = new HashMap<>();properties.put(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);log.info("Sending delay queue message: {}", message);jmsMessagingTemplate.convertAndSend(queue, message, properties);
}
消息监听器
...
5.3 事务消息
没啥用,用ActiveMQ实现事务消息还不如不用,辣鸡(狗头保命)
相关文章:
Spring+ActiveMQ
1. 环境搭建 1.1 env-version JDK 1.8 Spring 2.7.13 Maven 3.6 ActiveMQ 5.15.2 1.2 docker-compose.yml version: 3.8services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment…...
Linux 常用命令总汇
查询所有wifi nmcli dev wifi list 链接wifi sudo nmcli dev wifi connect XXXX password XXXX 查询本机IP ifconfig 查询联网情况 ping www.baidu.com 进入.bash gedit ~/.bashrc sudo dpkg -i XXX.deb 安装超级终端 sudo apt install terminator 超级终端常用…...
fmql之Linux RTC
模拟i2c,连接rtc芯片。 dts: /{ // 根节点i2c_gpio: i2c-gpio {#address-cells <1>;#size-cells <0>;compatible "i2c-gpio";// MIO56-SDA, MIO55-SCL // 引脚编号gpios <&portc 2 0&portc 1 0 >;i2c-gp…...
Flask-SocketIO 简单示例
用于服务端和客户端通信,服务端主动给客户端发送消息 前提: 确保安装了socket库: pip install flask-socketio python-socketio服务端代码 from flask import Flask from flask_socketio import SocketIO import threading import timeap…...
Vue 3 的组件式开发(2)
1 Vue 3 组件的插槽 插槽(Slot)是Vue组件中的一个重要概念,它允许父组件向子组件中插入HTML结构或其他组件,从而实现内容的自定义和复用。以下是对Vue 3组件插槽的详细讲解: 1.1 插槽的基本概念 插槽可以被视为子组…...
python 爬虫 入门 四、线程,进程,协程
目录 一、进程 特征: 使用: 初始代码 进程改装代码 二、线程 特征: 使用: 三、协程 后续:五、抓取图片、视频 线程和进程大部分人估计都知道,但协程就不一定了。 一、进程 进程是操作系统分配资…...
cloak斗篷伪装下的独立站
随着互联网的不断进步,越来越多的跨境电商卖家开始认识到独立站的重要性,并纷纷建立自己的独立站点。对于那些有志于进入这一领域的卖家来说,独立站是什么呢?独立站是指个人或小型团队自行搭建和运营的网站。 独立站能够帮助跨境…...
【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机 1、Mac OS X 端2、PVE 端(Debian Linux) 1、Mac OS X 端 (1)安装 wakeonlan 工具 brew install wakeonlan(2)唤醒 PVE 命令 …...
u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢?下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…...
Linux系统之dc计算器工具的基本使用
Linux系统之dc计算器工具的基本使用 一、DC工具介绍二、dc命令的基本用法2.1 dc命令的help帮助信息2.2 dc命令基本用法2.3 dc命令常用操作符 三、dc命令的基本使用3.1dc命令的用法步骤3.2 简单数学计算3.3 通过文件来计算3.4 使用--expression计算3.5 使用dc命令进行高精度计算…...
使用Python计算相对强弱指数(RSI)进阶
使用Python计算相对强弱指数(RSI)进阶 废话不多说,直接上主题:> 代码实现 以下是实现RSI计算的完整代码: # 创建一个DataFramedata {DATE: date_list, # 日期CLOSE: close_px_list, # 收盘价格 }df pd.DataF…...
vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案
1、问题描述: 其一、需求为: 想要安装项目所需依赖,成功运行 vue 项目,想要在浏览器中能成功访问项目地址 其二、问题描述为: 在 package.json 文件打开终端平台,通过执行 npm install 命令,…...
Android 原生开发与Harmony原生开发浅析
Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…...
VIVO售后真好:屏幕绿线,4年免费换屏
只要亮屏就有。这也太影响使用了。 本来想换趁机换手机,看了VIVO发布的X200,决定等明年的X200 ULTRA。手头这个就准备修。 查了一下价格,换屏1600,优惠1100。咸鱼上X70 PRO也就800。能不能简单维修就解决呢?于是联系…...
数据类型【MySQL】
文章目录 建立表查看表删除表数据类型floatcharvarcharchar&&varchar 时间日期类型enum和setenum和set查找 建立表 mysql> create table if not exists user1(-> id int ,-> name varchar (20) comment 用户名 ,-> password char (32) comment 用户名的…...
流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(二)
继续上篇介绍,本篇介绍一下封装RTP的数据格式,如何将摄像头采集的码流,音频的码流,封装到rtp里,传输。 有自己私有协议例子,有rtp协议,参考代码。注意不是rtsp协议。 一、私有协议 玩过tcp协议…...
在 Kakarot ZkEVM 上使用 Starknet Scaffold 构建应用
Starknet 和 EVM 我们所知的智能合约世界一直围绕着以太坊虚拟机(EVM),其主要语言是 Solidity。 尽管 Starknet 通过 STARKs 为以太坊开辟了新的可能性,但其缺点是它有一个不同的虚拟机 (CairoVM),这要求开发者学习 …...
DBeave如何连接达梦数据库,设置达梦驱动,真酷
前言 我们在使用DBeaver连接数据库时,默认可以连接常用的数据库,如mysql数据库,postgresql数据库,oracle数据库。但是,我们的国产数据库达梦数据库,默认在IDEA里面没有驱动,所以还得配置一下才…...
2024年全球 MoonBit 编程创新赛-零基础早鸟教程-使用wasm4八小时开发井子棋小游戏
前言 本篇文章主要分享 “2024年全球 MoonBit 编程创新赛 游戏赛道”参赛过程中九宫棋游戏的开发技巧和心得。以此抛砖引玉。首先介绍下 MoonBit。 月兔语言 MoonBit 是一个用于云计算和边缘计算的 WebAssembly 端到端的编程语言工具链。 您可以访问 https://try.moonbitlang.…...
机器学习4
第3章 线性模型 3.1 线性模型的基本形式 3.1.1 线性模型的核心公式 线性模型通过属性的线性组合进行预测,其核心公式为: [ f(x) \omega_1 X_1 \omega_2 X_2 … \omega_d X_d b ] 其中: ω 1 , ω 2 , . . . , ω d \omega_1, \omega_…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
