上海交通大学直博预推免全攻略:从信息战到面试实战的深度解析
2026/6/26 9:24:05
firewall-cmd --add-port=9876/tcp--permanentfirewall-cmd --add-port=10911/tcp--permanentfirewall-cmd--reload# 查看放行端口firewall-cmd --list-portsmkdir-p/usr/local/rocketmqcd/usr/local/rocketmqrocketmq-all-5.1.4-bin-release.zip,上传服务器unziprocketmq-all-5.1.4-bin-release.zipmvrocketmq-all-5.1.4-bin-release rocketmq5.1.4cdrocketmq5.1.4# 配置临时环境变量exportROCKETMQ_HOME=/usr/local/rocketmq/rocketmq5.1.4vimbin/runserver.sh# 找到JAVA_OPT,修改内存参数JAVA_OPT="${JAVA_OPT}-Xms256m -Xmx256m -Xmn128m"vimbin/runbroker.shJAVA_OPT="${JAVA_OPT}-Xms256m -Xmx256m -Xmn128m"vimconf/broker.conf# 文件末尾追加配置aclEnable=trueautoCreateTopicEnable=true# 外网访问填写服务器公网IP,内网填内网IPbrokerIP1=120.xx.xx.xxconf/plain_acl.ymlaccounts:# 运维管理员账号-accessKey:mq_adminsecretKey:Admin@2026RmqwhiteRemoteAddress:127.0.0.1admin:true# Java业务应用连接账号(代码中使用)-accessKey:app_mq_usersecretKey:App@666888whiteRemoteAddress:0.0.0.0admin:falsedefaultTopicPerm:DENYdefaultGroupPerm:DENY# 仅允许操作普通消息Topic:发布+订阅topicPerms:-"order_msg_topic=PUB|SUB"groupPerms:-"order-consumer-group=SUB"globalWhiteRemoteAddresses:-127.0.0.1accessKey=用户名,secretKey=密码,修改保存后重启Broker生效
进入MQ根目录执行:cd /usr/local/rocketmq/rocketmq5.1.4
# 后台启动NameServernohupshbin/mqnamesrv&# 查看启动日志,输出 boot success 代表成功tail-f~/logs/rocketmqlogs/namesrv.log# 启动Broker,替换为你的服务器IPnohupshbin/mqbroker-n120.xx.xx.xx:9876&tail-f~/logs/rocketmqlogs/broker.logshbin/mqshutdown brokershbin/mqshutdown namesrv# 1.停止服务shbin/mqshutdown brokershbin/mqshutdown namesrvsleep5# 2.重新启动nohupshbin/mqnamesrv&sleep3nohupshbin/mqbroker-n120.xx.xx.xx:9876&场景说明:下单后发送即时异步消息,消费者接收消息执行业务(短信通知、库存扣减、日志记录等)
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/></parent><groupId>com.mq</groupId><artifactId>rocketmq-normal-demo</artifactId><version>1.0.0</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- web测试接口 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- RocketMQ starter 支持ACL鉴权 --><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.3</version></dependency><!-- JSON序列化 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.32</version></dependency></dependencies></project>spring:application:name:rocketmq-normal-demorocketmq:# 替换为你的服务器公网/内网IPname-server:120.xx.xx.xx:9876producer:group:order-producer-group# ACL账号密码(与plain_acl.yml配置一致)access-key:app_mq_usersecret-key:App@666888send-message-timeout:5000packagecom.mq.entity;importlombok.Data;@DatapublicclassOrderMsg{// 订单编号privateStringorderNo;// 用户IDprivateLonguserId;// 订单金额privateDoubleamount;// 消息备注privateStringremark;}packagecom.mq.service;importcom.alibaba.fastjson2.JSON;importcom.mq.entity.OrderMsg;importorg.apache.rocketmq.spring.core.RocketMQTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassOrderProducer{@AutowiredprivateRocketMQTemplaterocketMQTemplate;// 普通消息TopicprivatestaticfinalStringTOPIC_NAME="order_msg_topic";/** * 发送普通同步即时消息 */publicvoidsendOrderMsg(OrderMsgorderMsg){try{// 同步发送,等待broker返回发送成功rocketMQTemplate.syncSend(TOPIC_NAME,orderMsg);System.out.println("订单消息发送成功,订单号:"+orderMsg.getOrderNo());}catch(Exceptione){e.printStackTrace();thrownewRuntimeException("发送订单消息失败");}}}packagecom.mq.consumer;importcom.alibaba.fastjson2.JSON;importcom.mq.entity.OrderMsg;importorg.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;importorg.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;importorg.apache.rocketmq.common.message.MessageExt;importorg.apache.rocketmq.spring.annotation.RocketMQMessageListener;importorg.springframework.stereotype.Component;importjava.util.List;@Component@RocketMQMessageListener(topic="order_msg_topic",consumerGroup="order-consumer-group")publicclassOrderConsumerimplementsMessageListenerConcurrently{@OverridepublicConsumeConcurrentlyStatusconsumeMessage(List<MessageExt>msgs,org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContextcontext){for(MessageExtmsg:msgs){try{// 解析消息体Stringbody=newString(msg.getBody());OrderMsgorderMsg=JSON.parseObject(body,OrderMsg.class);System.out.println("===== 收到订单消息 =====");System.out.println("订单号:"+orderMsg.getOrderNo());System.out.println("用户ID:"+orderMsg.getUserId());System.out.println("订单金额:"+orderMsg.getAmount());// 业务逻辑:// 1. 发送下单短信通知用户// 2. 异步扣减库存// 3. 记录订单操作日志// 4. 推送订单消息给运营后台// 消费成功,告知Broker删除本条消息returnConsumeConcurrentlyStatus.CONSUME_SUCCESS;}catch(Exceptione){e.printStackTrace();// 消费异常,返回重试,Broker自动重试3次returnConsumeConcurrentlyStatus.RECONSUME_LATER;}}returnConsumeConcurrentlyStatus.CONSUME_SUCCESS;}}packagecom.mq.controller;importcom.mq.entity.OrderMsg;importcom.mq.service.OrderProducer;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.UUID;@RestControllerpublicclassMqTestController{@AutowiredprivateOrderProducerorderProducer;/** * 测试发送普通订单消息 * 访问地址:http://127.0.0.1:8080/send/order?userId=10001&amount=99.9 */@GetMapping("/send/order")publicStringsendOrderMsg(@RequestParamLonguserId,@RequestParamDoubleamount){OrderMsgmsg=newOrderMsg();// 生成唯一订单号StringorderNo="ORD"+UUID.randomUUID().toString().substring(0,10);msg.setOrderNo(orderNo);msg.setUserId(userId);msg.setAmount(amount);msg.setRemark("用户下单异步通知消息");orderProducer.sendOrderMsg(msg);return"消息发送完成,订单号:"+orderNo;}}packagecom.mq;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassRocketMqNormalApplication{publicstaticvoidmain(String[]args){SpringApplication.run(RocketMqNormalApplication.class,args);}}http://localhost:8080/send/order?userId=10001&amount=199.5