春天的异步servlet响应

时间:2016-04-11 17:49:53

标签: java spring spring-mvc

我想在我的应用中创建类似聊天的内容,但我在实时捕获更改时遇到问题。 我的javascript代码似乎工作正常

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); 
}

但春天只发送一次回复(仅在第一次发布请求后)

@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);
    }
}

(是的,我知道每次发送所有邮件都不是一个好主意,我稍后会修复)
我在spring.io/blog上看到了一些例子,但是在我的情况下它们不起作用。取消注释最后一行并不能解决问题。我该怎么办?
PS。我有EnableAsync注释,我正在使用spring boot配置。

1 个答案:

答案 0 :(得分:0)

在get()方法中,将一个空的DeferredResult添加到messagesQueue并将其返回给客户端。我无法看到,队列会发生什么,但它很可能仍然是空的。

在postMessage()中,您准备了一个结果,但是您没有返回它。

看起来有点奇怪,写在GET上并阅读PUT。 所以我认为你可能不得不重新思考你实际想要达到的目标......