2016-04-11 11 views
0

Ich möchte etwas wie Chat in meiner App erstellen, aber ich habe ein Problem mit der Erfassung von Änderungen in Echtzeit. Mein JavaScript-Code scheintAsync Servlet Antworten im Frühjahr

function load() { 

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4 && xhr.status === 200) { 
      console.log("Response nr" + id++ + ". " + xhr.responseText); 
    } 
}; 
xhr.open("GET", "/new", true); 
xhr.send(); 
} 

function sendMessage() { 
... 
var request = new XMLHttpRequest(); 

var params = ... 
request.open("POST", "/new", true); 
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
request.send(params); 
} 

gut zu funktionieren Aber der Frühling sendet Antwort nur einmal (nur nach dem ersten Posting Anfrage)

@RestController 
public class MessageController { 

private final MessageRepository messageRepository; 
private final Queue<DeferredResult<List<Message>>> messagesQueue = new ConcurrentLinkedQueue<>(); 

@Autowired 
public MessageController(MessageRepository messageRepository) { 
    this.messageRepository = messageRepository; 
} 


@RequestMapping("/new") 
public DeferredResult<List<Message>> get() { 
    final DeferredResult<List<Message>> deferredResult 
      = new DeferredResult<>(); 
    this.messagesQueue.add(deferredResult); 

    return deferredResult; 
} 

@RequestMapping(value = "/new", method=RequestMethod.POST) 
public void postMessage(...) { 
    Message message = ... 
    ... 
    this.messageRepository.save(message); 


    for (DeferredResult<List<Message>> result: this.messagesQueue) { 
     List<Message> messages = this.messageRepository.findAll(); 
     result.setResult(messages); 
     //this.messagesQueue.remove(result); 
    } 
} 

(Ja, ich weiß, dass alle Nachrichten zu senden, jedes Mal nicht um einen gute Idee, ich werde es später beheben)
Ich habe ein paar Beispiele auf spring.io/blog gesehen, aber sie funktionieren nicht in meinem Fall. Durch das Entfernen der letzten Zeile wird das Problem nicht gelöst. Was soll ich machen?
PS. Ich habe EnableAsync Annotation und ich verwende Spring-Boot-Konfiguration.

Antwort

0

In der Methode get() fügen Sie der messagesQueue ein leeres DeferredResult hinzu und geben es an den Client zurück. Ich kann nicht sehen, was mit der Warteschlange passiert, aber es ist sehr wahrscheinlich, dass es immer noch leer ist.

In postMessage() bereiten Sie ein Ergebnis vor, aber Sie geben es nicht zurück.

Es sieht ein wenig seltsam aus, auf GET zu schreiben und auf PUT zu lesen. Also ich denke, dass Sie vielleicht neu überdenken müssen, was Sie eigentlich erreichen möchten.

+0

Es war nicht mein Konzept überhaupt, ich fand es [hier] (https://spring.io/blog/2012/05/16/spring-mvc-3-2-Vorschau-Chat-Probe /) – Kuba