Spring HTTP Streaming

4410 단어 springmvchttp
참고:https://www.jianshu.com/p/ecc6f5168aef
참고:https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/http_streaming.html
프로필:
컨트롤 러 는 DeferredResult 또는 Callable 대상 을 사용 하여 반환 값 을 비동기 적 으로 계산 할 수 있다. 이것 은 유용 한 기술 을 실현 하 는 데 사용 할 수 있다. 예 를 들 어 롱 폴 링 기술 은 서버 가 가능 한 한 빨리 클 라 이언 트 에 이 벤트 를 전송 할 수 있 도록 합 니 다.
HTTP 응답 에서 여러 이 벤트 를 동시에 푸 시 하려 면 어떻게 합 니까?이러한 기술 은 이미 존재 하 는데 'Long Polling' 과 관련 된 것 을 'HTTP Streaming' 이 라 고 부른다.
Spring MVC 는 이 기술 을 지원 합 니 다. 하나의 ResponseBodyEmitter 유형 대상 을 되 돌려 주 는 방법 으로 이 루어 집 니 다. 이 대상 은 여러 대상 을 보 내 는 데 사 용 될 수 있 습 니 다.일반적으로 우리 가 사용 하 는 @ResponseBody 대상 만 되 돌려 줄 수 있 습 니 다. 그것 은 HttpMessageConverter 을 통 해 응답 체 에 기 록 됩 니 다.
실체:
1. ResponseBodyEmitter
2. SseEmitter
예:
@RequestMapping("/test")
    public ResponseBodyEmitter test() {
        ResponseBodyEmitter emitter = new ResponseBodyEmitter();
        ExecutorService service = Executors.newSingleThreadExecutor();
//        ExecutorService service = Executors.newFixedThreadPool(10);
        service.execute(()-> {
            for (int i = 0; i < 100 ; i++) {
                try {
                    emitter.send(i+"-", MediaType.ALL);
                    Thread.sleep(100L);
                } catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                    emitter.completeWithError(e);
                    return;
                }
            }
            emitter.complete();
        });

        return emitter;
    }

2. SseEmitter 와 대응 하 는 HTML 5 의 Server - Sent Events 특성 이 서로 대응 되 어야 sse 채널 은 서버 측 이 자발적으로 클 라 이언 트 에 데 이 터 를 전송 할 수 있 습 니 다.
참고:https://www.cnblogs.com/elonlee/p/3914704.html
예:
package com.kzcm.controller;

import com.kzcm.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("index")
public class IndexController {


    @RequestMapping("testSse")
    public String testSse(ModelMap model) {
        String path = "index/ssedemo";
//        model.addAttribute("name", name);
        return path;
    }
}

index / ssedemo 디 렉 터 리 로 이동
Spring HTTP Streaming_第1张图片
그림 과 같이 EventSource 접근 경 로 는 / async / testse 입 니 다.
package com.kzcm.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.async.DeferredResult;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.time.LocalTime;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Controller
@RequestMapping("/async")
public class AsyncController {


    

    @RequestMapping("/testSse")
    public SseEmitter testSse() {
        SseEmitter emitter = new SseEmitter();
        ExecutorService service = Executors.newSingleThreadExecutor();
//        ExecutorService service = Executors.newFixedThreadPool(10);
        service.execute(()-> {
            for (int i = 0; i < 5 ; i++) {
                try {
                    emitter.send(LocalTime.now().toString(), MediaType.ALL);
                    Thread.sleep(10);
                } catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                    emitter.completeWithError(e);
                    return;
                }
            }
            emitter.complete();
        });

        return emitter;
    }
}

마지막 결 과 는 폴 링 처럼 일정 시간 간격 으로 이벤트 인 터 페 이 스 를 방문 합 니 다.

좋은 웹페이지 즐겨찾기