Spring Http流 (服务端推送技术)

 */
@RestController
public class TestController {

    /**
     * HTTP 流 用于在Http相应中同时推送多个事件
     * 该对象可以被用于发送多个对象,
     * 通常我们使用到的@ResponseBody只能返回一个对象
     * 访问http://127.0.0.1:8886/get6 客户端等待,
     * 直到访问http://127.0.0.1:8886/get5中执行emitter.complete()才一次性返回
     */
    private ResponseBodyEmitter emitter;

    @GetMapping(value = "/get6")
    public ResponseBodyEmitter get6() {
        ResponseBodyEmitter emitter = new ResponseBodyEmitter();
        this.emitter = emitter;
        return emitter;
    }

    @GetMapping(value = "/get5")
    public void get5() throws IOException {
        if (Objects.nonNull(emitter)) {
            /**
             * 写入流
             */
            emitter.send(" hello world");
            emitter.send(" fang qi ming");
            /**
             * 此方法被调用后,一次性返回
             */
            emitter.complete();
        }
    }


    /**
     * 使用服务发送事件的Http流
     * SseEmitter是ResponseBodyEmitter的一个子类,
     * 提供了对服务端事件推送的技术支持,但是InternetExplorer(IE)
     * 并不支持这种服务端的事件推送技术,在在线游戏,在线协作,金融应用
     * 来说,使用WebSocket STOMP是更好的选择
     */
    private SseEmitter sseEmitter;

    @GetMapping(value = "/get7")
    public SseEmitter get7() {
        SseEmitter sseEmitter = new SseEmitter();
        this.sseEmitter = sseEmitter;
        return sseEmitter;
    }


    @GetMapping(value = "/get8")
    public void get8() throws IOException {
        if (Objects.nonNull(sseEmitter)) {
            /**
             * 写入流并发送,此时客户端收到消息,但仍旧等待消息
             */
            sseEmitter.send(" hello world");
            /**
             * 写入流并发送,此时客户端再次收到消息,但仍旧等待消息
             */
            sseEmitter.send(" fang qi ming");
            /**
             * 客户端接受到服务端消息发送完毕,连接断开
             */
            sseEmitter.complete();
        }
    }


    /**
     * 有时候,跳过消息转换的阶段,直接把数据写回响应的输出流OutputStream可能更有效
     * 比如文件下载 这是可以通过返回一个StreamingResponseBody类型的对象来实现
     *
     * @return
     */
    @GetMapping(value = "/download")
    public StreamingResponseBody get9(){
        return outputStream -> {
            //write...
        };
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值