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()은 요청하지 않습니다. 무엇이 잘못 되었나요?
데이터베이스 수신기는 별도의 백그라운드 스레드에서 실행됩니다. 리스너가 실행되기 전에 요청 스레드가 리턴됩니다. 당신이 그들을 기다리고, 그것이 어떤 차이를 만드는 지 볼 수 있니? 대기중인 작업 API를 사용할 수 있습니다 : https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/tasks/Tasks –
Tasks.await (작업)에서 DEADLINE_EXCEEDED 오류입니다. 반환되었습니다. 백그라운드 스레드가 작업을 완료 할 수없는 것 같습니다. –
Firebase SDK 버전을 확인할 수 있습니까? 또한 ThreadManager API를 사용하여 인스턴스에 실제로 백그라운드 스레드가 지원되는지 확인할 수 있습니다. https://cloud.google.com/appengine/docs/standard/java/runtime#background_threads_1 –