2017-03-07 28 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,以便其他類實例可以訪問它 - 或者提供幫助程序方法以更直接地執行查詢。 –