我想在我的应用中创建类似聊天的内容,但我在实时捕获更改时遇到问题。 我的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配置。
答案 0 :(得分:0)
在get()方法中,将一个空的DeferredResult添加到messagesQueue并将其返回给客户端。我无法看到,队列会发生什么,但它很可能仍然是空的。
在postMessage()中,您准备了一个结果,但是您没有返回它。
看起来有点奇怪,写在GET上并阅读PUT。 所以我认为你可能不得不重新思考你实际想要达到的目标......