当前位置: 首页 > news >正文

RocketMQ的使⽤

初识MQ

1.1.同步和异步通讯

微服务间通讯有同步和异步两种⽅式:
同步通讯:就像打电话,需要实时响应。
异步通讯:就像发邮件,不需要⻢上回复。
两种⽅式各有优劣,打电话可以⽴即得到响应,但是你却不能跟多个⼈同时通话。发送邮件可以同
时与多个⼈收发邮件,但是往往响应会有延迟。
1.1.1.同步通讯
Feign调⽤就属于同步⽅式,虽然调⽤可以实时得到结果,但存在下⾯的问题

 

 

 

总结:
同步调⽤的优点:
  • 时效性较强,可以⽴即得到结果
同步调⽤的问题:
  • 耦合度⾼
  • 性能和吞吐能⼒下降
  • 有额外的资源消耗
  • 有级联失败问题(由于⼀个故障导致了连锁反应,使得系统中的其他组件或节点也相继失败)
 1.1.2.异步通讯

异步调⽤则可以避免上述问题:
我们以购买商品为例,⽤户⽀付后需要调⽤订单服务完成订单状态修改,调⽤物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,⽀付服务是事件发布者(publisher),在⽀付完成后只需要发布⼀个⽀付成功的事件 (event),事件中带上订单id。
订单服务和物流服务是事件订阅者(Consumer),订阅⽀付成功的事件,监听到事件后完成⾃⼰业务即可。

 

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,⽽是有⼀个中间⼈(Broker)。发布者发布事件到Broker,不关⼼谁来订阅事件。订阅者从Broker订阅事件,不关⼼谁发来的消息

 

 

Broker 是⼀个像数据总线⼀样的东⻄,所有的服务要接收数据和发送数据都发到这个总线上,这
个总线就像协议⼀样,让服务间的通讯变得标准和可控。
好处:
吞吐量提升:⽆需等待订阅者处理完成,响应更快速
故障隔离:服务没有直接调⽤,不存在级联失败问题
调⽤间没有阻塞,不会造成⽆效的资源占⽤
耦合度极低,每个服务都可以灵活插拔,可替换
流量削峰:不管发布事件的流量波动多⼤,都由Broker接收,订阅者可以按照⾃⼰的速度去处理
事件
缺点:
架构复杂了,业务没有明显的流程线,不好管理
需要依赖于Broker的可靠、安全、性能
好在现在开源软件或云平台上 Broker 的软件是⾮常成熟的,⽐较常⻅的⼀种就是我们今天要学习
的MQ技术。

 1.2.技术对⽐

MQ,中⽂是消息队列(MessageQueue),字⾯来看就是存放消息的队列。也就是事件驱动架构
中的Broker。
⼏种常⻅MQ的对⽐:

 

 

追求可⽤性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能⼒:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
不同的消息队列系统在不同场景下有各⾃的优势和适⽤性。以下是各个消息队列系统在不同场合下的最佳选择:

 Kafka:

最佳场合:⼤规模数据处理、实时⽇志收集和分析、流式处理。

优势:⾼吞吐量、低延迟、⽔平扩展能⼒强、⻓期消息存储,适合构建⼤规模的实时数据流处理平台,如实时⽇志收集和分析、事件流处理等。
RabbitMQ:
最佳场合:传统的企业级应⽤、轻量级的消息传递场景。
优势:简单易⽤、⽀持多种消息协议、适合点对点和发布/订阅模式,对于传统的企业应⽤和中⼩规模的消息传递需求,是⼀种可靠的选择
ActiveMQ:
最佳场合:中⼩规模的企业应⽤、Java⽣态系统中的集成需求。
优势:Java开发环境友好、⽀持多种消息协议,适合与Java⽣态系统的其他组件集成,如Spring框架等。
RocketMQ:
最佳场合:⼤规模的分布式系统、互联⽹应⽤、⾦融领域的消息处理。
优势:⾼吞吐量、低延迟、丰富的消息存储模式,适⽤于处理⼤规模的消息传递场景,特别是在互联⽹
和⾦融领域。
综合考虑以上因素,可以做如下简单总结:
如果需要处理⼤规模的实时数据流、⽇志收集和分析等⾼吞吐量场景,⾸选Kafka。
如果对于消息传递的简单性和易⽤性有较⾼要求,适合中⼩规模的企业应⽤和轻量级消息传递需求,可以选择RabbitMQ或ActiveMQ。
如果在⼤规模的分布式系统、互联⽹应⽤或⾦融领域需要处理消息传递,RocketMQ是⼀个较好的选择。

2.RocketMQ简介

官⽹: http://rocketmq.apache.org/
RocketMQ是阿⾥巴巴2016年MQ中间件,使⽤Java语⾔开发,RocketMQ 是⼀款开源的分布式消息系 统,基于⾼可⽤分布式集群技术,提供低延时的、⾼可靠的消息发布与订阅服务。同时,⼴泛应⽤于多个领域,包括异步通信解耦、企业解决⽅案、⾦融⽀付、电信、电⼦商务、快递物流、⼴告营销、社交、即时通信、移动应⽤、⼿游、视频、物联⽹、⻋联⽹等。
RocketMQ的设计⽬标是⽀持⼤规模消息处理,具有⾼并发、⾼可⽤和容错能⼒。它在多个⽅⾯提供了强⼤的功能和特性:
分布式架构:RocketMQ采⽤分布式架构,⽀持在多个节点之间进⾏消息的发送和接收,实现了⽔平扩展能⼒。
⾼吞吐量:RocketMQ可以在⼤规模并发场景下实现⾼吞吐量的消息处理,适⽤于⾼并发的业务场景。
低延迟:RocketMQ具有较低的消息传递延迟,适⽤于需要实时性的应⽤场景。
消息可靠性:RocketMQ提供了多种消息存储模式,可以确保消息的可靠传递,包括同步刷盘和异步刷盘等⽅式。
消息顺序性:RocketMQ⽀持消息的顺序传递,可以确保同⼀消息队列中的消息按照发送顺序被消费。
⽀持多种消息模式:RocketMQ⽀持发布/订阅模式和点对点模式,可以根据业务需求选择合适的消息模式。
灵活的部署⽅式:RocketMQ⽀持多种部署⽅式,可以在单机上运⾏,也可以搭建集群部署。
丰富的监控和管理⼯具:RocketMQ提供了丰富的监控和管理⼯具,⽅便管理员对消息队列进⾏监控和管理。
核⼼概念
Producer:消息的发送者,⽣产者;举例:发件⼈。
Consumer:消息接收者,消费者;举例:收件⼈。
Broker:消息队列的中间服务器,负责存储消息并将消息传递给消费者;举例:快递。
NameServer:可以理解为是⼀个注册中⼼,主要是⽤来保存topic路由信息,管理Broker。在 NameServer的集群中,NameServer与NameServer之间是没有任何通信的;举例:各个快递公司的管理机构相当于broker的注册中⼼,保留了broker的信息。
Queue:队列,消息存放的位置,⼀个Broker中可以有多个队列。
Topic:消息的逻辑分类,⽣产者发送消息到指定的Topic,消费者从指定的Topic订阅消息。⼀个Topic可以有多个Producer和多个Consumer。
ProducerGroup:⽣产者组 。
ConsumerGroup:消费者组,多个消费者组可以同时消费⼀个主题的消息。
⼯作流程
Broker启动的时候,会往每台NameServer(因为NameServer之间不通信,所以每台都得注册)注册⾃⼰的信息,这些信息包括⾃⼰的ip和端⼝号,⾃⼰这台Broker有哪些topic等信息。
Producer在启动之后会跟会NameServer建⽴连接,定期从NameServer中获取Broker的信息,当发送消息的时候,会根据消息需要发送到哪个topic去找对应的Broker地址,如果有的话,就向这台Broker发送请求;没有找到的话,就看根据是否允许⾃动创建topic来决定是否发送消息。
Broker在接收到Producer的消息之后,会将消息存起来,持久化,如果有从节点的话,也会主动同步给从节点,实现数据的备份
Consumer启动之后也会跟会NameServer建⽴连接,定期从NameServer中获取Broker和对应topic的信息,然后根据⾃⼰需要订阅的topic信息找到对应的Broker的地址,然后跟Broker建⽴连接,获取消息,进⾏消费

3.RocketMQ安装

本⽂档所涉及的是单机版的RocketMQ安装教程,能够满⾜基本的学习使⽤,属于⼊⻔级的教程,
如果想要搭集群部署,可以参考其他资料,进⾏配置即可
进⼊[RocketMQ官⽹下载](下载 | RocketMQ (apache.org))
1、选择Binary 下载
 2、将压缩包解压⾄⾃定路径

 3、配置系统中的环境变量

 4.启动RocketMQ

4.启动RocketMQ 

 

 

若出现如上图所示的命令框,说明启动成功,保留窗⼝切勿关闭
继续启动broker
与上述同样的路径下呼出cmd,执⾏如下命令:
Start-Process "mqbroker.cmd" -ArgumentList "-n 127.0.0.1:9876",
"autoCreateTopicEnable=true"

 

 5.配置可视化⻚⾯

下载可视化插件源码
github下载地址:https://github.com/apache/rocketmq-dashboard
复制下载链接后使⽤git下载
可⾃建⽂件夹,进⼊后使⽤git bash下载

 git clone https://github.com/apache/rocketmq-dashboard.git

 

 下载完成后,进⼊ application.yml 中查看配置

 

 

 

yarn-v1.22.10.tar.gz 下载超时了
Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.10/yarn-v1.22.10.tar.gz to
D:\Maven\mvn_resp\com\github\eirslett\yarn\1.22.10\yarn-1.22.10.tar.gz [INFO] No proxies configured
[INFO] No proxy was configured, downloading directly
这⾥直接去github拉去就⾏,存⼊你的maven仓库

 

 

在该⽬录下打开cmd,输⼊指令==(请保证已经运⾏NameServer和broker)==:
java -jar rocketmq-dashboard-2.0.1-SNAPSHOT.jar

 

 6.集成springboot

SpringBoot集成RocketMQ
⾸先,在pom.xml中添加RocketMQ的依赖,具体如下所示:

 

< dependency >
< groupId > org . apache . rocketmq < /groupId>
< artifactId > rocketmq - spring - boot - starter < /artifactId>
< version > 2.1 . 1 < /version>
< /dependency>

 然后,在application.yml中添加RocketMQ的基本配置:

 

# RocketMq
rocketmq:
        name - server : 127.0.0 . 1 : 9876
        producer:
                group: producer - group
        consumer:
                group: consumer - group

 然后,在application.yml中添加RocketMQ的基本配置:

# RocketMq
rocketmq:
        name - server : 127.0.0 . 1 : 9876
        producer:
                group: producer - group
        consumer:
                group: consumer - group

 创建消息⽣产者

import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
@Service
public class RocketMQProducer {@Autowiredprivate RocketMQTemplate rocketMQTemplate;private final String topic = "demo-topic";// 1.同步发送消息// 同步发送是指发送⽅发送⼀条消息后,会等待服务器返回确认信息后再进⾏后续操作。这种⽅式适⽤于需要可靠性保证的场景。public void sendSyncMessage(String message){rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build());System.out.printf("同步发送结果: %s\n", message);}// 2.异步发送消息// 异步发送是指发送⽅发送消息后,不等待服务器返回确认信息,⽽是通过回调接⼝处理返回结果。这种⽅式适⽤于对响应时间要求较⾼的场景。public void sendAsyncMessage(String message){rocketMQTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(),     new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {System.out.printf("异步发送成功: %s\n", sendResult);}@Overridepublic void onException(Throwable throwable) {System.out.printf("异步发送失败: %s\n", throwable.getMessage());}});}// 3.单向发送消息// 单向发送是指发送⽅只负责发送消息,不关⼼服务器的响应。该⽅式适⽤于对可靠性要求不⾼的场景,如⽇志收集。public void sendOneWayMessage(String message){rocketMQTemplate.sendOneWay(topic, MessageBuilder.withPayload(message).build());System.out.println("单向消息发送成功");}
}

 创建消息消费者

import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
@Service
@RocketMQMessageListener(topic = "demo-topic", consumerGroup = "consumer-g
roup", messageModel = MessageModel.CLUSTERING)
public class RocketMQConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String s) {System.out.printf("收到消息: %s\n", s);}
}

相关文章:

RocketMQ的使⽤

初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种⽅式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要⻢上回复。 两种⽅式各有优劣&#xff0c;打电话可以⽴即得到响应&#xff0c;但…...

Android Studio 设置不显示 build-tool 无法下载

2024版本查看build-tool版本 File -> Settings -> Languages & Frameworks -> Android SDK 或者直接打开Settings后搜索“SDK” 解决方案 将 Android Studio 升级到2022.2.1以上的版本将 C:/Windows/System32/drivers/etc/hosts 文件用管理员身份打开&#xff0c…...

【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)

网垃圾分类网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着全球环境保护意识的提升&#xff0c;垃圾分类已成为一项紧迫且重要的任务。为了有效推动垃圾分类的实施&#xff0c;提升公众的环保意识和参与度&#xff0c;垃圾分类已…...

细说敏捷:敏捷四会之standup meeting

上一篇文章中&#xff0c;我们讨论了 敏捷四会 中 冲刺计划会 的实施要点&#xff0c;本篇我们继续分享敏捷四会中实施最频繁&#xff0c;团队最容易实施但往往也最容易走形的第二个会议&#xff1a;每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动&#xff0…...

ThinkPHP8使用workerman

应用场景说明&#xff1a;通过建立通信&#xff0c;不同用户进行消息推送或数据更新&#xff0c;因为本身需要作为服务端进行主动消息推送&#xff0c;因此使用Gateway方式&#xff0c;如果不需要的可以不采用这种形式&#xff0c;以下内容仅为参考&#xff0c;具体业务场景&am…...

C语言超详细教程

系列文章目录 文章目录 系列文章目录1 运算符1.1 算术运算符:2 控制语句2.1 条件语句:2.2 循环语句:3 函数3.1 函数的定义与声明:3.2 递归函数:4 指针4.1 指针的定义与使用函数指针:5. 数组与字符串5.1 数组一维数组:相同类型元素的集合(如:多维数组:数组的数组(如:…...

[开源]3K+ star!微软Office的平替工具,跨平台,超赞!

大家好&#xff0c;我是JavaCodexPro&#xff01; 数字化的当下&#xff0c;高效的办公工具是提升工作效率的关键&#xff0c;然而大家想到的一定是 Microsoft Office 办公软件&#xff0c;然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…...

如何借助计算机视觉算法通过识别水尺精准识别水位

如何借助计算机视觉算法通过识别水尺精准识别水位 随着技术的发展&#xff0c;计算机视觉在多个领域得到了广泛的应用&#xff0c;尤其是在环境监测方面。本文将介绍一种利用计算机视觉算法通过识别水尺来精准识别水位的方法。这种方法可以用于河流、水库等场景的水位监测&…...

C++(进阶) 第1章 继承

C&#xff08;进阶) 第1章 继承 文章目录 前言一、继承1.什么是继承2.继承的使用 二、继承方式1.private成员变量的&#xff08;3种继承方式&#xff09;继承2. private继承方式3.继承基类成员访问⽅式的变化 三、基类和派生类间的转换1.切片 四、 继承中的作⽤域1.隐藏规则&am…...

获国家权威机构认可 亚信安全荣获CNVD技术组支撑单位认证

近日&#xff0c;国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;依据《CNVD管理办法》及《CNVD支撑单位能力要求》&#xff0c;对申请加入考察期的单位进行了全面而严格的能力评估。经过层层筛选与审核&#xff0c;亚信安全凭借卓越的技术实力与专业的服务能力&#xf…...

2. Autogen官网教程 (Terminating Conversations Between Agents)

在这一章中&#xff0c;我们将探讨如何结束自动生成代理之间的对话。 导入必要的库 import osfrom autogen import ConversableAgent配置智能体 我们需要配置智能体使用的语言模型&#xff08;LLM&#xff09;。以下是一个配置示例&#xff1a; llm_config {"config_…...

java 排序 详解

Java 提供了多种方式对数据进行排序&#xff0c;包括数组和集合的排序。排序在日常开发中非常常见&#xff0c;以下将从排序算法的基本原理、Java 中的内置排序方法以及自定义排序三方面进行详解。 1. 排序的基本概念 排序是将一组数据按特定顺序排列的过程&#xff0c;常见顺…...

【数据集】城市通量塔站点观测数据

【数据集】城市通量塔站点观测数据 数据概述数据下载参考数据概述 数据集简介:Harmonized gap-filled dataset from 20 urban flux tower sites 数据集名称:Harmonized gap-filled dataset from 20 urban flux tower sites (用于 Urban-PLUMBER 项目的 20 个城市通量塔站点…...

scau编译原理综合性实验

一、题目要求 题目&#xff1a; 选择部分C语言的语法成分&#xff0c;设计其词法分析程序、语法语义分析程序。 要求&#xff1a; 设计并实现一个一遍扫描的词法语法语义分析程序&#xff0c;将部分C语言的语法成分&#xff08;包含赋值语句、if语句、while循环语句&#xf…...

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…...

表单校验规则

这里简单记录下vue使用表单时候&#xff0c;给表单添加校验规则&#xff0c;直接上代码 <script setup>import { ref } from vue// 定义表单对象const form ref({account: ,password: ,agree: true})// 定义表单验证规则const rules {account: [{required: true, mess…...

接口的扩展

1. 接口中新增的方法 JDK7之前接口中只能定义抽象方法。 JDK8的新特性&#xff1a;接口中可以定义有方法体的方法。&#xff08;默认、静态&#xff09; JDK9的新特性&#xff1a;接口中可以定义有私有方法体的方法。 有方法体的方法&#xff1a;接口升级时&#xff0c;为了兼容…...

新能源电机轴承电腐蚀,如何破?

近年来&#xff0c;随着全球范围内对可再生能源的重视与推动&#xff0c;新能源电机作为新能源汽车、风力发电和太阳能发电等系统的重要组成部分&#xff0c;得到了迅猛的发展。然而&#xff0c;在实际应用中&#xff0c;新能源电机的维护与管理越来越受到关注&#xff0c;其中…...

Java中的File和IO流

File对象 File对象本质是一个文件或文件夹&#xff0c;用于写入和读取文件内容 注意&#xff1a;对于相对路径而言&#xff0c;在单元测试方法中的File是相对于Module&#xff0c;在main中的File是相对于Project 构造器 File(String pathname)File file1 new File("D:…...

ls命令实操笔记

ls命令&#xff1a;全称list&#xff0c;显示文件的文件名与相关属性。&#xff08;目前工作目录所含之文件及子目录&#xff09; 4567 45678 7891 a1b2 a2b3c abcd Abcd acde aD7E bcde 通过ls浏览上述文件所在的目录&#xff0c;实现以下需求&#xff1a; 浏览含…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...