下单消息的发送和接收案例
生活随笔
收集整理的這篇文章主要介紹了
下单消息的发送和接收案例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
案例
接下來我們模擬一種場(chǎng)景: 下單成功之后,向下單用戶發(fā)送短信。設(shè)計(jì)圖如下:
訂單微服務(wù)發(fā)送消息
1 在shop-order 中添加rocketmq的依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="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"><parent><artifactId>springcloud-alibaba</artifactId><groupId>com.leon</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>shop-order</artifactId><dependencies> <!--rocketmq--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.4.0</version></dependency></dependencies></project>2 添加配置
#rocketmq rocketmq:name-server: 192.168.109.131:9876 #rocketMQ服務(wù)的地址producer:group: shop-order # 生產(chǎn)者組3 編寫測(cè)試代碼
package com.leon.controller;import com.alibaba.fastjson.JSON; import com.leon.domain.Order; import com.leon.domain.Product; import com.leon.service.OrderService; import com.leon.service.ProductService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.messaging.support.MessageBuilder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;import java.util.List; import java.util.Random;//@RestController @Slf4j public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate OrderService orderService;@Autowiredprivate ProductService productService;@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate RocketMQTemplate rocketMQTemplate;//下單--fegin@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {log.info("接收到{}號(hào)商品的下單請(qǐng)求,接下來調(diào)用商品微服務(wù)查詢此商品信息", pid);//調(diào)用商品微服務(wù),查詢商品信息Product product = productService.findByPid(pid);if (product.getPid() == -100) {Order order = new Order();order.setOid(-100L);order.setPname("下單失敗");return order;}log.info("查詢到{}號(hào)商品的信息,內(nèi)容是:{}", pid, JSON.toJSONString(product));//下單(創(chuàng)建訂單)Order order = new Order();order.setUid(1);order.setUsername("測(cè)試用戶");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info("創(chuàng)建訂單成功,訂單信息為{}", JSON.toJSONString(order));//向mq中投遞一個(gè)下單成功的消息//參數(shù)一: 指定topic//參數(shù)二: 指定消息體rocketMQTemplate.convertAndSend("order-topic", order);return order;}}用戶微服務(wù)訂閱消息
1 修改shop-user 模塊配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="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"><parent><artifactId>springcloud-alibaba</artifactId><groupId>com.leon</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>shop-user</artifactId><dependencies><!--springboot-web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--shop-common--><dependency><groupId>com.leon</groupId><artifactId>shop-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.4.0</version></dependency><!--短信發(fā)送--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alicloud-sms</artifactId></dependency></dependencies></project>2 修改主類
package com.leon;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication @EnableDiscoveryClient public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class);} }3 修改配置文件
server:port: 8071 spring:application:name: service-userdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: rootjpa:properties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5InnoDBDialectcloud:nacos:discovery:server-addr: 127.0.0.1:8848 #rocketmq rocketmq:name-server: 192.168.109.131:98764 編寫消息接收服務(wù)
package com.leon.service;import com.alibaba.fastjson.JSON; import com.leon.dao.UserDao; import com.leon.domain.Order; import com.leon.domain.User; import com.leon.utils.SmsUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.ConsumeMode; import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.Random;@Slf4j @Service("shopSmsService") //consumerGroup-消費(fèi)者組名 topic-要消費(fèi)的主題 @RocketMQMessageListener(consumerGroup = "shop-user", //消費(fèi)者組名topic = "order-topic",//消費(fèi)主題consumeMode = ConsumeMode.CONCURRENTLY,//消費(fèi)模式,指定是否順序消費(fèi) CONCURRENTLY(同步,默認(rèn)) ORDERLY(順序)messageModel = MessageModel.CLUSTERING//消息模式 BROADCASTING(廣播) CLUSTERING(集群,默認(rèn)) ) public class SmsService implements RocketMQListener<Order> {@Autowiredprivate UserDao userDao;//消費(fèi)邏輯@Overridepublic void onMessage(Order message) {log.info("接收到了一個(gè)訂單信息{},接下來就可以發(fā)送短信通知了", message);//根據(jù)uid 獲取手機(jī)號(hào)User user = userDao.findById(message.getUid()).get();//生成驗(yàn)證碼 1-9 6StringBuilder builder = new StringBuilder();for (int i = 0; i < 6; i++) {builder.append(new Random().nextInt(9) + 1);}String smsCode = builder.toString();Param param = new Param(smsCode);try {//發(fā)送短信 {"code":"123456"}SmsUtil.sendSms(user.getTelephone(), "黑馬旅游網(wǎng)", "SMS_170836451", JSON.toJSONString(param));log.info("短信發(fā)送成功");} catch (Exception e) {e.printStackTrace();}}@Data@AllArgsConstructor@NoArgsConstructorclass Param {private String code;} }5 啟動(dòng)服務(wù),執(zhí)行下單操作,觀看后臺(tái)輸出
?
總結(jié)
以上是生活随笔為你收集整理的下单消息的发送和接收案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现消息消费
- 下一篇: 消息类型-普通消息