Запускается запрос для извлечения записей из таблицы один за другим, которые являются получателями электронной почты. После отправки электронного письма получателю, статус отправки обновляется для получателя. Таблица, в которой хранится этот статус, связана с таблицей, используемой для хранения фактических сообщений, подлежащих отправке. Поскольку я использую Room, запрос на получение сообщения для отправки автоматически запускается снова. Это будет продолжаться до тех пор, пока всем получателям не будет отправлено электронное письмо. Это работает с потоком Rx ниже. У меня проблема в том, что после того, как последнее электронное письмо отправлено, запрос не вызывает исключение EmptyResultSetException, что я и ожидаю, когда больше записей не найдено. Без этого исключения я не могу знать, когда все электронные письма были отправлены.
val msgToSendPublisher = BehaviorSubject.createDefault(0)
msgToSendPublisher.flatMap { startPos -> App.context.repository.getMessageToSend() }
.flatMap { messageToSend ->
App.context.repository.sendMessage(messageToSend)
.doOnError {
messageToSend.failureSending = true
}
}
.zipWith( // 1 second delay between emissions.
Observable.interval(1, TimeUnit.SECONDS),
BiFunction { item: MessageToSend, _: Long -> item })
.flatMap { messageToSend ->
App.context.repository.storeMessageSent(messageToSend)
.doOnError {
messageToSend.failureSending = true
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ messageToSend ->
},
{ ex ->
if (ex is EmptyResultSetException) {
} else {
}
},
{
// Done
}
)
DAO
@Query(
"SELECT blah blah blah"
)
fun getMessageToSend(): Observable<MessageToSend>
MessageToSend.kt
class MessageToSend(
var content: String? = null,
var chatId: String? = null,
var firstName: String? = null,
var lastName: String? = null,
var totalMessagesToSend: Int? = null
): MessageRecipientBase()
Что может помешать исключению EmptyResultSetException? Или это брошено, но поймано где-то, о котором я не знаю. У меня есть подозрение, что Room выдает это исключение только при явном выполнении запроса. Но если запрос выполняется из-за того, что Room заставляет запрос выполняться после обновления данных в связанной таблице, вполне возможно, что Room может решить не генерировать никаких исключений.
ПРИМЕЧАНИЕ. Я установил точку останова на каждом из обработчиков doOnError, а также обработчике ошибок в подписчике, но ни один из них не получил удар.