Ich habe einen Dolch-Singleton-Wrapper, der meine grundlegenden Realm-Anfragen behandelt. Einer davon sieht so aus:Realm - Implementieren der asynchronen Warteschlange
public void insertOrUpdateAsync(final List<RealmMessage> messages, @Nullable final OnInsertListener listener) {
Realm instance = getRealmInstance();
instance.executeTransactionAsync(realm -> {
List<RealmMessage> newMessages = insertOrUpdateMessages(realm, messages);
},
() -> success(listener, instance),
error -> error(listener, error, instance));
}
private List<RealmMessage> insertOrUpdateMessages(@NonNull Realm realm, @NonNull final List<RealmMessage> messages) {
...
return realm.copyToRealmOrUpdate(unattendedMessages);
}
Das funktioniert gut.
Allerdings gibt es eine Ecke Fall, wo - lange Geschichte kurz - ich starte insertOrUpdateAsynch() viele, viele Male. Und nach einigen Anfragen, die ich diese:
Caused by: java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Running, pool size = 17, active threads = 17, queued tasks = 100, completed tasks = 81]
Meine Frage ist: Wie soll ich damit umgehen, ohne ganzen Anwendungsfluss wieder aufzubauen. Meine Idee war es, eingehende Anfragen über RxJava in die Warteschlange zu stellen. Habe ich recht? Welche Betreiber sollte ich berücksichtigen und weiterbilden?
Oder nähere ich mich dem völlig falsch? Von den meisten meiner googling habe ich festgestellt, dass das Problem meist in Start-Methode wie meins in einer Schleife ist. Ich benutze keine. In meinem Fall besteht das Problem darin, dass diese Methode von mehreren Antworten gestartet wird und das Ändern aufgrund der aktuellen Backend-Implementierung unmöglich ist.