【开发篇】十七、消息:模拟订单短信通知

文章目录

相关文章: 【同步通讯与异步通讯】

1、消息

消息的发送方,即生产者。消息的接收方,即消费者。同步通信就行打视频,等着对方接电话才能继续往下,而异步通信就像发消息,发完我就干其他事儿了,啥时候回随你。

这种异步的模式,对应在生产中就是:

2、JMS

JMS(Java Message Service):它是一个规范,等同于JDBC规范,提供了与消息服务相关的API接口

JMS的消息模型有:

  • peer-2-peer:点对点模型,消息发送到一个队列中,队列保存消息。队列的消息只能被一个消费者消费,或超时
  • publish-subscribe:发布订阅模型,消息可以被多个消费者消费,生产者和消费者完全独立,不需要感知对方的存在

JMS的消息种类有:

  • TextMessage
  • MapMessage
  • BytesMessage
  • StreamMessage
  • ObjectMessage
  • Message (只有消息头和属性)

JMS的实现技术有(类比实现JDBC的各个数据库驱动):ActiveMQ、Redis、HornetMQ、RabbitMQ、RocketMQ(没有完全遵守JMS规范)

3、AMQP

AMQP(advanced message queuing protocol):一种协议(高级消息队列协议,也是消息代理规范),规范了网络交换的数据格式,兼容JMS。优点是具有跨平台性,服务器供应商,生产者、消费者可以使用不同的语言来实现

AMQP消息模型有:

  • direct exchange
  • fanout exchange
  • topic exchange
  • headers exchange
  • system exchange

AMQP消息种类有:

  • byte[](byte跨平台,字节哪儿都能通)

AMQP的实现技术有:RabbitMQ、StormMQ、RocketMQ

4、案例:模拟订单短信通知

正常的一个购物订单业务,包含流程很多,比如:

  • 登录状态检测
  • 生成主单
  • 生成子单
  • 库存检测与变更
  • 积分变更
  • 支付
  • 短信通知
  • 购物车维护
  • 运单信息初始化
  • 商品库存维护
  • 会员维护
  • ...

这里模拟下单后给用户异步发送通知短信,先不用MQ,用一个集合模拟MQ来实现这个业务:首先写消息处理的Service层,模拟消费队列中的信息,发送短信给用户

java 复制代码
public interface MessageService {
    /**
     * 模拟往队列里放消息
     * @param id
     */
    void sendMessage(String id);

    /**
     * 模拟取消息,消费
     */
    String  doMessage();
}
java 复制代码
@Service
@Slf4j
public class MessageServiceImpl implements MessageService {

    private List<String> msgQueue = new ArrayList<>();  //用它模拟队列

    @Override
    public void sendMessage(String id) {
        msgQueue.add(id);
        log.info("待发送短信的订单已纳入处理队列,id:" + id);

    }

    @Override
    public String doMessage() {
        String id = msgQueue.remove(0);
        log.info("已完成发送短信业务,订单id:" + id);
        return id;
    }
}

写订单业务的Service层,模拟下单后,把订单编号等信息放到队列中

java 复制代码
public interface OrderService {

    void order(String id);
}
java 复制代码
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Resource
    private MessageService messageService;

    @Override
    public void order(String id) {
        //一系列操作,调用其他服务,处理业务
        //...

        log.info("订单处理开始...");
        //短信消息处理
        messageService.sendMessage(id);
        log.info("订单处理结束...");
        System.out.println(); //换行一下
    }
}

完善下Controller层:

java 复制代码
@RestController
@RequestMapping("/order")
public class OrderController {

    @Resource
    private OrderService orderService;

    @PostMapping("{id}")
    public void order(@PathVariable String id){
        orderService.order(id);
    }
}
java 复制代码
@RestController
@RequestMapping("/msg")
public class MessageController {

    @Resource
    private MessageService messageService;

    @PostMapping
    public String doMsg(){
        return messageService.doMessage();
    }
}

看下效果,调用订单接口,处理业务并且订单编号被扔进队列:

消费,完成短信发送:

再往下是整合各种MQ技术实现消息的发送与接收,分别为:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

对上面的代码,换一个实现类,重写sendMessage和doMessage这两个消息发送与处理的方法,就相当于换了一种MQ的实现技术

相关推荐
毕设源码-邱学长31 分钟前
【开题答辩全过程】以 基于Springboot的酒店住宿信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
gAlAxy...2 小时前
SpringBoot Servlet 容器全解析:嵌入式配置与外置容器部署
spring boot·后端·servlet
李少兄2 小时前
解决 org.springframework.context.annotation.ConflictingBeanDefinitionException 报错
java·spring boot·mybatis
没有bug.的程序员3 小时前
Spring Cloud Alibaba:Nacos 配置中心与服务发现的工业级深度实战
java·spring boot·nacos·服务发现·springcloud·配置中心·alibaba
一路向北⁢3 小时前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(二)
java·数据库·spring boot·sse·通信
好好研究4 小时前
SpringBoot使用外置Tomcat
spring boot·后端·tomcat
lynnlovemin4 小时前
云原生提速秘籍:Spring Boot转Spring Native实战指南
spring boot·spring·云原生·spring native
1candobetter4 小时前
JAVA后端开发——Spring Boot 组件化自动配置机制
java·开发语言·spring boot
索荣荣4 小时前
Spring Boot 实现DOCX转PDF(基于docx4j的轻量级开源方案)
spring boot·后端·pdf
没有bug.的程序员4 小时前
Spring Boot 与 Sleuth:分布式链路追踪的集成、原理与线上故障排查实战
java·spring boot·分布式·后端·分布式链路追踪·sleuth·线上故障排查