使用STOMP连接到RabbitMQ时,如何重放错过的消息?

8
我有一个iOS应用程序,它使用STOMP客户端RabbitMQ通信。 应用程序在启动期间加载大量状态,然后通过接收在STOMP上发布的更新来保持状态同步。 当然,如果它失去连接,它就无法确定自己是否同步,因此必须重新加载那个大型初始数据块。 任何类型的网络中断都会触发此行为,并使我的客户感到沮丧。
有许多大局观的方法来解决这个问题(我正在努力解决),但同时,我正在尝试使用持久队列来解决这个问题。 这个想法是服务器将创建一个队列,将其绑定到适当的主题,然后开始构建大型启动包。 完成后,它将把所有内容交给客户端。 客户端将使用启动包设置自身,打开对队列的订阅,然后处理服务器准备好的任何更新。 类似地,如果客户端断开连接,它只需重新连接并继续读取在队列中找到的消息。
我的问题是,虽然客户端成功接收连接后发送的消息,但如果在它连接之前有任何消息,则不会读取它们。 同样,如果客户端断开连接,当它重新连接时,它将看不到在离线期间到达的任何消息。
有人能建议我如何让客户端能够读取那些缺失的消息吗?
1个回答

7

事实证明,STOMP适配器正在消费消息但未能传递它们。因此,当客户端重新连接时,它将没有任何等待它的消息。

为了解决这个问题,我将订阅请求上的”ack”设置更改为“客户端”,这意味着STOMP不应该将消息视为已传递,直到客户端发送回ACK帧。通过适当地更改我的客户端,即使客户已经离线,消息现在也会被传送。


你能发布一下你为“ack”设置所编写的示例代码吗? - Aditya
很抱歉,我不能这样做。我是在8年前为另一家公司工作时写下这个答案的。我已经无法访问那段代码了。 - Andrew Miner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接