2017-04-21 7 views
1

나는 비슷한 질문을했지만, 아는 한 자바와 관련이 없다. Firebase 데이터베이스에 연결하는 AWS 람다 함수를 호출하고 싶습니다. 문제는 Firebase에서 필요한 데이터를 얻기 전에 핸들러가 실행된다는 것입니다.AWS 람다에서 (Firebase) 콜백을 기다리는 방법은 무엇입니까?

@Override 
public String handleRequest(Request input, Context context) { 
    try { 
     FileInputStream serviceAccountInputStream = new FileInputStream(FIREBASE_SERVICE_ACCOUNT_CREDENTIALS_PATH); 

     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setCredential(FirebaseCredentials.fromCertificate(serviceAccountInputStream)) 
       .setDatabaseUrl(FIREBASE_DATABASE_URL) 
       .build(); 
     FirebaseApp.initializeApp(options); 

     DatabaseReference ref = FirebaseDatabase 
       .getInstance() 
       .getReference("users/" + input.getUid()); 
     ref.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       System.out.print(dataSnapshot); 
       // TODO: Do computations on data and return results 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       System.out.print("Canceled"); 
       // TODO: Return error 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    // TODO: Return computed results 
    return "This could be the start of something new."; 
} 

Firebase 데이터베이스에서 데이터를 읽고 일부 계산을 수행하고 계산 된 결과를 사용자에게 반환해야합니다. 이것을 어떻게 할 수 있습니까? :)

답변

0

CountDownLatch를 사용하여 비동기 코드가 완료 될 때까지 기다릴 수 있습니다. 당신이 래치 카운트 다운 콜백 메소드의 끝에서 다음

final CountDownLatch countDownLatch = new CountDownLatch(1); 

:

는 비동기 코드를 호출하기 전에 당신은 해, CountDownLatch를 만들 다음

countDownLatch.countDown(); 

을 당신이 기다리는 비동기 방법 후 카운트 다운 될 CountdownLatch :

waitForCountdownLatch(countDownLatch); 

private static void waitForCountdownLatch(CountDownLatch countDownLatch) { 
    try { 
     countDownLatch.await(); 
    } catch (InterruptedException e) { 
     log.error(e); 
     e.printStackTrace(); 
    } 
} 

따라서 코드는 다음과 같습니다.

@Override 
public String handleRequest(Request input, Context context) { 

    final CountDownLatch countDownLatch = new CountDownLatch(1); 
    final Object[] singleValue = new Object[1]; 
    final DatabaseError[] firebaseError = new DatabaseError[1]; 

    try { 
     FileInputStream serviceAccountInputStream = new FileInputStream(FIREBASE_SERVICE_ACCOUNT_CREDENTIALS_PATH); 

     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setCredential(FirebaseCredentials.fromCertificate(serviceAccountInputStream)) 
       .setDatabaseUrl(FIREBASE_DATABASE_URL) 
       .build(); 
     FirebaseApp.initializeApp(options); 

     DatabaseReference ref = FirebaseDatabase 
       .getInstance() 
       .getReference("users/" + input.getUid()); 

     ref.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       System.out.print(dataSnapshot); 
       Object snapshotValue = dataSnapshot.getValue(); 
       if(snapshotValue != null) { 
        singleValue[0] = snapshotValue; 
       } 
       countDownLatch.countDown(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       System.out.print("Canceled"); 
       firebaseError0] = databaseError; 
       countDownLatch.countDown(); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     countDownLatch.countDown(); 
    } 

    waitForCountdownLatch(countDownLatch); 
    if(firebaseError[0] != null) { 
     System.out.print(firebaseError[0].toException().getMessage()); 
    } 
    if(singleValue[0] != null) { 
     // do something with result 
    } 
    return "This could be the start of something new."; 
} 

private void waitForCountdownLatch(CountDownLatch countDownLatch) { 
    try { 
     countDownLatch.await(); 
    } catch (InterruptedException e) { 
     log.error(e); 
     e.printStackTrace(); 
    } 
} 
관련 문제