Sunucu Gönderilen Olaylar için yeniyim ama İlkbahar'a değil. SSEEmitter'i başlatan ve bunu her 4 saniyeden sonra UI'ye iletiyi ileten başka bir ileticiye geçiren UI üzerindeki bir düğmeden tetiklenen bir denetleyici yaptık. Şimdiye kadar her biri 4 saniyeliğine 4 kez uyuyan, ancak 6 ya da 7. döngüde yinelenen 10'luk bir döngü çalıştırıyorum, istisna alıyorum "Konuda özel durum" Thread-4 "java.lang.IllegalStateException: ResponseBodyEmitter zaten tamamlandı" Bu nedenle, olay kaynağı tekrar bağlantıyı yeniden kurar, yani kesinlikle istemediğim kontrolör yöntemini tekrar çağırır.Spring SSEEmitter Tamamlandı Orta yol
Ben basit bir şey denemek için buradayım .. Kullanıcı butonuna tıklayarak abone olursunuz .. Sunucu tarayıcıya ne zaman olursa olsun 10 veya 20 yanıtı gönderin. Ve düşündüğüm kadarıyla bu, SSE'nin yarattığı şey. .:
@RequestMapping("/subscribe")
public SseEmitter subscribe() {
SseEmitter sseEmitter = new SseEmitter();
try {
sseEmitter.send("Dapinder");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Runnable r = new AnotherThread(sseEmitter);
new Thread(r).start();
return sseEmitter;
}
public class AnotherThread altında
Kod uygulayan Runnable {
private SseEmitter sseEmitter;
public AnotherThread(SseEmitter sseEmitter) {
super();
this.sseEmitter = sseEmitter;
}
@Override
public void run() {
SseEventBuilder builder = SseEmitter.event();
builder.name("dapEvent");
for (int i = 0; i < 10; i++) {
builder.data("This is the data: " + i +" time.");
try {
//sseEmitter.send(builder);
sseEmitter.send("Data: "+i);
//sseEmitters.get(1L).send("Hello");
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
sseEmitter.complete();
}
public SseEmitter getSseEmitter() {
return sseEmitter;
}
public void setSseEmitter(SseEmitter sseEmitter) {
this.sseEmitter = sseEmitter;
}
}
function start() {
var eventSource = new EventSource("http://localhost:8080/HTML5SSE/springSSE/subscribe"); // /springSSE/connect
eventSource.onmessage = function(event) {
document.getElementById('foo').innerHTML = event.data;
};
}
<button onclick="start()">Subscribe</button>
Bu konuya bir bakın: http://stackoverflow.com/questions/29880336/spring-sseemitter-causes-cannot-forward-after-response-has-been-committed-except. Aynı konuya benziyor. – ctranxuan
Aynı problemim var. Başka bir iş parçacığında SseEmitter üzerinde göndermek için hazır olduğumda, zaman aşımı veya bir yerde tamamladı ve bir IllegalStateException atar. İyi bir çözüm buldunuz mu? –