0

Java의 엔드 포인트에서 admin SDK를 통해 firebase realtime db에 액세스하려고합니다. 인증은 성공한 것 같지만 질의는 효과가 없습니다. 오류가 발생하지 않고 리스너가 호출되지 않습니다. Firebase 규칙은 쓰기 가능으로 설정됩니다 (시뮬레이터로 보장됨).Java의 엔드 포인트에서 Firebase admin

중포 기지 DB :

mydbid 
     +---users 
      +---user0 
       +---email:[email protected] 

끝점 정의 :

@Api(
    name = "firebaseTestEndpoint", 
    version = "v1", 
    description = "Firebase admin test endpoint.") 

public class FirebaseTestService { 
    private static final Logger log = 
    Logger.getLogger(FirebaseTestService.class.getName()); 
    static { 
     log.setLevel(Level.INFO); 
    } 

@ApiMethod(httpMethod = HttpMethod.POST) 
public void connectToFirebase(@Named("id") String id, 
           ServletContext servletContext) { 

    Map<String, Object> authVars = new HashMap<String, Object>(); 
    authVars.put("uid", "admin"); 

    try { 
     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setDatabaseUrl("https://mydbid.firebaseio.com")    
       .setCredential(FirebaseCredentials.fromCertificate(
        servletContext.getResourceAsStream(
         "/WEB-INF/firebase-credentials.json"))) 
       .setDatabaseAuthVariableOverride(authVars) 
       .build(); 
     FirebaseApp app = FirebaseApp.initializeApp(options); 
     DatabaseReference ref = 
    FirebaseDatabase.getInstance().getReference("https://stackoverflow.com/users/user0/email"); 
     ValueEventListener valueEventListener = 
    ref.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot arg0) { 
       log.info(arg0.getRef().getPath().toString() + 
         " changed to " + arg0.getValue(String.class)); 
      } 

      @Override 
      public void onCancelled(DatabaseError arg0) { 
       log.info("cancelled"); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@ApiMethod(httpMethod = HttpMethod.POST) 
public void updateEmail(@Named("id") String id) { 

    Map<String,Object> values = new HashMap<String,Object>(); 
    values.put("email", "[email protected]"); 
    try { 
     FirebaseDatabase.getInstance().getReference("https://stackoverflow.com/users/user0") 
     .updateChildren(values, new DatabaseReference.CompletionListener() { 
      public void onComplete(DatabaseError databaseError, 
            DatabaseReference databaseReference) { 
       if (databaseError != null) { 
        throw databaseError.toException(); 
       } 
       log.info("update completed."); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

애플리케이션 엔진의 web.xml - (관련 부품)

<basic-scaling> 
    <max-instances>2</max-instances> 
</basic-scaling> 

의 web.xml (관련 부품, 우주 * 앞에 삽입) :

<servlet> 
    <servlet-name>EndpointsServlet</servlet-name> 
    <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class> 
    <init-param> 
    <param-name>services</param-name> 
    <param-value>mypackage.FirebaseTestService</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>EndpointsServlet</servlet-name> 
    <url-pattern>/_ah/api/ *</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>SystemServiceServlet</servlet-name> 
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class> 
    <init-param> 
    <param-name>services</param-name> 
    <param-value>mypackage.FirebaseTestService</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>SystemServiceServlet</servlet-name> 
    <url-pattern>/_ah/spi/ *</url-pattern> 
</servlet-mapping> 

API 탐색기에서 테스트 된 connectToFirebase() 호출 다음에 _ah/background에 대한 요청이 있지만 updateEmail()은 요청하지 않습니다. 무엇이 잘못 되었나요?

+0

데이터베이스 수신기는 별도의 백그라운드 스레드에서 실행됩니다. 리스너가 실행되기 전에 요청 스레드가 리턴됩니다. 당신이 그들을 기다리고, 그것이 어떤 차이를 만드는 지 볼 수 있니? 대기중인 작업 API를 사용할 수 있습니다 : https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/tasks/Tasks –

+0

Tasks.await (작업)에서 DEADLINE_EXCEEDED 오류입니다. 반환되었습니다. 백그라운드 스레드가 작업을 완료 할 수없는 것 같습니다. –

+0

Firebase SDK 버전을 확인할 수 있습니까? 또한 ThreadManager API를 사용하여 인스턴스에 실제로 백그라운드 스레드가 지원되는지 확인할 수 있습니다. https://cloud.google.com/appengine/docs/standard/java/runtime#background_threads_1 –

답변

0

AppEngine에서 firebase 리스너를 사용하려면 기본 배율을 수동 배율로 변경하십시오.

<manual-scaling> 
    <instances>1</instances> 
</manual-scaling> 

당신이 기본 또는 AppEngine에 인스턴스의 자동 확장을 사용하려면

전화를 휴식을 중포 기지 청취자를 변경합니다.

+0

감사합니다. –

관련 문제