使用STOMP连接RabbitMQ时,如何重放丢失的消息?

时间:2013-02-21 00:05:08

标签: objective-c rabbitmq stomp

我有一个iOS应用程序,它使用STOMP ClientRabbitMQ交谈。应用程序在启动期间加载大量状态,然后通过接收在STOMP上发布的更新来保持该状态同步。当然,如果它失去连接,它就不能再确定它是否同步,因此必须重新加载那个大的初始blob。任何类型的网络中断都会触发此行为并使我的客户感到悲伤。

有许多重要的方法可以解决这个问题(我正在研究它们),但与此同时,我试图使用持久性队列来解决这个问题。这个想法是服务器将创建一个队列,将其绑定到适当的主题,然后开始构建大型启动包。完成后,它会将所有内容交给客户端。客户端将使用启动包进行自我设置,打开对队列的订阅,然后处理服务器准备就绪时发生的任何更新。同样,如果客户端应该断开连接,它只需重新连接并继续读取它在队列中找到的消息。

我的问题是,当客户端成功接收连接后发送的消息时,如果在连接之前队列中有任何消息,则不会读取它们。同样,如果客户端断开连接,当它重新连接时,它将不会看到任何消息在它离开时到达。

有人可以建议我如何让客户端能够阅读那些丢失的消息吗?

1 个答案:

答案 0 :(得分:6)

事实证明,发生的事情是STOMP适配器消耗了消息但未能提供消息。因此,当客户端重新连接时,它将没有任何消息等待它。

为了解决这个问题,我将订阅请求中的“ack”设置更改为“client”,这意味着在客户端发送回ACK帧之前,STOMP不应该考虑传递的消息。通过适当地更改我的客户端,即使在客户离开后,邮件也会立即发送。