У меня есть вопрос, это простой поток бизнес-логики:
проверьте, находится ли в кеше сотрудник из нескольких отделов, отношений между отделами и сотрудниками, сначала проверьте, существуют ли отношения в кеше, если они существуют, проверьте, принадлежит ли им сотрудник, в случае отсутствия в кеше, получите его из базы данных и проверьте отношения о сотруднике, а затем сохраните информацию об отделе в кеш.
это код:
public Observable isEmployeeInDepartment(List<Long> departmentIds, long employeeId){
//this observable will resolve twice, and cause unnecessary cache access
Observable departmentInfoExsitInCache= checkDepartmentInfoFromCache(...).share();
Observable departInfoNotInCache = departmentInfoExsitInCache.filter(...);
//this observable will resolve twice, and cause unnecessary database access
Observable departmentInfoFromDb=departInfoNotInCache.flatMap(departmentIds->checkFromDb()).share();
Observable<Long> saveResult=departmentInfoFromDb.flatMap(departmentInfo->saveToCache());
Observable<Long> departInfoInCache = departmentInfoExsitInCache.filter(...);
return departInfoInCache.check(userId).merge( departmentInfoFromDb.check(userId)).doOnCompleted(saveResult.subscribe());
}
проблема в том, что отделInfoExsitInCache и saveResult будут разрешены дважды при подписке на клиентский метод.
Я обнаружил, что после удаления кода подписки сохранения .doOnCompleted(saveResult.subscribe()) он станет нормальным и разрешится только один раз. Что-то не так с этим кодом?