我用网关uaa和微服务生成了jhipster应用程序。现在运行sse我添加了以下控制器
@RestController
@RequestMapping("/api")
public class AvgResultNftController {
private final CopyOnWriteArrayList<SseEmitter> emitters = new CopyOnWriteArrayList<>();
@GetMapping(path = "/avgResultNft")
public SseEmitter getAvgResultNft() {
SseEmitter emitter = new SseEmitter();
this.emitters.add(emitter);
emitter.onCompletion(() -> this.emitters.remove(emitter));
emitter.onTimeout(() -> {
emitter.complete();
this.emitters.remove(emitter);
});
return emitter;
}
@SuppressWarnings("unlikely-arg-type")
@EventListener
public void onAvgResultNft(AvgResultNft avgResultNft) {
List<SseEmitter> deadEmitters = new ArrayList<>();
this.emitters.forEach(emitter -> {
try {
emitter.send(avgResultNft);
} catch (Exception e) {
deadEmitters.add(emitter);
}
});
this.emitters.remove(deadEmitters);
}
}
我在某些事件上发布了AvgResultNft。
我已生成角度应用程序并调用控制器
let source = new EventSource('http://192.168.1.5:8080/proxta/api/avgResultNft', {withCredentials: true })
source.addEventListener('message', message => {
console.log(message)
});
我在调用eventSource时遇到406不可接受的错误。请帮忙。
我认为它可以帮助你添加headers = "Accept=*/*"
和produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
或MediaType.APPLICATION_STREAM_JSON_VALUE
@GetMapping(value = "/avgResultNft", headers = "Accept=*/*",
produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public SseEmitter getAvgResultNft() {
SseEmitter emitter = new SseEmitter();
this.emitters.add(emitter);
emitter.onCompletion(() -> this.emitters.remove(emitter));
emitter.onTimeout(() -> {
emitter.complete();
this.emitters.remove(emitter);
});
return emitter;
}
但要小心,zuul1.х不支持sse
How to make Server sent events (SSE) work trough Zuul Proxy spring-boot 2.1.1