消息队列笔记

news2024/12/29 10:17:00

异步技术

企业级应用中广泛使用的三种异步消息传递技术

原文链接:https://blog.csdn.net/qq_55917018/article/details/122122218

三种异步消息传递技术

JMS (java message service)

一个Java规范,等同于JDBC规范,提供了与消息服务相关的API接口
JMS只 是一套接口,并没有给予实现,各大厂商和开源组织都对JMS实现不同产品,这些产品 包括:Apache的ActiveMQ、RocketMQ(前期属于阿里巴巴)、IBM的MQSeries、Microsoft的MSMQ和 VM的RabbitMQ(前期属于Spring source)等等,它们基本都遵循JMS规范。 这里介绍的ActiveMQ是最早的JMS开源产品,在Java世界使用比较广泛,在中等规模的 应用中是完全胜任的。当然,如果要真正面面对大型互联网应,要解决超高并发和吞吐 量问题,现在更推荐使用RabbitMQ、Kafuka或者RocketMQ等新一代的分布式产品,但 它们的基本原理和用法是相通的.

JMS消息模型
  • peer-2-peer: 点对点模型,消息发送到一个队列中,队列保存消息。队列中的消息只能被一个消费者消费
  • publish-subscribe: 发布订阅模型,消息可以被多个消费者消息,消费者和生产者完全独立,不需要感知对方的存在
JMS 消息种类
  • TextMessage
  • MapMessage
  • BytesMessage
  • StreamMessage
  • ObjectMessage
  • Message
JMS实现:ActiveMQ、Redis、HornetMQ、RabbitMQ、RocketMQ

AMQP(advanced message queuing protocol)

一种协议(高级消息队列协议,也是消息代理规范),规范了网络交换的数据格式
**解决:**服务跨平台,服务器供应商、生产者,消费者可以使用不同的语言来实现

AMQP消息模型:
  • direct exchange
  • fanoout exchange
  • topic exchange
  • headers exchange
  • system exchange
消息种类:byte[]
  • AMQP实现:RabbitMQ、StormMQ、RocketMQ

MQTT(Message Queueing Telemetry Transpory)

消息队列遥测传输、专为小设备涉及、是物联网生态系统中主要成分之一

实测

ActiveMQ

下载

官网下载

安装(windows)

在这里插入图片描述

启动

在这里插入图片描述在这里插入图片描述
服务端口:61616
管理后台端口:8161
ActiveMQ后台:http://127.0.0.1:8161
默认账号、密码:admin\admin

springboot 整合

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>

点对点模式

server:
  port: 8080
spring:
  activemq:
    broker-url: tcp://localhost:61616
  jms:
    template:
      default-destination: com.yinhai
    pub-sub-domain: false


destination:可指定

@Service
public class MessageServiceImpl  implements MessageService {

    @Autowired
    JmsMessagingTemplate jmsTemplate;
//    private ArrayList list = new ArrayList();

    @Override
    public String sendMessage(String id) {
        System.out.println("消息已经放入队列中了:"+id);
        jmsTemplate.convertAndSend("order.queue.id",id);
//        final boolean add = list.add(id);
        return "1";
    }

    @Override
    public String doMessage() {
//        final Object id = list.remove(0);
        final String s = jmsTemplate.receiveAndConvert("order.queue.id",String.class);

        System.out.println("消息已经发送成功了id:"+s);
        return "1";
    }
}

JmsListener 监听

监听到队列有消息放入后立马通过入参接收消息

@SendTo(“队列名”)

将入参放入另外一个消息队列

@Component
public class ActiveMQListener {
    @Autowired
    private JmsTemplate jmsTemplate;
    @JmsListener(destination = "order.queue.id")
    @SendTo("other")
    private String snedMessage(String message){
//        final String s = (String) jmsTemplate.receiveAndConvert();
        System.out.println("-------------收到后发送:"+message);
        return message;

    }
}

RabbitMQ

RabbitMQ 是基于Erlang语言编写的,所以先要安装Erlang语言环境
自行去官网下载

安装Erlang

下载完成后配置环境变量ERLANG_HOME
在这里插入图片描述
Path
在这里插入图片描述

安装RabbitMQ

自行去官网下载,windows下exe 直接傻瓜式安装
启动:
start/stop
在这里插入图片描述
注:启动时报下图错误则是因为已经自启动了
在这里插入图片描述

注:如果Erlang版本和Rabbitmq版本不匹配报其他错误

启动管理界面插件
rabbitmq-plugins.bat enable rabbitmq_management

服务端口:5672 管理后台端口:15672
管理界面:http://localhost:15672/
默认密码: guest/guest

Springboot 整合

坐标

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

配置

server:
  port: 8080
spring:
  rabbitmq:
    host: localhost
    port: 5672

队列、交换机配置 ---- DirectExchange

@Configuration
public class RabbimtDirectConfig {
    @Bean
    public Queue queue() {
    // durable 是否持久化 默认false
    // exclusive  是否当前连接专用 默认false 当前连接关闭后即被删除
    // autoDelete 是否自动删除 默认false  生产者消费者不再使用就删除
        return new Queue("direct.queue");
    }
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("direct.exchange");
    }
    @Bean
    Binding binding(Queue queue, DirectExchange directExchange) {
            return BindingBuilder.bind(queue).to(directExchange).with("direct");
    }
}

放入消息

@Service
public class MessageServiceImpl  implements MessageService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

//    private ArrayList list = new ArrayList();

    @Override
    public String sendMessage(String id) {
        System.out.println("消息已经放入队列中了:"+id);
        rabbitTemplate.convertAndSend("direct.exchange", "direct", id);
//        final boolean add = list.add(id);
        return "1";
    }

    @Override
    public String doMessage() {
//        final Object id = list.remove(0);
//        final String s = jmsTemplate.receiveAndConvert("order.queue.id",String.class);

//        System.out.println("消息已经发送成功了id:"+s);
        return "1";
    }
}

监听

@Component
public class RabbitListenre {
    @RabbitListener(queues="direct.queue")
    public void listen(String id) {
        System.out.println("从队列中取出"+id);
    }
}


队列、交换机配置 ---- TopExchange

匹配规则:模糊匹配
一 :(*)用来表示一个单词,该单词必须出现
二 :(#):用来表示任意数量
在这里插入图片描述

@Configuration
public class RabbimtTopicConfig {
    @Bean
    public Queue topicqueue() {
        return new Queue("topic.queue");
    }
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("topic.exchange");
    }
    @Bean
    Binding bindingTopic(Queue topicqueue, TopicExchange topicExchange) {
            return BindingBuilder.bind(topicqueue).to(topicExchange).with("topic.#");
    }
}

  @Override
    public String sendMessage(String id) {
        System.out.println("消息已经放入队列中了:"+id);
        rabbitTemplate.convertAndSend("topic.exchange", "topic.asdasd.asds", id);
//        final boolean add = list.add(id);
        return "1";
    }

消息监听

@Component
public class RabbitListenre {
    @RabbitListener(queues="topic.queue")
    public void listen(String id) {
        System.out.println("从队列中取出"+id);
    }
}

RocketMQ

Kakfa

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tcp aimd 窗口的推导

旧事重提&#xff0c;今天用微分方程的数值解观测 tcp aimd 窗口值。 设系统 AI&#xff0c;MD 参数分别为 a 1&#xff0c;b 0.5&#xff0c;丢包率由 buffer 大小&#xff0c;red 配置以及线路误码率共同决定&#xff0c;设为 p&#xff0c;窗口为 W&#xff0c;则有&…

docker部署skywalking

skywalking版本下载 1&#xff1a;拉取skywalking的oap镜像(可以选择自己的版本&#xff0c;最好与ui&#xff0c;agent版本一致) docker pull apache/skywalking-oap-server:9.5.02&#xff1a;启动oap docker run -d -p 11800:11800 -p 12800:12800 --name sw_oap apache/…

【介绍下R-tree,什么是R-tree?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

前端渲染大量数据思路【虚拟列表】【异步机制】

当浏览器遇到性能瓶颈导致页面卡顿时&#xff0c;你会怎么处理&#xff1f;如何查找问题的原因&#xff1f; 浏览器本身自带性能检测工具&#xff0c;通常我们分析由脚本导致的页面卡顿会选择 性能&#xff08;performance&#xff09; 选项卡&#xff0c;在其中我们可以找到导…

嵌入式linux系统中利用I2C控制器应用开发详解

大家好,今天主要给大家分享一下,在linux系统上如何使用I2C进行应用开发详解。 l2C (Inter一Integrated Circuit BUS)是I2C BUS简称.中文为集成电路总线.是目前应用最广泛的总线之一。和IMX6ULL有些相关的是.刚好该总线是NXP前身的PHLIPS 设计。 第一:I2C协议概述 …

C++基础编程100题-007 OpenJudge-1.3-05 计算分数的浮点数值

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/05/ 描述 两个整数a和b分别作为分子和分母&#xff0c;既分数 a/b &#xff0c;求它的浮点数值&#xff08;双精度浮点数&#xff0c;保留小数点后9位&#xff09; 输入 输入仅一行&#xff0c;包括两个…

Postman 连接数据库 利用node+xmysql

1、准备nodejs环境 如果没有安装&#xff0c;在网上找教程&#xff0c;安装好后&#xff0c;在控制台输入命令查看版本&#xff0c;如下就成功了 2、安装xmysql 在控制台输入 npm install -g xmysql 3、连接目标数据库 帮助如下&#xff1a; 示例&#xff1a; 目标数据库…

新品发布 | 飞凌嵌入式RK3562J核心板,智能工业时代的国产智慧引擎

飞凌嵌入式推出FET3562J-C全国产核心板&#xff0c;专为工业自动化及消费类电子设备设计&#xff0c;打造智能工业时代的国产智慧新引擎。 FET3562J-C核心板基于Rockchip RK3562J处理器开发设计&#xff0c;该处理器采用22nm先进制程工艺&#xff0c;集成了4个ARM Cortex-A53高…

在C++中用3种方法访问一个字符串

1&#xff0e;用字符数组存放一个字符串 编写程序&#xff1a; str是字符数组名&#xff0c;它代表字符数组的首元素的地址&#xff0c;输出时从str指向的字符开始&#xff0c;逐个输出字符&#xff0c;直至遇到\0为止。 2&#xff0e;用字符串变量存放字符串 编写程序&…

数据库 | 关系数据库设计

第七章 1.简述数据库的设计阶段&#xff1f;&#xff08;简要回答数据库设计步骤&#xff1f;&#xff09;&#xff08;&#xff08;数据库设计有哪几个阶段&#xff1f;&#xff09; 需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施、数据库的运行和维护…

深度解析:ChatGPT全面测评——功能、性能与用户体验全景剖析

从去年底至今&#xff0c;由 OpenAI 发布的大规模语言模型 ChatGPT 引发了几乎所有科技领域从业者的高度关注。据瑞银集团的报告显示&#xff0c;自 2023 年 1 月起&#xff0c;仅两个月内&#xff0c;ChatGPT 的月活用户数便超过了 1 亿。 ChatGPT 被誉为“最强 AI”&#xff…

【Vue】练习-mutations的减法功能

文章目录 一、需求二、完整代码 一、需求 步骤 二、完整代码 Son1.vue <template><div class"box"><h2>Son1 子组件</h2>从vuex中获取的值: <label>{{ $store.state.count }}</label><br><button click"handleA…

使用python绘制季节图

使用python绘制季节图 季节图效果代码 季节图 季节图&#xff08;Seasonal Plot&#xff09;是一种数据可视化图表&#xff0c;用于展示时间序列数据的季节性变化。它通过将每个时间段&#xff08;如每个月、每个季度&#xff09;的数据绘制在同一张图表上&#xff0c;使得不同…

Live800:客户服务团队的力量,塑造企业的服务之魂

在数字化时代&#xff0c;企业的竞争已经不仅仅是产品和价格的竞争&#xff0c;更是服务质量的竞争。这里将探讨客户服务团队的力量如何塑造企业的服务之魂&#xff0c;以及这一团队如何成为企业不可或缺的一部分。 一、客户服务团队的重要性 客户服务团队是企业与客户之间的重…

以sqlilabs靶场为例,讲解SQL注入攻击原理【32-41关】

【Less-32】 尝试使用各种注入发现无论是单引号还是双引号都被\转义成了字符串&#xff0c;导致SQL无法注入。 解决方案&#xff1a;宽字节注入。原理&#xff1a;利用数据库和页面编码不同的问题&#xff0c;PHP发送请求到mysql时经过一次gbk编码&#xff0c;因为GBK是双字节…

简单通用的系统安装、备份、还原方法,支持 ARM 系统【Ventory+FirePE+DiskGenius】

文章目录 0. 简介1. 制作 Ventory 启动盘1.1. 下载 Ventory1.2. 制作 Ventory 启动盘 2. 添加 FirePE 等系统镜像到启动盘2.1. 下载 FirePE2.2. 导出 .iso 系统镜像文件2.3. .iso 系统镜像文件添加至启动盘 3. 启动 FirePE 等系统镜像3.1. 在 bios 中选择启动盘启动3.2. 启动系…

How to: Add and Customize Toolbar Skin Selectors

You can add skin selectors to a toolbar (BarManager) and Ribbon Control to allow users to choose skins at runtime. 将皮肤选择器添加到工具栏 At design time, click the [Add] button in the toolbar, and select a skin selector from the Skin Item sub-menu. 以下…

无人机EasyDSS推拉流视频直播技术在农业植保中的精准应用与展望

随着科技的飞速发展&#xff0c;无人机在农业领域的应用越来越广泛&#xff0c;特别是在农业植保方面&#xff0c;无人机以其独特的优势&#xff0c;为农业生产带来了革命性的改变。 无人机在农业植保中的应用主要体现在两个方面&#xff1a;提高工作效率和精准喷洒药物。在以…

AI 边缘计算平台 - 6 TOPS 低功耗 RK3576

RK3576 是瑞芯微第二代 8nm 高性能 AIOT 平台&#xff0c;CPU 采用八核大小核构架&#xff08;4A72 2.2GHz 4A53 1.8GHz&#xff09;&#xff0c;以及一个 M0 协处理器。其 CPU 算力高达 58K DMIPS&#xff0c;足以应对各种复杂计算任务。搭载 Mali-G52 MC3 GPU&#xff0c;14…

Rocky linux 搭建DNS主从服务器+keepalived实现高可用

接上两篇文章&#xff0c;这篇文章跟上两篇没有直接关系。 第一篇&#xff1a;linux rocky 搭建DNS服务和禁止AD域控DNS&#xff0c;做到独立DNS并加域_linux 域控-CSDN博客文章浏览阅读519次&#xff0c;点赞20次&#xff0c;收藏10次。使用linux rocky 搭建DNS服务&#xff…