2017-07-11 2 views
0

Ich betreibe dieses Java-Code auf Google App Engine (Java7)wie Google App Engine unterstützt nicht Runtime.addShutdownHook

und ich erhalte eine Fehlermeldung, aber ich bin mir nicht sicher zu vermeiden, was es bedeutet und wie man vermeide es?

 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); 
     } 

und

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; 
} 

Fehler: Google App Engine unterstützt keine 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) 

Antwort

0

Sie sehen, dass Fehler, weil Google Cloud PubSub gRPC als Transportschicht verwendet. Insbesondere verwendet es eine ManagedChannel und eine ScheduledExecutorService für Anrufe (beide als ChannelAndExecutor Paar zur Verfügung gestellt). Der Executor-Service wird beendet, wenn die Anwendung abgeschlossen ist, und zwar mithilfe von Daemon-Threads und Hinzufügen eines Shutdown-Hooks, der auf ihre Beendigung wartet.

gRPC wird jedoch nicht von App Engine Standard mit der Java 7-Laufzeit unterstützt. Java 8 unterstützt gRPC, aber es sieht so aus, als ob es keine Pläne gibt, es auch auf Java 7 zu unterstützen (siehe google-cloud-java GitHub issue).

Um die Java 8 Laufzeit für Ihre Anwendung angeben, fügen Sie einfach folgende Zeile zu appengine-web.xml Datei:

<runtime>java8</runtime>