Java spring中的异步servlet响应
我想在我的应用程序中创建类似聊天的东西,但我在实时捕获更改时遇到问题。 我的javascript代码似乎工作正常Java spring中的异步servlet响应,java,spring,spring-mvc,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
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);
}
但是spring只发送一次响应(仅在第一次post请求之后)
@RestController
公共类消息控制器{
私有最终消息存储库消息存储库;
private final Queue messagesQueue=新的ConcurrentLinkedQueue();
@自动连线
public MessageController(MessageRepository MessageRepository){
this.messageRepository=messageRepository;
}
@请求映射(“/new”)
公共延迟结果get(){
最终延期结果延期结果
=新的延迟结果();
this.messagesQueue.add(deferredResult);
返回延迟结果;
}
@RequestMapping(value=“/new”,method=RequestMethod.POST)
公共无效后消息(…){
消息消息=。。。
...
this.messageRepository.save(消息);
for(延迟结果:this.messagesQueue){
List messages=this.messageRepository.findAll();
result.setResult(消息);
//this.messagesQueue.remove(结果);
}
}
(是的,我知道每次发送所有消息都不是一个好主意,我稍后会解决它)我在spring.io/blog上看到了一些示例,但它们在我的案例中不起作用。取消最后一行的注释并不能解决问题。我该怎么办?
另外,我有EnableSync注释,我正在使用spring引导配置。在get()方法中,您向messagesQueue添加一个空的DeferredResult并将其返回给客户端。我看不出队列发生了什么,但很可能它仍然是空的 在postMessage()中,您准备了一个结果,但不返回它 在GET上写和在PUT上读看起来有点奇怪。
因此,我认为你可能需要重新思考你真正想要实现的目标……这根本不是我的概念,我发现了
@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);
}
}