Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Javascript 如何等待订阅建立?_Javascript_Spring Mvc_Websocket_Stomp_Sockjs - Fatal编程技术网

Javascript 如何等待订阅建立?

Javascript 如何等待订阅建立?,javascript,spring-mvc,websocket,stomp,sockjs,Javascript,Spring Mvc,Websocket,Stomp,Sockjs,我有以下js代码: stompClient.subscribe('/topic/clients', function (calResult) { updateClientsTable(JSON.parse(calResult.body)); }); $.get("/clients", null); 下面的服务器代码(最后一行调用它): 有时前端会忽略$.get(“/clients”,null)的结果 正如我所理解的问题:在结果进入前端的那个一刻,订阅并没有发生 如果要放置$.get(“

我有以下js代码:

stompClient.subscribe('/topic/clients', function (calResult) {
    updateClientsTable(JSON.parse(calResult.body));
});
$.get("/clients", null);
下面的服务器代码(最后一行调用它):

有时前端会忽略
$.get(“/clients”,null)的结果

正如我所理解的问题:在结果进入前端的那个一刻,订阅并没有发生

如果要放置
$.get(“/clients”,null)下面的代码-所有工作正常


您能解释一下如何等待订阅建立吗?

我认为不将REST请求与此消息传递模式混合使用更有意义


您是否考虑过通过SockJS将“updateClients”命令发送到“/apps/updateClients”频道,该频道会回复“/topic/clients”频道

正如@light_303已经提到的,混合HTTP请求和通知机制是不好的。当客户端连接时,您可以注册时刻(在
/clients
上获取请求),但当客户端断开连接时,您不能注册时刻

你应该用下一种方式来思考。当用户订阅
/topic/clients
时:

  • 您单独向他发送带有所有客户端列表的响应,然后仅推送更新
  • 您单独向他发送当前服务器时间或某种ID,然后只推送更新。用户在对
    /clients
    的GET请求中使用给定的时间/ID,并在该时刻接收完整的客户端列表。当您有增量更新(即向列表中添加新元素)时,此选项在这种情况下可能会很好,否则就不太好了
  • 检查此问题:


    这真是可笑,春天怎么会使事情复杂化。我建议您查看其他实时web通信框架,如Vert.x或Netty和on-Go编程语言。使用WebSockets或SockJS而不是STOMP。所有这些技术都可以明显地为您提供更灵活、更高性能的解决方案。另外,请检查project,它可能与您的任务相关。

    您可以使用
    spring messaging
    中的
    @SubscribeMapping
    注释

    如果您按照描述和配置了
    spring消息传递
    ,则服务器端代码可能如下所示:

    @Controller
    public class MessagingController {
        @SubscribeMapping("/clients")
        public List<Client> loadClients() {
            return clientService.getClientList();
        }
    }
    

    我假设您已经通过.connect()建立了一个有效的stomp连接,但是在您查询主机一次之前,后续订阅无法获取消息?STOMP不为“成功”订阅提供回调。它不会持续复制。我不明白这句话:直到你询问主人一次
    @Controller
    public class MessagingController {
        @SubscribeMapping("/clients")
        public List<Client> loadClients() {
            return clientService.getClientList();
        }
    }
    
    stompClient.subscribe('/topic/clients', function (calResult) {
        updateClientsTable(JSON.parse(calResult.body));
    });