如何避免 Google App Engine 不支持 Runtime.addShutdownHook
how to avoid Google App Engine does not support Runtime.addShutdownHook
我 运行 这个 java 代码在 google 应用引擎 (java7)
我收到一个错误,但我不确定这是什么意思以及如何避免它?
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
作为传输层。特别是,它使用 ManagedChannel
和 ScheduledExecutorService
进行调用(均作为 ChannelAndExecutor
对提供)。执行程序服务在应用程序完成时退出,它通过使用守护线程并添加一个关闭挂钩来等待它们完成。
但是,使用 Java 7 运行时的 App Engine 标准不支持 gRPC
。 Java 8 支持 gRPC
,但似乎没有计划在 Java 7 上也支持它(参见 google-cloud-java GitHub issue)。
要为您的应用程序指定 Java 8 运行时,只需将此行添加到您的 appengine-web.xml
文件:
<runtime>java8</runtime>
我 运行 这个 java 代码在 google 应用引擎 (java7)
我收到一个错误,但我不确定这是什么意思以及如何避免它?
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
作为传输层。特别是,它使用 ManagedChannel
和 ScheduledExecutorService
进行调用(均作为 ChannelAndExecutor
对提供)。执行程序服务在应用程序完成时退出,它通过使用守护线程并添加一个关闭挂钩来等待它们完成。
但是,使用 Java 7 运行时的 App Engine 标准不支持 gRPC
。 Java 8 支持 gRPC
,但似乎没有计划在 Java 7 上也支持它(参见 google-cloud-java GitHub issue)。
要为您的应用程序指定 Java 8 运行时,只需将此行添加到您的 appengine-web.xml
文件:
<runtime>java8</runtime>