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 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授权码形式集成