java - 如何避免Google App Engine不支持Runtime.addShutdownHook

标签 java google-app-engine google-cloud-platform java-7

我在谷歌应用程序引擎(java7)上运行这个java代码

我收到一个错误,但我不确定它是什么意思以及如何避免它?

        final TopicName topicName = pubSubFactory.createOrGetTopic(SpreadSheetConfig.s.TOPIC_NAME_ADD_PARTNER_REQUEST);
        CustomPublisher customPublisher = pubSubFactory.createPublisher(topicName);
        PublisherCallbackWithLog publisherCallback = new PublisherCallbackWithLog<String>();

        for (WazeSdkPartner.WazeSdkRequest wazeSdkRequest : wazeSdkRequestsList.getRequestList()) {
            customPublisher.publish(wazeSdkRequest, publisherCallback);
        }

public <T extends MessageLite> ApiFuture<String> publish(final T message, final ApiFutureCallback<T> futureCallback) throws Exception {
    final PubsubMessage      pubsubMessage   = PubsubMessage.newBuilder().setData(message.toByteString()).build();
    final ApiFuture<String>  messageIdFuture = publisher.publish(pubsubMessage);

    if ( futureCallback != null ) {
        ApiFutures.addCallback(messageIdFuture, (ApiFutureCallback) futureCallback);
    }

    return messageIdFuture;
}

错误: Google App Engine 不支持 Runtime.addShutdownHook

/
java.lang.RuntimeException: java.lang.SecurityException: Google App Engine does not support Runtime.addShutdownHook
    at com.waze.sdkService.servlets.SdkPollerServlet.publishAddPartnersRequests(SdkPollerServlet.java:96)
    at com.waze.sdkService.servlets.SdkPollerServlet.publishRequestsIfNewPartners(SdkPollerServlet.java:72)
    at com.waze.sdkService.servlets.SdkPollerServlet.doGet(SdkPollerServlet.java:63)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

最佳答案

您看到该错误是因为 Google Cloud PubSub 使用 gRPC 作为传输层。特别是,它使用 ManagedChannelScheduledExecutorService 进行调用(两者均作为 ChannelAndExecutor 对提供)。当应用程序完成时,执行程序服务退出,它通过使用守护线程并添加关闭 Hook 来等待其完成来实现。

但是,使用 Java 7 运行时的 App Engine Standard 不支持 gRPC。 Java 8 支持 gRPC,但似乎没有计划在 Java 7 上也支持它(请参阅此 google-cloud-java GitHub issue)。

要为您的应用指定 Java 8 运行时,只需将此行添加到您的 appengine-web.xml 文件中即可:

<runtime>java8</runtime>

关于java - 如何避免Google App Engine不支持Runtime.addShutdownHook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45039481/

相关文章:

python - Appengine 中使用什么版本/风格的 Python?

google-app-engine - 在 OSX 上重新启动后,本地 GAE 数据存储为空

google-cloud-platform - 如何使用 pubsub 在死信订阅中自动分配发布者角色和订阅者角色?

java - 类型转换 float 组

java - 阻止 OSX 自动调整 JComboBox 大小?

java - 如何安全移动软件包 intellij?

java - 如何将 Apache Tomcat 5 中运行的 Java 应用程序迁移到 Apache Tomcat 7?

google-app-engine - 是否可以在没有自己的证书的情况下在 App Engine 上将 SSL 与自定义域一起使用?

google-cloud-platform - Dataproc运行失败: INVALID_ARGUMENT: User not authorized to act as service account

kubernetes - GCP GKE Google Kubernetes Engine 连接到服务器 localhost :8080 was refused