如何使用PubNub发布回调来找出在出现错误时要重新发布的消息

时间:2013-07-04 19:05:25

标签: java android pubnub

PubNub API中的发布回调返回如下消息 -

[1,"Sent","13729639808030640"]

但是这并没有说明这个回调是针对哪个消息的。如果发布错误,返回数组中的第一个值将为0.但是如何找出要重新发布的消息?

发布者可以高速发布消息,而不是在发布其他消息之前等待接收回调。因此,当调用回调时,发布者可能已经发布了10条消息。

3 个答案:

答案 0 :(得分:3)

PubNub REST API也提供JSONP格式。您可以为实际消息创建“回调函数”标识符的映射,并且在处理完成后,您可以使用响应中的“回调函数”标识符获取原始消息的引用。
例如:

https://pubsub.pubnub.com/publish/demo/demo/0/iosdev/m_2c453/%22Hello%20world2%22  

如您所见,URI中有m_2c453,服务器将使用它作为响应:

m_2c453([1,"Sent","14034711347326358"])

我们知道,m_2c453已用于发送"Hello world"消息 但是,我认为依赖于平台的PubNub SDK应该为您处理所有这些。

答案 1 :(得分:0)

此处转移,因为邮件回复时间过长。

在回复@Geremy时,如果发送消息1,2,3,4,5,我将以1,2,3,4,5的顺序获得发布回调?在第2和第4阶段,响应会失败的情况会不会成为现实?在这种情况下,如果我们继续认为我们得到了一个有序的响应,这意味着响应无法到达消息4和5而不是2和4.我可能会向pubnub团队建议他们在他们返回的JSONArray中添加第四个数据,它将包含已发布的消息中的id字段(如果有这样的数据,例如{" id":123,message:" hello&# 34;}),如果没有,显然返回的id将为null或空字符串。

答案 2 :(得分:0)

我遇到了类似的挑战。我想在设备离线时排队消息,然后在重新连接时发送消息。在回调中,我需要一种方法来了解发送了哪些消息以将其从队列中删除。我提出了这个解决方案:

function sendData(channel, data, callback) {
  Pubnub.publish({
    channel: channel,
    message: data,
    callback : callback
  });
}

//This code is placed within the "reconnect" callback of the subscription
if ($localStorage.chatQueue.length) {
  for (var i = 0; i < $localStorage.chatQueue.length; i++) {
    sendData(
      $localStorage.chatQueue[i].channel,
      $localStorage.chatQueue[i].data,
      function(){
        console.log("arguments");
        console.log(arguments);
        console.log("this");
        console.log(this);
        index = $localStorage.chatQueue.indexOf(this);
        console.log("Message in offline queue sent, index = "+index);
        if (index > -1) {
          $localStorage.chatQueue.splice(index, 1);
        }
      }.bind($localStorage.chatQueue[i])
    );
  }
}

技巧是将回调函数中的this绑定到消息对象。它似乎工作。我想也可以绑定i变量,该变量将直接指向队列中的消息。

我在另一个问题中受到了这个答案的启发:https://stackoverflow.com/a/19472945/3319392