identificare se è un codice in esecuzione su runtime App Engine (Java)
-
30-09-2019 - |
Domanda
Come si può identificare se un certo codice (un serv-let o di una semplice classe) è in esecuzione su Google App Engine runtime (Java) in modo che si può decidere se utilizzare librerie specifiche del motore di app o no? C'è qualche affidabile ID runtime ambiente per questo?
Nessuna soluzione corretta
Altri suggerimenti
È possibile controllare la proprietà com.google.appengine.runtime.version
:
String appEngineVersion = System.getProperty("com.google.appengine.runtime.version");
Se è impostato, di App Engine.
Ma vorrei considerare l'utilizzo di obiettivi di generazione separata, invece, al fine di evitare il sovraccarico di esecuzione.
simile a quello che ha scritto @Reza, ma un po 'più pulito:
uso SystemProperty.environment.value()
per ottenere " Produzione " durante l'esecuzione su App Engine, e " sviluppo " durante l'esecuzione in server di sviluppo.
Come ha detto @ Matteo Flaschen, ci sono le proprietà di sistema che è possibile controllare per determinare se GAE è presente o non. Questo link fornisce i dettagli.
Se si va su questa strada, le esigenze applicative essere costruita in modo che il codice principale non ha dipendenze statiche sulle classi GAE; vale a dire nessuna importazione o altri riferimenti ai pacchetti GAE e le classi nel codice (a parte i nomi delle classi GAE, ecc in stringhe letterali). Tutte le dipendenze devono essere isolati in codice che viene caricato utilizzando Class.forName(String)
DOPO aver determinato se o non GAE è presente.
Questo rappresenta un overhead non banale:
- È probabilmente finire con un'interfaccia adattatore supplementare e (almeno) due implementazioni per i casi GAE e non GAE.
- Hai il (minore) le spese generali di runtime di caricare dinamicamente relativa classe in fase di avvio, e chiamando attraverso l'interfaccia dell'adattatore.
- Il file JAR è che molto più grande di conseguenza.
- A questo punto è necessario testare su due piattaforme.
D'altra parte, si ha il potenziale vantaggio di avere un JAR che le opere in contesti GAE e non GAE.
Come spiegato qui è possibile controllare la seguente proprietà:
String environment = System.getProperty(
"com.google.appengine.runtime.environment")
environment
è "Production" durante l'esecuzione su App Engine, e "sviluppo" durante l'esecuzione in server di sviluppo.
ho visto nessuna soluzione type-safe qui ecco che è:
if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
// The app is running on App Engine...
}
C'è un altro modo per fare questo. Questo è spiegato bene nella documentazione del gaevfs su come scrivere codice portabile: http://code.google .com / p / gaevfs / wiki / ApplicationPortability
Di interesse per voi è la seguente riga:
boolean isGoogleAppEngine = getServletContext().getServerInfo().contains( "Google" );