消息队列笔记

异步技术

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

原文链接: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.mfbz.cn/a/691118.html

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

相关文章

语法分析!!!

一、实验题目 根据给定文法编写调试预测分析程序&#xff0c;对任意输入串用预测分析法进行语法分析。 二、实验目的 加深对预测分析法的理解。 三、实验内容 四、实验代码 #include <iostream> #include <stdio.h> #include <string> #include <…

elasticsearch hanlp插件自定义分词配置(停用词)

[Toc](elasticsearch hanlp插件自定义分词配置(停用词)) 既然可以自定义关键词&#xff0c;那么自然也是可以自定义停用词的。 背景 由于在使用elasticsearch hanlp(以下简称es hanlp)的过程中&#xff0c;分词会出现一些无用的词&#xff0c;比如各种标点符号或者没有意义的…

二叉排序树--c++

【相关知识】 二叉排序树&#xff08;也称二叉查找树&#xff09;&#xff1a;或者是一棵空的二叉树&#xff0c;或者是具有下列性质的二叉树&#xff1a; ⑴ 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于根结点的值&#xff1b; ⑵ 若它的右子树不空&#xff0c…

vivado HW_BITSTREAM、HW_CFGMEM

HW_比特流 描述 从比特流文件创建的硬件比特流对象hw_bitstream&#xff0c;用于关联 在Vivado的硬件管理器功能中使用硬件设备对象hw_device 设计套件。 比特流文件是从具有write_bitstream的放置和路由设计创建的 命令硬件位流对象是使用 create_hw_bitstream命令&#xff0c…

【Vue】vuex 的使用 - 创建仓库

通用的地方我们一般会称之为仓库 1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex32.新建 store/index.js 专门存放 vuex ​ 为了维护项目…

vue2中如何使用函数式组件

vue2 中如何使用函数式组件 用 render 定义函数式组件如何处理 props如何在函数式组件中触发自定义事件&#xff1f;injection如何使用 computed 和 methods定义一个函数式组件的 MyButton函数式组件有何优势哪种场景适合使用函数式组件函数式组件的问题参考 函数式组件&#x…

MySQL-相关日志

官方文档 1、MySQL支持的日志 MySQL有不同类型日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分别为 二进制日志、错误日志、通用查询日志、慢查询日志、中继日志、数据定义语句日志 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time的所有查询&#xf…

【 技术栈】技术方案到底怎么写?

文章目录 一、背景二、技术方案重要性三、常见的技术方案有哪些内容1、系统用例2、功能整体链路2.1、核心业务流程 3、数据库设计4、接口设计5、非功能设计5.1、性能与稳定性5.2、监控 7、系统风险点评估 四、总结 一、背景 工作中&#xff0c;有一些需求或者技术改造&#xf…

前端开发高频面试题

好的&#xff0c;以下是对您提出的问题的详细回答&#xff1a; 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; Vue中动态权限绑定渲染列表通常涉及以下步骤&#xff1a; 首先&#xff0c;通过API请求从服务器获取当前用户的权限数据。在Vue组件中&#xff…

uc/OS移植到stm32实现三个任务

文章目录 一、使用CubeMX创建工程二、uc/OS移植三、添加代码四、修改代码五、实践结果六、参考文章七、总结 实践内容 学习嵌入式实时操作系统&#xff08;RTOS&#xff09;,以uc/OS为例&#xff0c;将其移植到stm32F103上&#xff0c;构建至少3个任务&#xff08;task&#xf…

[pixi.js] 入门简单案例 简易时钟

老实说pixi虽然之前拿来做个几个简单的游戏&#xff0c;但是是好久前的了&#xff0c;又忘了&#xff0c;现在算是重新入门。 官网版本已经更新到v8去了&#xff0c;而react相关的pixi库pixi-react 虽然支持react18 但还是v6-v7的版本&#xff0c;既然已经看了v8的文档&#xf…

Web 版 | 开源数据库设计软件 | drawdb

文章目录 简介快速运行方式 1:本地运行方式 2:Docker 构建并运行方式 3:Docker 运行参考🚀 目标: 安装一个 Web 版本的 ER 图设计软件! 👉 GitHub: https://github.com/drawdb-io/drawdb 【11.7k ⭐】 简介 DrawDB:Free, simple, and intuitive database design …

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…

Idea解决堆栈溢出

废话不说了&#xff0c;这问题搞了我两天&#xff0c;最近在用内网办公&#xff0c;没用公网&#xff0c;所以博客暂时没更新

堆排序-调整算法

个人主页点这里!~ 1.堆 了解堆排序首先要了解一下堆这个数据结构 堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;它通常被表示为一个完全二叉树或近似完全二叉树&#xff0c;并且满足堆性质&#xff08;Heap Property&#xff09;。堆主要分为两种&…

wordpress主题导航主题v4.16.2哈哈版

1.下载授权接口源码onenav-auth-api-v2.zip &#xff0c;在宝塔新建一个网站&#xff0c;域名为 auth.iotheme.cn&#xff0c;设置wordpress伪静态&#xff0c;申请ssl证书。将上面源码解压后上传到此网站根目录。 2. 在宝塔根目录etc下 hosts 中添加 127.0.0.1 auth.iotheme.…

Docker配置Redis集群以及主从扩容与缩容

基础镜像拉取 docker run -p 6379:6379 -d redis:6.0.8 配置文件以及数据卷挂载 # 开启密码验证&#xff08;可选&#xff09; requirepass 1234 # 允许redis外地连接&#xff0c;需要注释掉绑定的IP # bind 127.0.0.1 # 关闭保护模式&#xff08;可选&#xff09; protected-m…

13、SpringBoot 源码分析 - 自动配置深度分析六

SpringBoot 源码分析 - 自动配置深度分析六 refresh和自动配置大致流程AutoConfigurationImportSelector的fireAutoConfigurationImportEvents通知自动配置导入事件AutoConfigurationGroup的selectImports封装成Entry返回MyAutoConfiguration自动配置类创建META-INF文件夹和文件…

CST纳米光学 --- LSPR局部等离子激元共振,消光截面ECS,法诺共振

这期我们用自带的Drude散射粒子&#xff0c;计算消光截面。 查看模型&#xff0c;内核是Silica二氧化硅&#xff0c;正常的介质材料&#xff0c;半径是38纳米&#xff1a; 外围是Drude模型的金属材料包裹&#xff0c;半径48纳米&#xff0c;该材料的参数可由宏Materials->Cr…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…