【问题标题】:Ensure that a message is received确保收到消息
【发布时间】:2016-06-14 20:16:41
【问题描述】:

我需要编写一个可以在客户端发送推送通知的应用程序。但有时客户端会断开连接,所以我想存储通知并在客户端重新连接时将它们发送给客户端。

有没有办法做到这一点? 我需要一种在发送之前知道客户端是否存在的方法,或者一种知道是否收到通知的方法。 而且我的通知是特定于客户的。

我不能炫耀很多代码,但我想使用这样的东西:

@Autowired
private SimpMessagingTemplate messagingTemplate;

public void sendPush(Long clientId) {

    messagingTemplate.convertAndSendToUser(clientId, "/queue/reply", myMessage);
    // -> how do I know if message is received ?
}

我使用 spring-websocket 和 stomp-endpoint。

谢谢!

【问题讨论】:

  • 您的客户是否有在他们的系统上运行的客户端程序?你能控制那个代码吗?如果是这样,您的阻力最小的路径将是实现在客户端连接时从服务器拉入(或请求)消息的代码 - 这应该已经存在。那么服务器就会知道消息被推送了。
  • 如果服务器不知道客户端何时收到推送消息,如何知道是否必须向客户端发送消息?
  • 客户端告诉服务器“嘿!我在这里!”当它连接时。服务器然后说“好的;这里拿这些消息!”客户回复“好的,我知道了;谢谢!”服务器正在等待客户端告诉它它收到了消息——在此之前服务器不知道也不可能知道客户端是否收到了消息。如果我给你寄了一封信,而你没有回信,我怎么知道你收到了我寄给你的信?据我了解,这个问题与 TCP 通过 UDP 解决的问题相同。
  • websockets 是全双工的,所以服务器必须知道客户端是否连接。如果客户端已连接,我们可以假设他收到了消息。服务器必须能够知道,当他必须发送消息时,他必须存储消息以供以后使用(客户端断开连接),还是发送(客户端连接)。我尝试实现的正是这个功能。
  • 我现在明白了。它不知道客户端何时断开连接正确?

标签: java stomp spring-websocket spring-messaging


【解决方案1】:

也许您会收到来自用户的“确认”消息。 您可以将所有消息保存在一个数据结构中,并仅在您得到确认后将其删除。

【讨论】:

  • 是的,这确实是一个解决方案。但我更愿意将逻辑保留在服务器端并在客户端做最少的事情。
猜你喜欢
  • 2015-09-04
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多