如何讓 EventSource.onmessage 作業?
這是我的訂閱和推送事件代碼:
public SseEmitter subscribe() throws Exception {
SseEmitter emitter = new SseEmitter(1800000L);
emitters.add(emitter);
emitter.onCompletion(() -> {
synchronized (emitters) {
emitters.remove(emitter);
}
});
emitter.onTimeout(() -> {
emitter.complete();
emitters.remove(emitter);
});
return emitter;
}
@Async
public void pushEventMap(Map<String, Object> pushMap) throws IOException {
List<SseEmitter> deadEmitters = new ArrayList<>();
HashMap<String,Object> map = (HashMap<String,Object>) pushMap;
emitters.forEach(emitter -> {
try {
emitter.send(SseEmitter.event().name("myEvent").data(map));
} catch (Exception e) {
emitter.completeWithError(e);
logger_error.error("pushEvent Exception:" e);
deadEmitters.add(emitter);
}
});
emitters.removeAll(deadEmitters);
}
上述服務的控制器是:
@RequestMapping(value = "/subscribe", produces = "text/event-stream")
public ResponseEntity<SseEmitter> subscribe() throws Exception {
final SseEmitter emitter = eventService.subscribe();
return new ResponseEntity<>(emitter, HttpStatus.OK);
}
@RequestMapping(value = "/publish")
public void publish() throws IOException {
eventService.pushEventMap(pushMap);
}
我希望客戶端通過js接收事件推送的資料。
const eventInit = () => {
console.log("eventInit called");
const url = 'http://localhost:8080/itf/subscribe';
const eventSource = new EventSource(url);
var httpRequest = new XMLHttpRequest();
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('===');
console.log(data);
}
eventSource.onopen = (event) => {
console.log('sse open');
console.log(event);
}
eventSource.onerror = (event) => {
if (event.readyState == EventSource.CLOSED) {
console.log('sse close');
} else {
console.log("onerror", e);
}
}
}
在這種狀態下,如果我通過郵遞員發送事件生成資料,sse open則會出現在控制臺上。
但是,不顯示事件的結果。
如果我直接/itf/subscribe通過url訪問,事件的結果會顯示在螢屏上。但是,我沒有通過event.onmessage.
我想要的是引發一個事件,然后通過 onmessage 函式接收事件的結果。
我想知道如何獲得事件的結果。
此致
uj5u.com熱心網友回復:
代碼沒有問題,實際問題是當我給客戶端寫回應時,我的回應訊息應該如下所示。
PrintWriter out = response.write("data: message" value "\n\n");
out.flush(); //don't forget to flush
在我的代碼中,我錯過了回應物件中的最后一部分“\n\n”,因此 javascript 中的 source.onmessage(datalist) 沒有被命中。
uj5u.com熱心網友回復:
eventSource.addEventListener('myEvent', function (event) {
console.log(event);
const data = JSON.parse(event.data);
console.log('addEventListener');
console.log(data);
// console.log(data.siteCode);
eventEffect(data);
}, false);
這是正常作業!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/344535.html
上一篇:為什么在redux中狀態未定義
