Spring HTTP Streaming
참고: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 디 렉 터 리 로 이동
그림 과 같이 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;
}
}
마지막 결 과 는 폴 링 처럼 일정 시간 간격 으로 이벤트 인 터 페 이 스 를 방문 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
springmvc application/octet-stream problemmistake: Source code: Solution: Summarize: application/octet-stream is the original binary stream method. If the convers...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.