`
wiselyman
  • 浏览: 2093848 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82322
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130781
社区版块
存档分类
最新评论

使用SseEmitter,Spring Event推送数据(SpringBoot2.0)

 
阅读更多

 

1.场景

当我们做异步请求处理的时候,客户端向服务端的请求不是立即返回的,而是在服务端有数据的时候才发送给客户端的。本例演示是服务端数据是另外的事件触发并推送给客户端的。

当使用微信或者支付宝扫码支付的时候,在客户支付成功之后,后台得到微信(支付宝)回调需要通知我们的客户端支付已经完成,客户端得到通知后可以做一些后续的操作。
这涉及到后台需要将支付成功的消息主动推送给客户端,让客户端记性后续的操作。

  • 客户端向后台(SseController->push)发送异步请求,客户端处于监听等待状态;
  • 微信(支付宝)支付成功后回调后台(SseController->payCallback模拟);
  • payCallback方法通过applicationContext.publishEvent向系统内部发送支付完成事件;
  • push方法通过payCompletedListener监听事件并通过SseEmitter发送给客户端。

名词解释:SSEserver 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,模拟回调通知客户端支付成功,这是会通知上一步并推送到客户端.

6.源码地址

http://www.wisely.top/2018/03/01/sse-eventlistener/

0
0
分享到:
评论

相关推荐

    springBoot2.0整合webSocket 服务器主动推送数据到前端,并且弹框提示带有音乐提醒

    本教程将深入探讨如何在SpringBoot 2.0版本中整合WebSocket,以实现服务器主动向前端推送数据,并且当消息到达时,前端能够进行声音提示和弹框提醒。 首先,我们需要理解WebSocket的基本概念。WebSocket是一种在...

    springboot2.0整合Shiro

    综上所述,SpringBoot 2.0 整合 Shiro 主要涉及以下几个步骤:添加Shiro依赖、配置Shiro主配置类、创建自定义Realm、处理用户、权限和角色的关系,以及使用Shiro注解进行权限控制。通过这样的集成,我们可以构建出一...

    springboot 2.0学习视频

    我把我之前买的spring boot 2.0的学习视频发出来,也省得大家去买课程看了。

    搭建基于Springboot2.0,Druid 1.1,Jpa demo

    这是一个基于Spring 2.0,基于Mysql8.0,Springboot2.0,Druid 1.1,Jpa demo搭建的,本资源对应的博客链接https://blog.csdn.net/qq_37925580/article/details/88398066

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO层使用`HibernateDaoSupport`进行操作,而非使用JPA(Java Persistence API)。 首先,让我们了解Spring Boot 2.0的...

    采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统.zip

    采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用SpringBoot2.0、MyBatis-Plus、Shiro框架,开发的一套权限系统 采用...

    springboot2.0.x+dubbo-spring-boot-starter

    标题 "springboot2.0.x+dubbo-spring-boot-starter" 涉及的是将流行的微服务框架 Dubbo 集成到 Spring Boot 2.0.x 的项目实践中。这个集成使得开发者能够利用 Spring Boot 的便利性和 Dubbo 的高性能远程服务调用...

    springboot2.0版本中文文档

    SpringBoot2.0版本是该框架的一个重要里程碑,引入了许多新特性、改进和性能优化,使得开发者能更高效地构建基于Spring的应用程序。 在SpringBoot2.0中,最显著的变化是对Spring Framework 5.0的支持。Spring 5带来...

    springbatch+springboot2.0

    springboot2.0中使用java配置来实现springbatch,摒弃之前的xml文件配置。

    springboot2.0整合quartz

    本篇文章将详细探讨如何在Spring Boot 2.0项目中整合Quartz,以及这种方式的优势。 首先,让我们了解Spring Boot 2.0的特性。Spring Boot 2.0带来了许多改进,包括性能优化、对Java 9的支持、更新依赖项到最新版本...

    springBoot2.0完整例子

    SpringBoot2.0是一个强大的Java框架,由Pivotal团队维护,它简化了Spring应用程序的初始设置和开发过程。这个“springBoot2.0完整例子”涵盖了从前端到后端的整个开发流程,旨在帮助开发者快速理解和应用SpringBoot...

    springboot2.0整合fastjson以及各种使用实例

    总的来说,SpringBoot 2.0结合Fastjson的使用,极大地提高了JSON处理的效率和便捷性,使得在开发过程中,数据交换变得更加简单和高效。在实际项目中,开发者可以根据需求进一步优化配置,以适应各种复杂的JSON处理...

    springboot2.0+jpa+mysql

    综上所述,"springboot2.0+jpa+mysql" 的整合涉及到 Spring Boot 框架的自动配置能力、JPA 的 ORM 机制以及 MySQL 数据库的连接与操作。这三者的结合使得开发人员能快速构建基于 Java 的数据驱动应用程序,同时保持...

    SpringBoot2.0+SpringCloud+redis集群搭建的仿悦诗风吟旗舰网站

    SpringBoot2.0+SpringCloud+redis集群搭建的仿悦诗风吟旗舰网站 项目描述 SpringBoot2.0+SpringCloud搭建的仿悦诗风吟旗舰网站,整合了Mybatis、Redis集群、druid等技术,采用分布式架构,面向服务的思想,该项目...

    友盟消息推送Java springboot

    以上就是在Java SpringBoot项目中集成友盟消息推送服务的基本步骤,以及如何使用Redis来限制推送次数。在实际开发中,还需要考虑异常处理、日志记录、性能优化等细节,以确保服务的稳定性和用户体验。

    SpringBoot2.0文档代码

    SpringBoot2.0是Java开发领域的一个里程碑,它极大地简化了Spring应用的初始搭建以及开发过程。本资源包含了SpringBoot2.0的文档代码及蚂蚁课堂(每特教育出品)的教学内容,旨在帮助开发者深入理解和实践这个强大的...

    springboot2.0

    SpringBoot 2.0 是一个基于 Spring Framework 的简化启动器,旨在简化开发流程,通过自动配置、嵌入式服务器和约定优于配置的原则,使得创建独立的、生产级别的基于 Spring 应用程序变得容易。在本项目中,它与多个...

    RESTFUL的实现-springboot2.0版本

    总结来说,实现一个基于Spring Boot 2.0的RESTful API,需要配置正确的依赖,定义控制器来处理HTTP请求,使用JSON库进行数据交换,并编写测试来验证API的行为。在实际应用中,我们还需要考虑安全性(如OAuth2或JWT)...

    SpringBoot2.0+Vue3.0前后端分离wiki文件管理系统源码.zip

    SpringBoot2.0是基于Spring Framework 5构建的轻量级开发框架,它简化了Spring应用的初始搭建以及开发过程。SpringBoot的核心特性包括自动配置、起步依赖、内嵌Web服务器等,使得开发者可以快速地创建独立运行的、...

    2021年springboot2.0 入门到精通

    开发SpringBoot 2.0应用,至少需要Java 1.8及以上的版本,以及Spring Framework 5.0以上的版本。本课程中使用的是Java 1.8和SpringBoot 2.1.8版本。 **1.2 SpringBoot与SpringMVC的区别** SpringBoot是一个快速...

Global site tag (gtag.js) - Google Analytics