Google cloud platform 捕获长时间运行的云订阅服务器服务中的侦听器异常
我正试图用Java编写一个长期运行的订户服务。我已设置侦听器来侦听订户服务中的任何故障。我正在努力使其容错,但我不太了解一些事情,以下是我的疑问/问题 我遵循了这里显示的基本设置。具体来说,我已经设置了addListener,如下所示。 如以下代码所示,initializeSubscriber充当一个状态变量,该变量将确定订阅服务器服务是否应重新启动。在while循环中,该变量将被持续监控,以确定是否需要重新启动 我的问题是,, 1.如何在Subscriber.Listener失败的方法中引发异常并在主while循环中捕获它。我尝试在失败的方法中抛出一个新异常,并在内部的catch块中捕获它,但是,我无法编译代码,因为它是一个已检查的异常。 2.如图所示,我使用Java执行器线程来运行侦听器。如何处理侦听器故障?我是否能够在通用异常捕获块下捕获侦听器故障,如图所示Google cloud platform 捕获长时间运行的云订阅服务器服务中的侦听器异常,google-cloud-platform,google-cloud-pubsub,Google Cloud Platform,Google Cloud Pubsub,我正试图用Java编写一个长期运行的订户服务。我已设置侦听器来侦听订户服务中的任何故障。我正在努力使其容错,但我不太了解一些事情,以下是我的疑问/问题 我遵循了这里显示的基本设置。具体来说,我已经设置了addListener,如下所示。 如以下代码所示,initializeSubscriber充当一个状态变量,该变量将确定订阅服务器服务是否应重新启动。在while循环中,该变量将被持续监控,以确定是否需要重新启动 我的问题是,, 1.如何在Subscriber.Listener失败的方法中引发异
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();
}