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
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 –
@ 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? –
Ich habe dem ursprünglichen Post eine Datei hinzugefügt. Danke –