Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 捕获长时间运行的云订阅服务器服务中的侦听器异常_Google Cloud Platform_Google Cloud Pubsub - Fatal编程技术网

Google cloud platform 捕获长时间运行的云订阅服务器服务中的侦听器异常

Google cloud platform 捕获长时间运行的云订阅服务器服务中的侦听器异常,google-cloud-platform,google-cloud-pubsub,Google Cloud Platform,Google Cloud Pubsub,我正试图用Java编写一个长期运行的订户服务。我已设置侦听器来侦听订户服务中的任何故障。我正在努力使其容错,但我不太了解一些事情,以下是我的疑问/问题 我遵循了这里显示的基本设置。具体来说,我已经设置了addListener,如下所示。 如以下代码所示,initializeSubscriber充当一个状态变量,该变量将确定订阅服务器服务是否应重新启动。在while循环中,该变量将被持续监控,以确定是否需要重新启动 我的问题是,, 1.如何在Subscriber.Listener失败的方法中引发异

我正试图用Java编写一个长期运行的订户服务。我已设置侦听器来侦听订户服务中的任何故障。我正在努力使其容错,但我不太了解一些事情,以下是我的疑问/问题

我遵循了这里显示的基本设置。具体来说,我已经设置了addListener,如下所示。 如以下代码所示,initializeSubscriber充当一个状态变量,该变量将确定订阅服务器服务是否应重新启动。在while循环中,该变量将被持续监控,以确定是否需要重新启动

我的问题是,, 1.如何在Subscriber.Listener失败的方法中引发异常并在主while循环中捕获它。我尝试在失败的方法中抛出一个新异常,并在内部的catch块中捕获它,但是,我无法编译代码,因为它是一个已检查的异常。 2.如图所示,我使用Java执行器线程来运行侦听器。如何处理侦听器故障?我是否能够在通用异常捕获块下捕获侦听器故障,如图所示

try {
 boolean initializeSubscriber = true;
    while (true) {
        try {
           if (initializeSubscriber) { 
             createSingleThreadedSubscriber();
             addErrorListenerToSubscriber();
             subscriber.startAsync().awaitRunning();
             initializeSubscriber = false;
           }

          // Checks the status of subscriber service every minute
          Thread.sleep(60000);

        } catch (Exception ex) {
          LOGGER.error("Could not start the Subscriber service", ex);
          cleanupSubscriber();
          initializeSubscriber = true;
        }
    }
} catch (RuntimeException e) {

} finally {
    shutdown();
}
private void addErrorListenerToSubscriber() {
    subscriber.addListener(
      new Subscriber.Listener() {
          @Override
          public void failed(Subscriber.State from, Throwable failure) throws RuntimeException { 
            LOGGER.info("Subscriber reached a failed state due to " + failure.getMessage()
                + ",Restarting Subscriber service");
            initializeSubscriber = true; 
          }
      },
      Executors.newSingleThreadExecutor());
  }

  private void cleanupSubscriber() {

    try {
      if (subscriber != null) {
        subscriber.stopAsync().awaitTerminated();
      }
      if (!subscriptionListener.isShutdown()) {
        subscriptionListener.shutdown();
      }
    } catch (Exception ex) {
      LOGGER.error("Error in cleaning up Subscriber thread " + ex);
    }
  }


如果您只想在出现故障时重新创建订阅服务器,则无需向订阅服务器添加侦听器。您可以在以下情况下捕获异常:

如果订阅服务器由于调用stopAsync而成功关闭,则不会引发异常。如果存在某种类型的异常,那么WaitiveTerminated将抛出IllegalStateException,因为状态将失败而不是终止

请注意,暂时性错误由库本身处理。例如,如果服务器由于网络故障暂时不可用,库将无缝重新连接并继续传递消息。导致订阅服务器状态更改的故障可能是永久性故障,例如运行订阅服务器的帐户没有订阅订阅权限的权限问题,或者资源问题,例如订阅已被删除。在这些永久性故障情况下,重新创建订阅服务器可能只会导致相同的错误,除非采取手动步骤进行干预并修复问题

try {
  boolean initializeSubscriber = true;
  while (initializeSubscriber) {
    try { 
      createSingleThreadedSubscriber();
      subscriber.startAsync().awaitRunning();
      initializeSubscriber = false;
      subscriber.awaitTerminated();
    } catch (Exception ex) {
      LOGGER.error("Error in the Subscriber service", ex);
      cleanupSubscriber();
      initializeSubscriber = true;
    }
  }
}  catch (RuntimeException e) {
} finally {
  shutdown();
}