У меня есть DeferredTask в проекте App Engine для асинхронного импорта данных в Firestore, который выглядит примерно так:
public void run() {
FirestoreOptions options = ...
try (Firestore db = options.getService()) {
CollectionReference placesCollection = db.collection("MyCollection");
Map<String, Object> data = new HashMap<>();
data.put("key", "value");
DocumentReference doc = placesCollection.document("MyId");
doc.set(data)
} catch (Exception e) {
...
}
}
Код выполняется без ошибок, но после завершения метода я вижуисключение в консоли, и в мою коллекцию не было записано никаких данных:
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@7be031d1 rejected from java.util.concurrent.ScheduledThreadPoolExecutor@6808a2d4[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:326)
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:533)
Если я жду завершения записи, я не вижу исключения:
doc.set(data).get(); // block for write to complete
Является липроблема в том, что мое соединение Firestore закрывается при выходе из области try-with-resources, или что вам просто нужно дождаться завершения ApiFuture, возвращаемого set ()?Я думал, что идея асинхронных записей Firestore заключается в том, что вы можете запустить их, и если вам не нужно завершать, вам не нужно ждать.