1.场景
当我们做异步请求处理的时候,客户端向服务端的请求不是立即返回的,而是在服务端有数据的时候才发送给客户端的。本例演示是服务端数据是另外的事件触发并推送给客户端的。
当使用微信或者支付宝扫码支付的时候,在客户支付成功之后,后台得到微信(支付宝)回调需要通知我们的客户端支付已经完成,客户端得到通知后可以做一些后续的操作。
这涉及到后台需要将支付成功的消息主动推送给客户端,让客户端记性后续的操作。
- 客户端向后台(
SseController
->push
)发送异步请求,客户端处于监听等待状态; - 微信(支付宝)支付成功后回调后台(
SseController
->payCallback
模拟); -
payCallback
方法通过applicationContext.publishEvent
向系统内部发送支付完成事件; -
push
方法通过payCompletedListener
监听事件并通过SseEmitter
发送给客户端。
名词解释:SSE
–server send event
是一种服务端推送的技术,本例使用SseEmitter
来实现。
2.SseController
@RestController
public class SseController {
@Autowired
ApplicationContext applicationContext;
@Autowired
PayCompletedListener payCompletedListener;
@GetMapping("/push")
public SseEmitter push(@RequestParam Long payRecordId){
final SseEmitter emitter = new SseEmitter();
try {
payCompletedListener.addSseEmitters(payRecordId,emitter);
}catch (Exception e){
emitter.completeWithError(e);
}
return emitter;
}
@GetMapping("/pay-callback")
public String payCallback(@RequestParam Long payRecordId){
applicationContext.publishEvent(new PayCompletedEvent(this,payRecordId));
return "请到监听处查看消息";
}
}
3.PayCompletedEvent
@Getter
@Setter
public class PayCompletedEvent extends ApplicationEvent {
private Long payRecordId;
public PayCompletedEvent(Object source, Long payRecordId) {
super(source);
this.payRecordId = payRecordId;
}
}
4.PayCompletedListener
@Component
public class PayCompletedListener {
private static Map<Long,SseEmitter> sseEmitters = new Hashtable<>();
public void addSseEmitters(Long payRecordId, SseEmitter sseEmitter) {
sseEmitters.put(payRecordId, sseEmitter);
}
@EventListener
public void deployEventHandler(PayCompletedEvent payCompletedEvent) throws IOException {
Long payRecordId = payCompletedEvent.getPayRecordId();
SseEmitter sseEmitter = sseEmitters.get(payRecordId);
sseEmitter.send("支付成功");
sseEmitter.complete();
}
}
5.演示
- 先访问
http://localhost:8080/push?payRecordId=123
,此时客户端处于等待状态.
- 再访问
http://localhost:8080/pay-callback?payRecordId=123
,模拟回调通知客户端支付成功,这是会通知上一步并推送到客户端.
相关推荐
本教程将深入探讨如何在SpringBoot 2.0版本中整合WebSocket,以实现服务器主动向前端推送数据,并且当消息到达时,前端能够进行声音提示和弹框提醒。 首先,我们需要理解WebSocket的基本概念。WebSocket是一种在...
综上所述,SpringBoot 2.0 整合 Shiro 主要涉及以下几个步骤:添加Shiro依赖、配置Shiro主配置类、创建自定义Realm、处理用户、权限和角色的关系,以及使用Shiro注解进行权限控制。通过这样的集成,我们可以构建出一...
我把我之前买的spring boot 2.0的学习视频发出来,也省得大家去买课程看了。
这是一个基于Spring 2.0,基于Mysql8.0,Springboot2.0,Druid 1.1,Jpa demo搭建的,本资源对应的博客链接https://blog.csdn.net/qq_37925580/article/details/88398066
本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO层使用`HibernateDaoSupport`进行操作,而非使用JPA(Java Persistence API)。 首先,让我们了解Spring Boot 2.0的...
采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用...
标题 "springboot2.0.x+dubbo-spring-boot-starter" 涉及的是将流行的微服务框架 Dubbo 集成到 Spring Boot 2.0.x 的项目实践中。这个集成使得开发者能够利用 Spring Boot 的便利性和 Dubbo 的高性能远程服务调用...
SpringBoot2.0版本是该框架的一个重要里程碑,引入了许多新特性、改进和性能优化,使得开发者能更高效地构建基于Spring的应用程序。 在SpringBoot2.0中,最显著的变化是对Spring Framework 5.0的支持。Spring 5带来...
springboot2.0中使用java配置来实现springbatch,摒弃之前的xml文件配置。
本篇文章将详细探讨如何在Spring Boot 2.0项目中整合Quartz,以及这种方式的优势。 首先,让我们了解Spring Boot 2.0的特性。Spring Boot 2.0带来了许多改进,包括性能优化、对Java 9的支持、更新依赖项到最新版本...
SpringBoot2.0是一个强大的Java框架,由Pivotal团队维护,它简化了Spring应用程序的初始设置和开发过程。这个“springBoot2.0完整例子”涵盖了从前端到后端的整个开发流程,旨在帮助开发者快速理解和应用SpringBoot...
总的来说,SpringBoot 2.0结合Fastjson的使用,极大地提高了JSON处理的效率和便捷性,使得在开发过程中,数据交换变得更加简单和高效。在实际项目中,开发者可以根据需求进一步优化配置,以适应各种复杂的JSON处理...
综上所述,"springboot2.0+jpa+mysql" 的整合涉及到 Spring Boot 框架的自动配置能力、JPA 的 ORM 机制以及 MySQL 数据库的连接与操作。这三者的结合使得开发人员能快速构建基于 Java 的数据驱动应用程序,同时保持...
SpringBoot2.0+SpringCloud+redis集群搭建的仿悦诗风吟旗舰网站 项目描述 SpringBoot2.0+SpringCloud搭建的仿悦诗风吟旗舰网站,整合了Mybatis、Redis集群、druid等技术,采用分布式架构,面向服务的思想,该项目...
以上就是在Java SpringBoot项目中集成友盟消息推送服务的基本步骤,以及如何使用Redis来限制推送次数。在实际开发中,还需要考虑异常处理、日志记录、性能优化等细节,以确保服务的稳定性和用户体验。
SpringBoot2.0是Java开发领域的一个里程碑,它极大地简化了Spring应用的初始搭建以及开发过程。本资源包含了SpringBoot2.0的文档代码及蚂蚁课堂(每特教育出品)的教学内容,旨在帮助开发者深入理解和实践这个强大的...
SpringBoot 2.0 是一个基于 Spring Framework 的简化启动器,旨在简化开发流程,通过自动配置、嵌入式服务器和约定优于配置的原则,使得创建独立的、生产级别的基于 Spring 应用程序变得容易。在本项目中,它与多个...
总结来说,实现一个基于Spring Boot 2.0的RESTful API,需要配置正确的依赖,定义控制器来处理HTTP请求,使用JSON库进行数据交换,并编写测试来验证API的行为。在实际应用中,我们还需要考虑安全性(如OAuth2或JWT)...
SpringBoot2.0是基于Spring Framework 5构建的轻量级开发框架,它简化了Spring应用的初始搭建以及开发过程。SpringBoot的核心特性包括自动配置、起步依赖、内嵌Web服务器等,使得开发者可以快速地创建独立运行的、...
开发SpringBoot 2.0应用,至少需要Java 1.8及以上的版本,以及Spring Framework 5.0以上的版本。本课程中使用的是Java 1.8和SpringBoot 2.1.8版本。 **1.2 SpringBoot与SpringMVC的区别** SpringBoot是一个快速...