【问题标题】:Firebase init error in Google App EngineGoogle App Engine 中的 Firebase 初始化错误
【发布时间】:2015-06-11 02:04:55
【问题描述】:

我现在正在 GAE 中开发一个 Java 谷歌云端点。在端点内部,它会尝试连接到 Firebase 服务器以获取一些数据。

但是,当我在端点中创建 Firebase 对象时,

Firebase ref = new Firebase(<My Firebase URL>);

GAE 抛出以下错误:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:382) 
    at java.security.AccessController.checkPermission(AccessController.java:572) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315) 
    at java.lang.Thread.init(Thread.java:391) 
    at java.lang.Thread.init(Thread.java:349) 
    at java.lang.Thread.<init>(Thread.java:675) 
    at java.util.concurrent.Executors$DefaultThreadFactory.newThread(Executors.java:572) 
    at com.firebase.client.utilities.DefaultRunLoop$FirebaseThreadFactory.newThread(DefaultRunLoop.java:25) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:600) 
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:943) 
    at java.util.concurrent.ThreadPoolExecutor.ensurePrestart(ThreadPoolExecutor.java:1635) 
    at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:307) 
    at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:526) 
    at java.util.concurrent.ScheduledThreadPoolExecutor.execute(ScheduledThreadPoolExecutor.java:615) 
    at com.firebase.client.utilities.DefaultRunLoop.scheduleNow(DefaultRunLoop.java:57) 
    at com.firebase.client.core.Repo.scheduleNow(Repo.java:176) 
    at com.firebase.client.core.Repo.<init>(Repo.java:58) 
    at com.firebase.client.core.RepoManager.getLocalRepo(RepoManager.java:46) 
    at com.firebase.client.core.RepoManager.getRepo(RepoManager.java:19) 
    at com.firebase.client.Firebase.<init>(Firebase.java:194) 
    at com.firebase.client.Firebase.<init>(Firebase.java:199) 
    at com.firebase.client.Firebase.<init>(Firebase.java:177)

我正在使用 Firebase 客户端 2.2.3。似乎 GAE 不允许应用程序创建新线程。有什么想法吗?

【问题讨论】:

    标签: java google-app-engine firebase google-cloud-endpoints


    【解决方案1】:

    在 Google App Engine 的 Java 运行时中,对创建新线程有一些限制。

    详情请见the Threads section

    【讨论】:

      【解决方案2】:

      @Mario 是正确的,App Engine 应用程序可能不会根据docs 产生新线程。这是因为 AppEngine 应用程序运行在沙盒环境中,您有一些限制。如果您仍然想开发您的应用程序而不排除任何限制,那么我建议您尝试Managed VM,您没有这些类型的限制。

      【讨论】:

      【解决方案3】:

      我认为this 链接会对您有所帮助,它描述了我们如何使用服务帐户从服务器应用程序使用 firebase 实时数据库。

      您可以使用以下代码 sn-p 连接到 firebase 数据库。

      // Initialize the app with a service account, granting admin privileges
      FirebaseOptions options = new FirebaseOptions.Builder()
          .setDatabaseUrl("https://databaseName.firebaseio.com")
          .setServiceAccount(new FileInputStream("path/to/serviceAccountCredentials.json"))
          .build();
      FirebaseApp.initializeApp(options);
      
      // As an admin, the app has access to read and write all data, regardless of Security Rules
      DatabaseReference ref = FirebaseDatabase
          .getInstance()
          .getReference("restricted_access/secret_document");
      ref.addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              Object document = dataSnapshot.getValue();
              System.out.println(document);
          }
      });
      

      【讨论】:

      • 这对解决上述问题没有任何帮助。上面的代码将以与原始帖子完全相同的方式失败。
      • 嗨@AaronSarazan,我在发布之前对其进行了测试并且正在运行,如果您遇到任何错误,请在此处发布。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      相关资源
      最近更新 更多