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
,模拟回调通知客户端支付成功,这是会通知上一步并推送到客户端.
相关推荐
通过SpringBoot2.0整合WebSocket实现服务器主动推送消息到前端,并且前端接收到消息后会进行消息声音弹框提醒。
springboot2.0多数据源集成hibernate配置hibernateDaoSupport, dao层继承hibernateDaoSupport, 不使用jpa方式。
springboot2.0整合Shiro 。权限配置,user/permission/role
我把我之前买的spring boot 2.0的学习视频发出来,也省得大家去买课程看了。
springboot2.0整合quartz,采用 spring-boot-starter-quartz方式,更为简单方式
这是一个基于Spring 2.0,基于Mysql8.0,Springboot2.0,Druid 1.1,Jpa demo搭建的,本资源对应的博客链接https://blog.csdn.net/qq_37925580/article/details/88398066
采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用...
dubbo官方最新springboot2.0.x集成dubbo2.6.例子(springboot+com.alibaba.boot)
springboot2.0中使用java配置来实现springbatch,摒弃之前的xml文件配置。
基于SpringBoot2.0 + Spring Data Jpa + Thymeleaf + Shiro 开发的后台管理系统,采用分模块的方式便于开发和维护,支持前后台模块分别部署,目前支持的功能有:权限管理、部门管理、字典管理、日志记录、文件上传、...
SpringBoot2.0+SpringCloud+redis集群搭建的仿悦诗风吟旗舰网站 项目描述 SpringBoot2.0+SpringCloud搭建的仿悦诗风吟旗舰网站,整合了Mybatis、Redis集群、druid等技术,采用分布式架构,面向服务的思想,该项目...
基于SpringBoot2.0的后台权限管理系统界面简洁美观敏捷开发系统架构。核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。 互联网云快速开发框架,微服务分布式代码生成的敏捷开发系统架构。项目代码简洁,注释...
springboot2.0整合fastjson实例配置,在测试类中有各种fastjson的使用,序列化反序列化,以及jsonObject与jsonarray的使用,具体测试方法在测试类中
SpringBoot2.0+SpringSecurity5.1.5.RELEASE+MybatisPlus3.1.1的基础登陆代码 登陆账号123 密码123 密码使用springsecruity提供的加密方式加密 前端使用thymeleaf+bootstrap 提供登陆后成功页面 sql文件在db下 仅供...
可以使用一个@SpringBootApplication注解来启用这三个特性,即:@EnableAutoConfiguration:SpringBoot 2.0
springboot2.0+mybatis主从数据库双数据源,测试了事务,事务是单独分开的。回滚只回滚主库的事务。
SpringBoot2.0+SpringCloud搭建的旗舰网站,整合了Mybatis、Redis集群、druid等技术,采用分布式架构,面向服务的思想,该项目是自己在学习SpringBoot和SpringCloud时自己写的一个项目,做了用户登录注册,商品的...
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot...
在springboot2.0中如何使用prometheus插件,及对springboor2.0-actuator包的介绍,以及如何扩展promehtues里的监控指标。
springboot 集成oauth2.0服务器,基于oauth2.0授权码形式集成