2017-02-01 28 views
0

ist es möglich, Firebase auf App-Engine-Standardumgebung zu verwenden? Ich bin mir bewusst, dass die Standardumgebungs-Threading-Funktionen sehr begrenzt sind und da das Firebase SDK einen Hintergrundsynchronisations-Thread ausführt, ist es möglicherweise nicht kompatibel. Ich habe es ausprobiert und ich habe die folgenden Fehler festgestellt, die ich nicht zu überwinden scheinen:Firebase Admin SDK auf App-Engine-Standard

java.security.AccessControlException: Zugriff verweigert („java.lang.RuntimePermission“ „modifyThreadGroup“

) ist

Hier ist der Servlet-Code:

public class GeneratorServlet extends HttpServlet { 

    FirebaseDatabase database = null; 

    @Override 
    public void init(ServletConfig config) { 
//  ClassLoader classloader = Thread.currentThread().getContextClassLoader(); 
//  InputStream serviceAccount = classloader.getResourceAsStream("serviceAccountKey.json"); 

     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setCredential(FirebaseCredentials.applicationDefault()) 
//    .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
       .setDatabaseUrl("https://app-name.firebaseio.com/") 
       .build(); 

     FirebaseApp defaultApp = FirebaseApp.initializeApp(options); 

     this.database = FirebaseDatabase.getInstance(defaultApp); 

    } 

    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     PrintWriter out = resp.getWriter(); 
     out.println(this.database); 
     this.loadData(); 
    } 

    private void loadData() { 
//  The following line throws the error 
     DatabaseReference ref = this.database.getReference("/publiclyReadable"); 
    } 
} 

Bin ich es falsch mache oder es durch die Beschränkungen der Standardumgebung verursacht wird? Ich entschied mich für die Standardumgebung, weil flexible Version für eine produktive Nutzung noch nicht empfohlen wird.

Danke, Jan

Edit: appengine-web.xml

<?xml version="1.0" encoding="utf-8"?> 

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>doctor-appointment-system</application> 
    <version>0</version> 
    <threadsafe>true</threadsafe> 
    <instance-class>B1</instance-class> 
    <manual-scaling> 
     <instances>1</instances> 
    </manual-scaling> 
    <system-properties> 
     <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> 
    </system-properties> 
</appengine-web-app> 

Edit:

web.xml

<?xml version="1.0" encoding="utf-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5"> 
    <servlet> 
     <servlet-name>generator</servlet-name> 
     <servlet-class>com.example.bookingtimes.GeneratorServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>generatorinfo</servlet-name> 
     <servlet-class>com.example.bookingtimes.GeneratorInfoServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>generator</servlet-name> 
     <url-pattern>/times/generate</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>generatorinfo</servlet-name> 
     <url-pattern>/times/change</url-pattern> 
    </servlet-mapping> 
</web-app> 

build.gradle:

buildscript { // Configuration for building 
    repositories { 
     jcenter() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.google.cloud.tools:appengine-gradle-plugin:+' 
    } 
} 

repositories { // repositories for Jar's you access in your code 
    maven { 
     url 'https://maven-central.storage.googleapis.com' 
    } 
    jcenter() 
    mavenCentral() 
} 

apply plugin: 'java'        // standard Java tasks 
apply plugin: 'war'        // standard Web Archive plugin 
apply plugin: 'com.google.cloud.tools.appengine' // App Engine tasks 

dependencies { 
    providedCompile group: 'javax.servlet', name: 'servlet-api', version: '2.5' 
    compile 'com.google.appengine:appengine:+' 
    compile 'com.google.firebase:firebase-admin:4.1.0' 
} 

appengine { // App Engine tasks configuration 
    run {  // local (dev_appserver) configuration (standard environments only) 
     port = 8080     // default 
    } 

    deploy { 
     stopPreviousVersion = true // default - stop the current version 
     promote = true    // default - & make this the current version 
    } 
} 

group = 'com.example.appengine' 
version = '0.1' 

sourceCompatibility = 1.7 
targetCompatibility = 1.7 

Antwort

-3

Ich wechselte zu App Engine Flexible (was einfach war) und alles funktioniert jetzt.

1

Der Firebase Database-Client kann in App Engine Standard Environment verwendet werden, solange Sie ihn in den manuellen Skalierungsmodus versetzen. Siehe documentation on cloud.google.com.

Wir haben kürzlich ein Problem bei der Verwendung des SDK auf App Engine (release notes) behoben, also stellen Sie sicher, dass Sie die neueste Version verwenden.

+0

Vielen Dank für eine schnelle Antwort. Nach all Ihren Ratschlägen (auf manuelle Skalierung umgestellt und die Bibliothek von 4.1 auf 4.1.1 aktualisiert) bekomme ich immer noch den Fehler. Der Fehler tritt nur in der lokalen Umgebung auf, aber das liegt daran, dass er auf dem Server unterdrückt wird. Einen schönen Tag noch –

+0

@ JanBeneš: Einer unserer Ingenieure hat versucht das Problem zu reproduzieren, leider aber bisher erfolglos. Können Sie Ihre web.xml auch teilen, damit wir sehen können, wie Ihre GAE-Handler dort konfiguriert sind? –

+1

Ich habe dem ursprünglichen Post eine Datei hinzugefügt. Danke –

Verwandte Themen