当前位置: 首页 > 知识库问答 >
问题:

如何等待订阅建立?

符佐
2023-03-14

我有以下js代码:

stompClient.subscribe('/topic/clients', function (calResult) {
    updateClientsTable(JSON.parse(calResult.body));
});
$.get("/clients", null);

下面的服务器代码(最后一行调用它):

 @GetMapping(value = {"/clients"})
 @ResponseBody
 public void loadClients() {
      brokerMessagingTemplate.convertAndSend("/topic/clients", clientService.getClientList());
 }

有时前端会忽略$的结果。获取(“/clients”,null)

正如我所理解的问题:在结果到达前端的那一刻,订阅是不会发生的。

如果要放入$。获取(“/clients”,null) 下面的代码-所有工作正常。

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


共有3个答案

彭硕
2023-03-14

您可以使用@SubscribeMapping来自spring消息传递的注释。

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

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

这样您就不必调用$。获取(“/clients”,null) loadClients()调用的结果。JS代码如下所示:

stompClient.subscribe('/topic/clients', function (calResult) {
    updateClientsTable(JSON.parse(calResult.body));
});

洪楷
2023-03-14

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

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

  1. 您单独向他发送带有所有客户端列表的响应,然后仅推送更新

检查此问题:在Spring Websocket上向特定用户发送消息。

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

公孙河
2023-03-14

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

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

 类似资料:
  • 我有一个生产者,它从Rest API下载页面中的数据,以及几个处理页面的消费者(例如,将它们加载到数据库中)。 我希望生产者和消费者并行工作,这意味着生产者不应该等到一个页面被消费后再下载下一个页面。每个使用者都需要按顺序处理页面。 当下载所有页面时,主线程应该等待所有消费者完成他们的工作(因为消费可能比生产需要更长的时间)。 我目前的做法如下: 我已经创建了一个下载页面的可观察对象,它在附加消费

  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1

  • 轻推支持在电脑端和手机端创建订阅号,创建完成后待管理员审核通过后即创建成功,但仍需登录电脑端轻推进入企业管理设置和发送订阅号。 1. 手机端 通讯录-订阅号-发现-新建-设置头像-设置名称-描述订阅号-选择需要创建订阅号的企业 2. 电脑端 电脑端操作方法与手机端相同。

  • mysql会员订阅数据表的设计应该如何设计?产品有订阅商品和非订阅的,每次都只能购买一个。 订阅有1个月 3个月的 每次到期自动扣费。如果在一个月类购买了几个订阅商品 则扣费按照最新的一个 然后延长到期时间。其实是不是每次订阅都不需要生成新订单的 翻阅了其他资料都找不到很好的设计

  • 我在spring中有一个服务,它需要使用十种不同的方法获取数据。 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有响应出现,然后返回响应。 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程不等待订阅者方法完成。 下面是我订阅的两种方法 下面是我的主要方法 以下是我的输出: 我的输出显示,主线程没有等待订阅服务器完成其任务,因此我如何处理这种情况?

  • GitBlog支持评论,订阅,百度统计相关功能,这些功能可由conf.yaml配置开启或关闭,评论采用多说评论框,统计采用百度统计。 多说评论框 GitBlog目前只支持多说评论框,如果你希望你的博客有评论功能,你需要申请多说账号来管理你的评论。多说的官方地址是:http://duoshuo.com。 在多说的管理后台,工具一栏中获取代码你会看到这样一段代码: <!-- 多说评论框 start -