当前位置: 首页 > 知识库问答 >
问题:

异步订阅服务器示例会丢失消息吗?

欧阳玺
2023-03-14
public class SubscriberExample {

  private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId();

  private static final BlockingQueue<PubsubMessage> messages = new LinkedBlockingDeque<>();

  static class MessageReceiverExample implements MessageReceiver {

    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
      messages.offer(message);
      consumer.ack();
    }
  }

  public static void main(String... args) throws Exception {
    String subscriptionId = args[0];
    ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(
        PROJECT_ID, subscriptionId);
    Subscriber subscriber = null;
    try {
      subscriber =
          Subscriber.newBuilder(subscriptionName, new MessageReceiverExample()).build();
      subscriber.startAsync().awaitRunning();
      while (true) {
        PubsubMessage message = messages.take();
        processMessage(message);
      }
    } finally {
      if (subscriber != null) {
        subscriber.stopAsync();
      }
    }
  }

最好的实现难道不是只在消息被处理后才确认它吗?而不是确认它并将它留在队列中,并假设它将被处理。我明白这将解耦消息的接收和消息的处理,并潜在地增加吞吐量,但它仍然有丢失消息的风险,对吗?

暂时还没有答案

 类似资料:
  • 我有一个使用ActiveMQ的JMS生产者/订阅者的简单Spring应用程序,配置如下: 我试过所有可能的解决办法,但没有一个奏效。我们非常感谢任何帮助

  • 微信文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html 组合模板并添加至帐号下的个人模板库 $tid = 563; // 模板标题 id,可通过接口获取,也可登录小程序后台查看获取 $kidLi

  • 开普勒消息目前分为三大类:公告,告警和通知。 通知中根据不同的操作事件类型,分为十几个事件。每个事件都跟项目操作相关。便于接收项目操作变更的通知。 分类 事件 公告 Alarm 告警 Proclaim 通知 Build,Apply,Audit,Delete,Rollback,Logging,Reboot,Command,Storage,Extend... 订阅界面: 用户中心,点击头像,下拉菜单→

  • 有可能做到这一点吗?

  • 我有点卡在服务器端了。我让它读取packetLength变量,方法是使用Buffer.BlockCopy复制前4个字节,然后使用BitConverter.ToInt32读取应该获得的长度。我不确定是应该不断地将传入的数据读入特定于客户端的流对象中,还是只使用while循环。下面是我到目前为止在服务器端所拥有的代码示例: 谢谢你的时间和建议,我期待着学习更多关于这个主题的知识。

  • 如果一个主题订阅者在向该主题/订阅者发送推送通知时没有在线,那么他/她的消息会丢失还是当他们在线时才收到消息?