【问题标题】:How to use PubNub publish callback to find out which message to re-publish in case of an error如何使用 PubNub 发布回调来找出发生错误时要重新发布的消息
【发布时间】:2013-07-04 19:05:24
【问题描述】:

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

[1,"Sent","13729639808030640"]

但这并没有给出关于这个回调是针对哪条消息的任何指示。如果发布错误,返回数组中的第一个值将是 0。但是如何找出要重新发布的消息呢?

发布者可以高速率发布消息,并且在发布另一条消息之前无需等待接收回调。因此,当调用回调时,发布者可能已经发布了另外 10 条消息。

【问题讨论】:

  • 问得好,您会想以多种不同的方式进行设置。这也取决于您使用的是哪个 SDK。
  • 我知道这是一个老问题,但@PubNub 还没有回答,我现在也面临同样的困境。我在 android 上,但平台无关紧要。
  • 您可以接受先进先出跟踪@klambiguit 吗?响应,无论错误与否,永远不会乱序。
  • 如果“响应、错误与否永远不会出现故障”是 100% 可靠的,那么是的。为待处理的消息创建队列是我认为的方法。但我想与您确认这是否是 pubnub 在跟踪未决消息方面的最佳做法。

标签: java android pubnub


【解决方案1】:

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 应该为您处理所有这些。

【讨论】:

  • 另外,请记住,即使您快速发布发布,所有响应都会按照发布顺序从服务器返回...您永远不会收到乱序响应在您发布的同一连接上。
  • 感谢您的快速回复,如前所述,我使用的是 android sdk,它只返回 JSONArray 消息,而不返回 jsonp 格式的消息。你是如何在安卓中做到这一点的?
【解决方案2】:

由于消息回复太长,因此转移到这里。

回复@Geremy,所以如果发送消息 1、2、3、4、5,我会按 1、2、3、4、5 的顺序收到发布回调吗?不会出现响应在 2 和 4 中失败的情况吗?在这种情况下,如果我们继续我们得到有序响应的概念,这将意味着消息 4 和 5 而不是消息 2 和 4 的响应未能到达。我是否可以建议 pubnub 团队添加一个他们返回的 JSONArray 中的第四个数据,它将包含已发布消息中的 id 字段(如果有这样的数据,例如 { "id":123, message:"hello"} ),如果没有,显然返回的 id 将为 null 或空字符串。

【讨论】:

  • 是的,您应该按照发送的顺序取回响应(好或坏)。
  • 所以维护一个挂起的消息队列并在调用发布回调时出队将跟踪挂起的消息。
  • 你应该在你的文档中真正强调这一点,因为这是一个非常重要的特性,而且显而易见。
【解决方案3】:

我也面临过类似的挑战。我想在设备离线时对消息进行排队,然后在重新连接时发送它们。在回调中,我需要一种知道发送了哪条消息以将其从队列中删除的方法。我想出了这个解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多