Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring中的异步servlet响应_Java_Spring_Spring Mvc - Fatal编程技术网

Java spring中的异步servlet响应

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

我想在我的应用程序中创建类似聊天的东西,但我在实时捕获更改时遇到问题。 我的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); 
}
但是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);
    }
}