2017-03-07 34 views
0

我不知道这是非常基本的问题。我正在尝试将Firebase添加到我的Web应用程序服务器端(JAVA),而不是Android项目。我的目标是将更新推送给客户,以便对特定实体进行一些更改。我使用appengine作为db。所以当实体更新时,我需要推送实时数据库,并且客户端(浏览器)侦听更新的节点。我正尝试从建立java连接开始。这下面的代码写道。连接到数据库,但几秒钟后它断开连接。如何检查每个服务器请求的Firebase连接?我如何重新连接?

  1. 我应该再次初始化应用程序?
  2. 此外,一旦它被连接到火力地堡,我一定要检查连接仍然是活动和推动火力地堡?是否需要为每个请求重复?
  3. 有没有更好的方法来写这个?

我非常感谢所有帮助。用Javascript成功实现,但与JAVA结束。提前致谢。

@SuppressWarnings(
     { "unchecked" , "rawtypes" }) 
    public static void initiateFirebaseDB() throws FileNotFoundException 
     { 

      if (FirebaseApp.getApps().isEmpty()) 
       { 

        AccessController.doPrivileged(new PrivilegedAction() 
         { 
          public Object run() 
           { 
            FileInputStream serviceAccount = null; 
            try 
             { 
              serviceAccount = new FileInputStream(/* path to the json file */ ); 
             } 
            catch (FileNotFoundException e) 
             { 
              e.printStackTrace(); 
             } 

            FirebaseOptions options = new FirebaseOptions.Builder() 
              .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
              .setDatabaseUrl(/* db url */).build(); 
            FirebaseApp.initializeApp(options); 

            return null; 
           } 
         }); 
       } 

      DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected"); 
      connectedRef.addValueEventListener(new ValueEventListener() 
       { 
        @Override 
        public void onDataChange(DataSnapshot snapshot) 
         { 
          boolean connected = snapshot.getValue(Boolean.class); 
          if (connected) 
           System.out.println("connected"); 
          else 
           { 
            System.out.println("not connected"); 
           } 
         } 

        @Override 
        public void onCancelled(DatabaseError error) 
         { 
          System.err.println("Listener was cancelled"); 
         } 
       }); 
     } 
+1

您不需要监视连接。 Firebase会在短暂停机后自动重新连接,并同步您在离线时所做的任何更改。这是实时数据库魔法的关键元素。 – Kato

+0

非常感谢你@Kato。我应该在哪里添加用于初始化Firebase应用程序的代码?我已经看到了firebase示例代码,它们已经包含在主函数中。我没有这样的方法。我的服务器只是更新实体值的端点。 –

回答

1

跟踪所连接的状态主要是指移动应用程序,甚至没有真正的火力地堡相关的任务这么多,因为它是检测这些应用程序的网络连接状态发生变化的好方法。这对于移动设备来说通常是一项重要而棘手的任务,因此这基本上是Firebase为这些开发者提供的额外服务。这完全不是必需的,并且大量的应用程序被编写为从不听这个值。

的火力地堡数据库服务是指被视为“神奇”单身:你应该写你的代码,就好像“它只是工作”。有些通话确实有报告错误的能力,您应该在这种情况下处理它们。但总的来说,在处理数据更新的编码方面,您不应该花太多时间考虑与服务器的连接。只要做他们,他们应该工作。

火力地堡也是“最终一致”,“最后一次写入胜”的数据库,你应该建筑师你周围的概念做什么。在新闻快报中,我们会定期用新的值(服务器端)覆盖现有值,而不必检查是否需要更新。假设您的服务器节点已经死机,必须重新启动,或者出现网络错误,并且更新已被删除且无法恢复?假设写入被拒绝是因为另一次写入首先到达那里?

火力地堡提供任何机制来确定什么使它通过。比你想象的要多一点点,可以为你的应用程序提供一种“自我修复”的措施。别忘了,Firebase的一大特色就是大规模/容量。这不是一件好事,这是一个实际的功能,你应该在这里利用它。

+0

非常感谢你@Chad。我应该在哪里添加用于初始化Firebase应用程序的代码?我已经看到了firebase示例代码,它们已经包含在主函数中。我没有这样的方法。我的服务器只是更新实体值的端点。 –

+0

@Kato&Chad - 编辑 - 对于每个请求,我调用一个方法来初始化firebase db,它检查是否(FirebaseApp.getApps()。isEmpty()),然后初始化为空。这是正确的方法吗? –

+0

如果不知道更多关于应用程序体系结构的信息,很难说,但通常情况下可以创建一个数据库单例,并在那里执行Firebase init。然后,数据库单例可以公开Firebase root ref,以便其他类实例可以访问它 - 或者提供帮助程序方法以更直接地执行查询。 –