从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)
(三)消息结构与 API 操作
- JMS 消息结构:JMS 消息主要由消息头(Header)、属性(Properties)和消息体(Body)三部分组成。消息头包含了许多预定义的字段,用于标识消息、设置优先权、失效时间等,例如 JMSMessageID 用于唯一标识一条消息,JMSDeliveryMode 用于指定消息的投递模式(持久或非持久),JMSPriority 用于设置消息的优先级,JMSTimestamp 用于记录消息发送的时间,JMSExpiration 用于设置消息的过期时间等 。这些字段由 JMS Provider 在消息发送时自动填充或根据发送者的设置进行配置 。属性部分允许开发者自定义一些键值对,用于添加额外的信息,比如消息的业务类型、处理标志等,这些属性可以在消息的发送和接收过程中被使用,方便对消息进行分类和处理 。消息体则是消息的实际内容,根据不同的消息类型,消息体的结构和内容也不同,JMS 提供了多种消息类型,如 TextMessage 用于发送文本消息,MapMessage 用于发送键值对形式的消息,BytesMessage 用于发送字节数组消息,StreamMessage 用于发送 Java 原始类型的数据流消息,ObjectMessage 用于发送可序列化的 Java 对象消息 。
- API 操作示例:通过代码示例展示创建、发送、接收不同类型消息的操作。
创建并发送 TextMessage
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TextMessageProducer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("textQueue");
MessageProducer producer = session.createProducer(queue);
TextMessage message = session.createTextMessage("This is a text message");
// 设置自定义属性
message.setStringProperty("messageType", "text");
producer.send(message);
System.out.println("Sent text message: " + message.getText());
producer.close();
session.close();
connection.close();
}
}
接收 TextMessage
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TextMessageConsumer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("textQueue");
MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receive();
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Received text message: " + textMessage.getText());
// 获取自定义属性
System.out.println("Message type: " + textMessage.getStringProperty("messageType"));
}
consumer.close();
session.close();
connection.close();
}
}
创建并发送 MapMessage
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.MapMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MapMessageProducer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("mapQueue");
MessageProducer producer = session.createProducer(queue);
MapMessage message = session.createMapMessage();
message.setString("key1", "value1");
message.setInt("key2", 123);
// 设置自定义属性
message.setStringProperty("messageType", "map");
producer.send(message);
System.out.println("Sent map message");
producer.close();
session.close();
connection.close();
}
}
接收 MapMessage
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.MapMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MapMessageConsumer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("mapQueue");
MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receive();
if (message instanceof MapMessage) {
MapMessage mapMessage = (MapMessage) message;
System.out.println("Received map message");
System.out.println("Value of key1: " + mapMessage.getString("key1"));
System.out.println("Value of key2: " + mapMessage.getInt("key2"));
// 获取自定义属性
System.out.println("Message type: " + mapMessage.getStringProperty("messageType"));
}
consumer.close();
session.close();
connection.close();
}
}
消息结构在 API 操作中的作用至关重要。消息头中的字段为消息的传输和处理提供了基本的控制信息,例如通过设置 JMSPriority 可以让重要的消息优先被处理,设置 JMSExpiration 可以避免消息长时间占用资源。属性部分则增强了消息的灵活性和可扩展性,开发者可以根据业务需求添加各种自定义信息,方便在消息处理过程中进行判断和操作。消息体则承载了实际的业务数据,不同的消息类型适用于不同的业务场景,例如 TextMessage 适合传输文本内容,MapMessage 适合传输结构化的键值对数据 。
相关文章:
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)
(三)消息结构与 API 操作 JMS 消息结构:JMS 消息主要由消息头(Header)、属性(Properties)和消息体(Body)三部分组成。消息头包含了许多预定义的字段,用于标识…...
CSS display: none
在 CSS 中,display: none; 是一个用于控制元素显示与隐藏的属性值,其核心作用是完全从文档流中移除元素,使元素在页面中不占据任何空间,也不会被渲染。以下是详细解释: 核心作用 隐藏元素:使元素在页面中…...
vison transformer vit 论文阅读
An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词:用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...
dropout层
从你提供的图片来看,里面讨论了 Dropout 层,让我为你解释一下它的工作原理和作用。 Dropout 层是什么? Dropout 是一种常用的正则化技术,用于避免神经网络的 过拟合(overfitting)。过拟合是指模型在训练数…...
openssl中BIO的使用
BIO是OpenSSL的一个重要的结构和概念,是对数据IO与传递处理的一种类型抽象和功能封装,这里所说的数据IO与传递的“介质”包括:内存、文件、日志、标准设备、网络socket等,“处理”包括简单、加/解密、摘要、ssl协议下的读/写等的数…...
电动汽车充电设施可调能力聚合评估与预测
电动汽车充电设施可调能力聚合评估与预测 项目概述 本项目基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远,胡泽春),实现了电动汽车充电设施可调能力的聚合评估与预测方法。 主要文件 real_data_model.m: 使用真实数据实现LSTM线…...
Git clone时出现SSL certificate problem unable to get local issuer certificate
正确解决方法 git config --global http.sslVerify false错误解决方法:(主要是看错了嘿嘿,但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…...
requests库
模拟请求获取网页源代码 如下 import requestsr requests.get(https://spa1.scrape.center/page/1) print(r.text) 源码如下 GET请求 示例网站为 https://httpbin.org import requests r requests.get(https://httpbin.org/) print(r.text) 所显示的结果如下 {"a…...
基于springboot的海洋环保知识分享系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
安科瑞ADL3000-E-A/KC三相交流电能表CE认证导轨表
1 概述 ADL3000-E-A 是一款为供电系统、工矿企业以及公用事业单位设计的智能电表,用于计算耗电量并管理用电需求。它具备高精度、体积小以及安装简便的特点。它将所有电气参数的测量与综合电能计量及管理功能集成在一起,可提供过去 12 个月的各类数据&a…...
红黑树算法笔记
文章目录 红黑树 (Red-Black Tree) 学习笔记0. 节点结构与哨兵节点1. 什么是红黑树?2. 红黑树的五个核心性质3. 为什么需要红黑树?4. 红黑树的基本操作a. 查找 (Search)b. 插入 (Insert)c. 删除 (Delete) 5. 维护平衡的关键操作a. 变色 (Recoloring)b. 旋…...
【Axios】解决Axios下载二进制文件返回空对象的问题
【Axios】解决Axios下载二进制文件返回空对象的问题 问题背景 在一个基于Vue 3的项目中,我们使用Axios下载Excel文件,但遇到了一个奇怪的问题:文件能成功下载下来,但打开时显示内容为[object Object]无法使用。 当我们执行下载代码: const response = await downloadT…...
2.MySQL数据库操作
一.MySQL数据库介绍 数据库目前标准指令集是SQL,即结构化查询语言。SQL语言主要由以下几部分组成 DDL(数据定义语言):用来建立数据库、数据库对象和定义字段,如create、alter、drop。 DML(数据操纵语言&…...
01.three官方示例+编辑器+AI快速学习webgl_animation_keyframes
实例:examples/webgl_animation_keyframes.html 在这里插入图片描述 重点关注: AnimationMixer:管理模型的所有动画AnimationClip:表示一个完整的动画ClipAction:控制动画的播放状态(播放、暂停、速度等&am…...
在 Spring Boot 中实现动态线程池的全面指南
动态线程池是一种线程池管理方案,允许在运行时根据业务需求动态调整线程池参数(如核心线程数、最大线程数、队列容量等),以优化资源利用率和系统性能。在 Spring Boot 中,动态线程池可以通过 Java 的 ThreadPoolExecut…...
餐饮行业新风口:上门厨师服务系统的技术实现路径
上门做饭正在成为下一个万亿级风口!当外卖平台被预制菜攻陷,当年轻人对着料理包无可奈何,一个全新的餐饮模式正在悄然崛起。 我们的市场调研显示,83%的消费者无法分辨外卖是否使用预制菜,76%的年轻人愿意为透明烹饪过程…...
odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件
文章目录 问题描述解决思路正确的去除 git 跟踪 pyc文件的做法 问题描述 查看本地 stash 列表 stash 后有很多 pyc 文件都被 git 追踪了,这样不合理,而且等 unstash 的时候就会有问题 解决思路 尝试方法: 递归地删除指定文件夹及其子目录中…...
线程同步机制
synchronized 实现线程同步的关键字,用来防止多个线程同时访问某个代码块或方法,避免并发冲突和数据不一致。通过持有一把唯一的对象锁,谁拿到了谁就能执行,谁没拿到只能等待锁释放。 1. 修饰实例方法(锁当前实例&…...
YOLO目标检测算法
文章目录 前言一、目标检测算法简介1、传统目标检测算法(1)R-CNN算法简介(2)Fast R-CNN算法简介(3)Faster R-CNN算法简介 2、目标检测中的算法设计范式(1)one-stage(2&am…...
【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
比赛传送门: 本场比赛开始时题面存在一些问题,私密马赛! A.池化【入门教育赛】 根据题目所给公式计算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…...
《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
对于Flutter开发者而言,借助Agora SDK实现这一功能,不仅能为用户带来前所未有的社交体验,更是在激烈的市场竞争中脱颖而出的关键。 Agora SDK作为实时通信领域的佼佼者,拥有一系列令人瞩目的特性,使其成为实现高质量连…...
1.3.2 linux音频PulseAudio详细介绍
PulseAudio 是一个在 Linux 及其他类 Unix 操作系统中广泛使用的声音服务器(Sound Server),它为不同的音频应用程序提供了一种中间层,以方便管理和控制音频流。下面将详细介绍 PulseAudio 的相关内容,包括其基本概念、…...
8.1.Kubernetes进阶
目录 一、Kubernetes核心原理深度解析 架构设计精髓 • 控制平面组件(API Server、etcd、Controller Manager、Scheduler)协作流程 • 数据平面(kubelet、容器运行时、CNI/CSI插件)核心工作机制 API对象与声明式模型 • CRD&…...
electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
我说一下 react 结合 electron 如果打包和使用,以及其中可能会遇到的问题,这里只做简单功能的演示 我们先通过 cra 创建一个 react 项目,然后安装相关依赖,之后启动 npx create-react-app react_electron cd react_electron np…...
C++23 views::chunk_by (P2443R1) 详解
文章目录 引言C23 范围库概述范围视图(Range Views)范围算法(Range Algorithms)范围适配器(Range Adapters) std::views::chunk_by 介绍基本概念特性使用场景 示例代码简单示例自定义谓词示例 总结 引言 在…...
MySQL核心内容【持续更新中】
MySQL核心内容 文章目录 MySQL核心内容1.MySQL核心内容目录2.MySQL知识面扩展3.MySQL安装4.MySQL配置目录介绍Mysql配置远程ip连接 5.MySQL基础1.MySQL数据类型1.数值类型2.字符串类型3.日期和时间类型4.enum和set 2.MySQL运算符1.算数运算符2.逻辑运算符3.比较运算符 3.MySQL完…...
【高级IO】多路转接之单线程Reactor
这里写目录标题 一.Epoll的两种工作模式二.单线程Reactor1.Connection模块2.Reactor服务器模块2.1初始化Init2.2启动循环服务器Loop2.3事件派发Dispatcher2.4连接管理器Accepter2.5事件管理器Receiver2.6发送管理器Sender 3.上层业务模块定制协议业务处理 代码 一.Epoll的两种工…...
基于设备指纹识别的反爬虫技术:给设备办 “身份证”
传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。 一、基础参数采集:构建设备指纹的…...
公开模型一切,优于DeepSeek-R1,英伟达开源Llama-Nemotron家族
在大模型飞速发展的今天,推理能力作为衡量模型智能的关键指标,更是各家 AI 企业竞相追逐的焦点。 但近年来,推理效率已成为模型部署和性能的关键限制因素。 基于此,英伟达推出了 Llama-Nemotron 系列模型(基于 Meta …...
CI/CD面试题及答案
一、CI/CD 基础概念 1. 什么是 CI/CD?CI 和 CD 的区别是什么? 答案: CI(持续集成):开发人员提交代码后,自动构建并运行测试,确保代码集成无冲突。CD(持续交付 / 部署&am…...
解决 Ubuntu DNS 无法解析问题(适用于虚拟机 长期使用)
解决 Ubuntu DNS 无法解析问题 在使用 Ubuntu 虚拟机(尤其是在国内)时,经常会遇到这样的错误: Temporary failure resolving cn.archive.ubuntu.com但是此时又能成功 ping 通 IP,这说明网络是正常的,问题…...
如何通过C# 获取Excel单元格的数据类型
在处理 Excel 文件时,了解单元格的数据类型有助于我们正确地解析和处理数据。Free Spire.XLS 是一款功能强大且免费的.NET 组件,支持高效地操作 Excel 文件,包括读取单元格类型。本文将详细介绍如何使用 Free Spire.XLS 来获取 Excel 单元格的…...
Spring Boot初级教程:从零搭建企业级Java应用
一、Spring Boot是什么?为什么学它? 定义:Spring Boot是Spring框架的轻量级快速开发工具,基于“约定优于配置”原则,简化Spring应用的搭建与部署。核心优势: 零配置起步:内置Tomcat/Jetty,无需手动部署Web服务器。自动装配:自动扫描依赖、注入Bean,减少XML/注解冗余代…...
IBM BAW(原BPM升级版)使用教程第六讲
一、事件:Undercover Agent 在 IBM Business Automation Workflow (BAW) 中,Undercover Agent (UCA) 是一个非常独特和强大的概念,旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程自动化,它…...
[250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整
目录 X-CMD 发布 v0.5.11 beta📃Changelog🧩 ping🧩 openai🧩 gemini🧩 asdf🧩 mac✅ 升级指南 X-CMD 发布 v0.5.11 beta 📃Changelog 🧩 ping 调整 x ping 默认参数为 bing.com&a…...
Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)
Web前端—VSCode如何解决打开html页面中文乱码的问题(方法2) 1.打开VScode后,依次点击 文件 >> 首选项 >> 设置 2.打开设置后,依次点击 文本编辑器 >> 文件(或在搜索框直接搜索“files.autoGuessEnc…...
打造专属AI好友:小智AI聊天机器人详解
打造专属AI好友:小智AI聊天机器人详解 在当下的科技热潮中,AI正迅速改变着我们的生活,成为了科技领域的新宠。而今,借助开源项目的力量,你可以亲手打造一个智能小助手——小智AI聊天机器人。它不仅是一个技术探索的窗…...
Spring,SpringMVC,SpringBoot,SpringCloud的区别
Spring Spring 是一个基础框架,为 Java 应用提供了 IoC(控制反转)和 AOP(面向切面编程)功能。其主要特点如下: IoC 容器:借助依赖注入,降低了组件间的耦合度。AOP 支持:…...
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
对于选择python作为测试脚本开发的同学来说,pytest和python unittest是必需了解的两个框架。那么他们有什么区别?我们该怎么选?让我们一起来了解一下吧! 我们从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架…...
无人机电池储存与操作指南
一、正确储存方式 1. 储存电量 保持电池在 40%-60% 电量(单片电压约3.8V-3.85V)存放,避免满电或空电长期储存。 满电存放会加速电解液分解,导致鼓包;**空电**存放可能引发过放(电压低于3.0V/片会永久…...
CSS实现图片垂直居中方法
html <div class"footer border-top-row"><div class"footer-row"><span class"footer-row-col01">制单人:{{ printData[pageIndex - 1].rkMaster.makerName}}<img :src"getPersonSignImgSrc(printData[pa…...
多账号管理与自动化中的浏览器指纹对抗方案
多账号管理与自动化中的浏览器指纹对抗方案 在日常的开发工作中,如果你曾涉及自动化脚本、多账号运营、数据抓取,或是在安全研究方向摸爬滚打过,应该对“浏览器指纹识别”这几个字不会陌生。 指纹识别:不是你以为的那种“指纹”…...
[6-1] TIM定时中断 江协科技学习笔记(45个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 TRGO是“Trigger Output”的缩写,中文意思是“触发输出”。在STM32微控制器中,TRGO是一个非常重要的功能,它允许定时器(Timer)在特定事件发生时输出一个触发信号。这个触发信号可以用…...
Flutter 3.29.3 花屏问题记录
文章目录 Flutter 3.29.3 花屏问题记录问题记录解决尝试解决 Flutter 3.29.3 花屏问题记录 问题记录 flutter版本3.29.3,代码大致为: ShaderMask(shaderCallback: (Rect bounds) {return LinearGradient(begin: Alignment.topCenter,end: Alignment.bo…...
[Windows] 希捷(Seagate)硬盘官方检测工具 - SeaTools(1.4.0.7)
[Windows] 希捷(Seagate)硬盘官方检测工具 - SeaTools 链接:https://pan.xunlei.com/s/VOPpN9A3Tn_rVktEMu6Lg9q9A1?pwdh8rz# 希望能修复好硬盘...
YOLOv8目标检测性能优化:损失函数改进的深度剖析
文章目录 YOLOv8 简介损失函数在 YOLOv8 中的关键作用SlideLoss 的原理与应用原理代码实例 FocalLoss 分类损失函数的优化原理代码实例 SlideLoss 与 FocalLoss 在 YOLOv8 中的协同作用实验结果与分析 YOLOv8 简介 YOLO(You Only Look Once)系列目标检测…...
docker 日志暴露方案 (带权限 还 免费 版本)
接到了一个需求,需求的内容是需要将测试环境的容器暴露给我们的 外包同事,但是又不能将所有的容器都暴露给他们。 一开始,我分别找了 Portainer log-pilot dpanel 它们都拥有非常良好的界面和容器情况可视化。 但,缺点是&am…...
水印云:AI赋能,让图像处理变得简单高效
水印云是一款基于超强AI技术的图像处理工具,提供丰富的图像编辑功能,将复杂的图像处理极简化,真正实现简单高效的图像处理。无论是去除水印、智能抠图、添加水印,还是提升画质,水印云都能轻松应对,满足不同…...
使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践
一、效果概览 本文基于 Vue 3 和 ECharts GL,实现了一个具有以下特性的 3D 饼图: 立体视觉效果:通过参数方程构建 3D 扇形与底座动态交互:支持点击选中(位移效果)和悬停高亮(放大效果ÿ…...
allure生成测试报告(搭配Pytest、allure-pytest)
文章目录 前言allure简介allure安装软件下载安装配置环境变量安装成功验证 allure运行流程allure装饰器函数基本说明装饰器函数使用allure.attach 命令行运行利用allure-pytest生成中间结果json 查看测试报告总览页面每个tab页的说明类别页面测试套图表页面时间刻度功能页面包 …...