# 全面解剖 消息中间件 RocketMQ-(5)

全面解剖 消息中间件 RocketMQ-(5)

一、RocketMQ :过滤消息的两种方式

1、Tag 过滤

在大多数情况下,TAG 是一个简单而有用的设计,其可以来选择您想要的消息。

例如:
DefaultMoPushconsumer consumer = new DefaultMoPushconsumer(“CID EXAMPLE”).consumer.subscribe(“TOPIC”,“TAGA II TAGB II TAGC”):

消费者将接收包含 TAGA 或 TAGB 或 TAGC 的消息。但是限制是一个消息只能有一个标签,这对于复杂的场景可能不起作用。
在这种情况下,可以使用 SQL 表达式筛选消息。SQL 特性可以通过发送消息时的属性来进行计算。在 RocketMQ 定义的语法下,可以实现一些简单的逻辑。

2、SQL 语法过滤

2.1 RocketMQ 只定义了一些基本语法来支持这个特性。你也可以很容易地扩展它。
  • 数值比较,比如:**>,>=,<,<=,BETWEEN,=;活活
  • 字符比较,比如:=,<>,IN;
  • IS NULL 或者 IS NOT NULL;
  • 逻辑符号 AND,OR,NOT;
2.2 常量支持类型为:
  • 数值,比如:123,3.1415;
  • 字符,比如:‘abc’,必须用单引号包裹起来:
  • NULL,特殊的常量
  • 布尔值,TRUE 或 FALSE
2.3 只有使用 push 模式的消费者才能使用 SQL92 标准的 sql 语句,接口如下:

public void subscribe(finalstring topic, final Messageselector messageselector)

二、RocketMQ :Tag 过滤

1、在工程 rocketmq_demo (模块)中,创建 Tag 过滤 生产 类 Producer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\tag\Producer.java**   2024-5-24  创建 Tag 过滤 生产 类 Producer.java*/
package djh.it.mq.rocketmq.filter.tag;import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;import java.util.concurrent.TimeUnit;public class Producer {public static void main(String[] args) throws Exception {//1.创建消息生产者 producer,并制定生产者组名DefaultMQProducer producer = new DefaultMQProducer("group1");//2.指定 Nameserver 地址(集群配置)//producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)producer.setNamesrvAddr("172.18.30.110:9876");//3.启动 producerproducer.start();for(int i=0; i<3; i++){//4.创建消息对象,指定主题 Topic、Tag 和消息体//参数一:消息主题 Topic, 参数二:消息 Tag, 参数三:消息内容//Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World"+i).getBytes());Message msg = new Message("FilterTagTopic", "Tag2", ("Hello World"+i).getBytes());//5.发送消息SendResult result = producer.send(msg);System.out.println("发送结果:"+result);TimeUnit.SECONDS.sleep(1);  //线程睡1秒}//6.关闭生产者 producer。producer.shutdown();}
}

2、在工程 rocketmq_demo (模块)中,创建 Tag 过滤 消费 类 Consumer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\tag\Consumer.java**   2024-5-24  创建 Tag 过滤 消费 类 Consumer.java*/
package djh.it.mq.rocketmq.filter.tag;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;import java.util.List;public class Consumer {public static void main(String[] args) throws Exception {//1.创建消费者 Consumer,制定消费者组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");//2.指定 Nameserver 地址(集群配置)//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)consumer.setNamesrvAddr("172.18.30.110:9876");//3.订阅主题 Topic 和 Tag//consumer.subscribe("FilterTagTopic", "Tag1");  //接收同步消息//consumer.subscribe("FilterTagTopic", "Tag2");  //接收异步消息前,可以让先发送异步消息。consumer.subscribe("FilterTagTopic", "Tag1 || Tag2");  //接收同步消息 和 异步消息//consumer.subscribe("FilterTagTopic", "*");  //接收所有消息。//添加消费模式//consumer.setMessageModel(MessageModel.CLUSTERING);  //默认是负载均衡模式消费//consumer.setMessageModel(MessageModel.BROADCASTING);  //广播模式消费//4.设置回调函数,处理消息consumer.registerMessageListener(new MessageListenerConcurrently(){//接受消息内容public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){//System.out.println(msgs); //接收到的消息是未转换的字节码for(MessageExt msg : msgs){System.out.println("consumeThread="+ Thread.currentThread().getName() + ", " + new String(msg.getBody()));  //转换为字符串消息}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});//5.启动消费者 consumer。consumer.start();System.out.println("消费者启动");}
}

3、启动 消费 类 Consumer.java 和 发送 类 Producer.java 进行测试。

在这里插入图片描述

三、RocketMQ :SQL 语法过滤

1、RocketMQ :SQL 语法过滤

1.1 RocketMQ 只定义了一些基本语法来支持这个特性。你也可以很容易地扩展它。
  • 数值比较,比如:**>,>=,<,<=,BETWEEN,=;活活
  • 字符比较,比如:=,<>,IN;
  • IS NULL 或者 IS NOT NULL;
  • 逻辑符号 AND,OR,NOT;
1.2 常量支持类型为:
  • 数值,比如:123,3.1415;
  • 字符,比如:‘abc’,必须用单引号包裹起来:
  • NULL,特殊的常量
  • 布尔值,TRUE或 FALSE
1.3 只有使用 push 模式的消费者才能用使用 SQL92 标准的 sql 语句,接口如下:

public void subscribe(finalstring topic, final Messageselector messageselector)
1.4 注意:使用 SQL92 标准的 sql 语句,需要在 broker 配置文件 添加支持 SQL92 标准的 sql 语句。

# 单机模式下,在 ./conf/broker.conf 中,添加支持 SQL92 标准的 sql 语句  
enablePropertyFilter=true# 集群模式下,修改 broker-m.conf 和 broker-s.conf。然后重启 broker 。
enablePropertyFilter=true

2、在工程 rocketmq_demo (模块)中,创建 SQL 过滤 生产 类 Producer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\sql\Producer.java**   2024-5-24  创建 SQL 过滤 生产 类 Producer.java*/
package djh.it.mq.rocketmq.filter.sql;import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;import java.util.concurrent.TimeUnit;public class Producer {public static void main(String[] args) throws Exception {//1.创建消息生产者 producer,并制定生产者组名DefaultMQProducer producer = new DefaultMQProducer("group1");//2.指定 Nameserver 地址(集群配置)//producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)producer.setNamesrvAddr("172.18.30.110:9876");//3.启动 producerproducer.start();for(int i=0; i<10; i++){//4.创建消息对象,指定主题 Topic、Tag 和消息体//参数一:消息主题 Topic, 参数二:消息 Tag, 参数三:消息内容//Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World"+i).getBytes());Message msg = new Message("FilterSQLTopic", "Tag1", ("Hello World"+i).getBytes());//设置一个用户属性msg.putUserProperty("i", String.valueOf(i));//5.发送消息SendResult result = producer.send(msg);System.out.println("发送结果:"+result);TimeUnit.SECONDS.sleep(1);  //线程睡1秒}//6.关闭生产者 producer。producer.shutdown();}
}

3、在工程 rocketmq_demo (模块)中,创建 SQL 过滤 消费 类 Consumer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\filter\sql\Consumer.java**   2024-5-24  创建 SQL 过滤 消费 类 Consumer.java*/
package djh.it.mq.rocketmq.filter.sql;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.MessageSelector;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;import java.util.List;public class Consumer {public static void main(String[] args) throws Exception {//1.创建消费者 Consumer,制定消费者组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");//2.指定 Nameserver 地址(集群配置)//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)consumer.setNamesrvAddr("172.18.30.110:9876");//3.订阅主题 Topic 和 Tag//注意:需要在 broker 配置文件 ./conf/broker.conf 中,# 添加支持 SQL92 标准的 sql 语句  //enablePropertyFilter=trueconsumer.subscribe("FilterSQLTopic", MessageSelector.bySql("i>5"));  //接收同步消息 和 异步消息//4.设置回调函数,处理消息consumer.registerMessageListener(new MessageListenerConcurrently(){//接受消息内容public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){//System.out.println(msgs); //接收到的消息是未转换的字节码for(MessageExt msg : msgs){System.out.println("consumeThread="+ Thread.currentThread().getName() + ", " + new String(msg.getBody()));  //转换为字符串消息}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});//5.启动消费者 consumer。consumer.start();System.out.println("消费者启动");}
}

4、启动 消费 类 Consumer.java 和 发送 类 Producer.java 进行测试。

在这里插入图片描述

四、RocketMQ :事务消息的流程分析

1、事务消息的大致方案分为两个流程:正常事务消息的发送及提交、事务消息的补偿流程。

在这里插入图片描述

1.1 事务消息发送及提交
  • 发送消息 ( half 消息 )。
  • 服务端响应消息写入结果。
  • 根据发送结果执行本地事务(如果写入失败,此时half消息对业务不可见,本地逻辑不执行)。
  • 根据本地事务状态执行Commit或者Rollback(Commit操作生成消息索引,消息对消费者可见)。
1.2 事务补偿
  • 对没有 Commit/Rollback 的事务消息 ( pending 状态的消息),从服务端发起一次“回查。
  • Producer 收到回查消息,检查回查消息对应的本地事务的状态。
  • 根据本地事务状态,重新 Commit 或者 Rollback。

其中,补偿阶段用于解决消息 Commit 或者 Rollback 发生超时或者失败的情况。

2、事务消息共有三种状态,提交状态、回滚状态中间状态。

  • TransactionStatus.commitTransaction : 提交事务,它允许消费者消费此消息不允许被消费。
  • TransactionStatus.RollbackTransaction : 回滚事务,它代表该消息将被删除,
  • TransactionStatus.Unknown : 中间状态,它代表需要检查消息队列来确定状态。

五、RocketMQ :事务消息的实现

1、在工程 rocketmq_demo (模块)中,创建 事务消息 生产 类 Producer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\transaction\Producer.java**   2024-5-24  创建 事务消息 生产 类 Producer.java*/
package djh.it.mq.rocketmq.transaction;import io.netty.util.internal.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.producer.*;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;import java.util.concurrent.TimeUnit;public class Producer {public static void main(String[] args) throws Exception {//1.创建消息生产者 producer,并制定生产者组名//DefaultMQProducer producer = new DefaultMQProducer("group1");TransactionMQProducer producer = new TransactionMQProducer("group2");//2.指定 Nameserver 地址(集群配置)//producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)producer.setNamesrvAddr("172.18.30.110:9876");//添加事务监听器producer.setTransactionListener(new TransactionListener() {//在该方法中执行本地事务public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {if(StringUtils.equals("TAGA", msg.getTags())){return LocalTransactionState.COMMIT_MESSAGE;}else if(StringUtils.equals("TAGB", msg.getTags())){return LocalTransactionState.ROLLBACK_MESSAGE;}else if(StringUtils.equals("TAGC", msg.getTags())){return LocalTransactionState.UNKNOW;}return LocalTransactionState.UNKNOW;}//在该方法中 MQ 进行消息事务状态的回查public LocalTransactionState checkLocalTransaction(MessageExt msg) {System.out.println("消息的Tag:"+msg.getTags());return LocalTransactionState.COMMIT_MESSAGE;}});//3.启动 producerproducer.start();String[] tags = {"TAGA", "TAGB", "TAGC"};for(int i=0; i<3; i++){//4.创建消息对象,指定主题 Topic、Tag 和消息体//参数一:消息主题 Topic, 参数二:消息 Tag, 参数三:消息内容//Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World"+i).getBytes());Message msg = new Message("TransactionTopic", tags[i], ("Hello World"+i).getBytes());//5.发送消息SendResult result = producer.sendMessageInTransaction(msg, null);//发送状态SendStatus status = result.getSendStatus();System.out.println("发送结果:"+result);TimeUnit.SECONDS.sleep(1);  //线程睡1秒}//6.关闭生产者 producer。//producer.shutdown();}
}

2、在工程 rocketmq_demo (模块)中,创建 事务消息 消费 类 Consumer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\transaction\Consumer.java**   2024-5-24  创建 事务消息 消费 类 Consumer.java*/
package djh.it.mq.rocketmq.transaction;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;import java.util.List;public class Consumer {public static void main(String[] args) throws Exception {//1.创建消费者 Consumer,制定消费者组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");//2.指定 Nameserver 地址(集群配置)//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)consumer.setNamesrvAddr("172.18.30.110:9876");//3.订阅主题 Topic 和 Tag//consumer.subscribe("FilterTagTopic", "Tag1");  //接收同步消息//consumer.subscribe("FilterTagTopic", "Tag2");  //接收异步消息前,可以让先发送异步消息。//consumer.subscribe("TransactionTopic", "Tag1 || Tag2");  //接收同步消息 和 异步消息consumer.subscribe("TransactionTopic", "*");  //接收所有消息。//添加消费模式//consumer.setMessageModel(MessageModel.CLUSTERING);  //默认是负载均衡模式消费//consumer.setMessageModel(MessageModel.BROADCASTING);  //广播模式消费//4.设置回调函数,处理消息consumer.registerMessageListener(new MessageListenerConcurrently(){//接受消息内容public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){//System.out.println(msgs); //接收到的消息是未转换的字节码for(MessageExt msg : msgs){System.out.println("consumeThread="+ Thread.currentThread().getName() + ", " + new String(msg.getBody()));  //转换为字符串消息}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});//5.启动消费者 consumer。consumer.start();System.out.println("消费者启动");}
}

3、启动 消费 类 Consumer.java 和 发送 类 Producer.java 进行测试。

1) Producer.java 输出 三条记录 和 消息的Tag:TAGC

在这里插入图片描述

3) Consumer.java 输出 2 条记录,其中一条回滚了。

在这里插入图片描述

上一节关联链接请点击:
# 全面解剖 消息中间件 RocketMQ-(4)

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

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

相关文章

文件夹突变解析:类型变文件的数据恢复与预防

在数字化时代&#xff0c;文件夹作为我们存储和组织数据的基本单元&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人困惑的情况——文件夹的类型突然变为文件&#xff0c;导致无法正常访问其中的内容。这种现象不仅会影响我们的工作效率&#xff0c;…

[MySQL最详细的知识点]

MySQL 关系型数据库以一行作为一个记录,列数据库以一列为一个记录一行是一个记录,一列是一个字段一行是一个实体,一列是一个属性 MySQL引擎: MySQL引擎&#xff1a;可以理解为&#xff0c;MySQL的“文件系统”&#xff0c;只不过功能更加强大。​MySQL引擎功能&#xff1a;除…

mysql 分区

目标 给一个表&#xff08;半年有800万&#xff09;增加分区以增加查询速度 约束 分区不能有外键否则会报错 https://blog.csdn.net/yabingshi_tech/article/details/52241034 主键 按照时间列进行分区 https://blog.csdn.net/winerpro/article/details/135736454 参看以…

安全测试 之 常见安全漏洞:CORS

1. 背景 安全测试定义&#xff1a;安全测试&#xff0c;是在软件产品开发基本完成时&#xff0c;验证产品是否符合安全需求定义和产品质量标准的过程。目的&#xff1a;通过对系统进行全面的脆弱性安全测试&#xff0c;发现系统未知的安全隐患并提出相关建议&#xff0c;确保系…

BUAA操作系统万字笔记-课堂笔记-期末考试-考研必备-北航961系列

文章目录 1 概论1.1 CPU漏洞攻击1.2 操作系统简史1.2.1 体系结构1.2.2 系统发展 1.3 操作系统基本实现机制1.3.1 异常&#xff1a;陷阱和中断 2 系统引导3 内存管理3.1 预备知识-链接与装载3.2 存储管理基础3.2.1 存储器管理目标3.2.2 存储器硬件发展3.2.3 存储管理的功能3.2.4…

【python】成功解决“TypeError: not enough arguments for format string”错误的全面指南

成功解决“TypeError: not enough arguments for format string”错误的全面指南 一、引言 在Python编程中&#xff0c;TypeError: not enough arguments for format string错误是一个常见的字符串格式化问题。这个错误通常发生在使用str.format()方法时&#xff0c;提供的参数…

frp之XTCP实现内网穿透家用电脑远程桌面公司电脑

官网XTCP介绍 《XTCP介绍》 实现图 fprs.toml # frps 服务端口&#xff08;不填&#xff0c;则默认&#xff1a;7000&#xff09; bindPort 81 auth.token "token 令牌"公司电脑frpc.toml serverAddr "frps公网服务器域名或ip" serverPort frps 服…

Java图形用户界面程序设计所需要使用的工具

Java图形用户界面程序设计 前言一、图形用户界面程序设计的概述GUI概述Java GUI技术的发展 二、AWT概述简介AWT继承体系总结 三、Swing概述Swing概述优势Swing的特征总结 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣…

Python程序设计 身份证号的奥秘

第1关&#xff1a;判断性别 通过身份证的第17位也就是倒数第二位的数字可以辨别该身份证所属人的性别,奇数为男性,偶数为女性。 任务&#xff1a;输入身份证号&#xff0c;第17位若是偶数&#xff0c;输出男性&#xff0c;否则输出女性 如何截取字符串的一个字符 如何判断一个…

机器视觉检测--相机

一&#xff0c;相机就是CCD么&#xff1f; 通常&#xff0c;我们把相机都叫作CCD&#xff0c;CCD已经成了相机的代名词。其实很可能正在使用的是CMOS。CCD以及CMOS都称为感光元件&#xff0c;都是将光学图像转换为电子信号的半导体元件。他们在检测光时都采用光电二极管&#…

AI降痕:让AI代写的论文,也能成为原创佳作

随着人工智能技术的突飞猛进&#xff0c;AI生成内容&#xff08;AIGC&#xff09;已被广泛用于学术论文撰写中&#xff0c;提高效率同时也带来了原创性的挑战。面对日益严格的学术审查&#xff0c;一个突出的问题是&#xff1a;使用AI代写的论文能否通过内容检测&#xff1f;因…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

【STM32之FreeRTOS(二)】任务的创建与删除

【STM32之FreeRTOS(二)】任务的创建与删除 文章目录 【STM32之FreeRTOS(二)】任务的创建与删除一、什么是任务&#xff1f;二、任务创建与删除相关函数1.任务创建与删除相关函数2.任务动态创建与静态创建的区别3.xTaskCreate 函数原型4.vTaskDelete 函数原型 三、实操(同时控制…

面试题:谈谈你对 JS 原型链的理解

面试题&#xff1a;谈谈你对 JS 原型链的理解 JavaScript 是一种基于原型的语言&#xff0c;即每个对象都拥有一个原型对象&#xff0c;对象通过其原型对象继承方法和属性。原型对象也有其原型对象&#xff0c;依次类推&#xff0c;就构成了原型链。当对象访问一个属性或方法后…

BioTech - 计算大量 蛋白质结构预测结果 的聚类中心(Cluster)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139419653 CASP16 的 H0215 样本,聚类之后,10个类别的最高置信度结果。 Agglomerative Clustering,即凝聚层次聚类,属于层次聚类算法,通过逐步合并或聚集数据点,…

Qt-demo高级感无边框窗口、美化基础控件

展示&#xff1a; 代码实现&#xff1a; // 鼠标按下事件(记录拉伸窗口或移动窗口时的起始坐标&#xff08;左上角&#xff09;) void framelessWidget::mousePressEvent(QMouseEvent *event) {if(event->button() Qt::LeftButton){mousePressed true; #if (QT_VERSION &…

傅立叶变换矩阵的频谱响应

傅立叶变换矩阵的频谱响应 线性变换可以用矩阵表示&#xff0c;傅立叶变换是一种线性变换&#xff0c;因此也可以使用矩阵表示。具体可以参考&#xff1a;离散傅立叶变换和线性变换的关系&#xff1a;什么是线性空间&#xff1f; 1、傅立叶矩阵 X [ k ] ∑ n 0 N − 1 x [ …

【EI会议/稳定检索】2024年电机与电气控制国际会议(ICMEC 2024)

2024 International Conference on Motor and Electrical Control 2024年电机与电气控制国际会议 【会议信息】 会议简称&#xff1a;ICMEC 2024 截稿时间&#xff1a;(以官网为准&#xff09; 大会地点&#xff1a;中国厦门 会议官网&#xff1a;www.meciac.com 会议邮箱&…

每日十题---三

1. Vue中$nextTick原理 1. 简单的理解就是它就是一个setTimeout函数&#xff0c;将函数放到异步后去处理。 2. Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化&#xff0c;Vue 将开启一个队列&#xff0c;并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被…

海外仓代发系统选择标准:功能稳定和性价比高一个都不能少

对海外仓来说&#xff0c;一件代发基本都是比较核心的业务。不过这个核心业务现在的竞争确实也比较大&#xff0c;对海外仓企业而言&#xff0c;想在一件代发上做到让客户满意&#xff0c;还是需要多方面努力的。 一方面&#xff0c;需要自己的仓库管理模式足够标准化&#xf…