【发布时间】:2017-04-27 02:19:25
【问题描述】:
我有一个问题,就是简单的业务逻辑流程:
查看多个部门的员工,部门与员工的关系是否在缓存中,先查看缓存中是否存在关系,如果存在,查看是否存在 员工属于它,如果不在缓存中,则从数据库中获取,并检查与员工的关系,然后将部门信息保存到缓存中。
这是代码:
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());
}
问题是departmentInfoExsitInCache 和saveResult 会被客户端方法subscribe 解决两次。
我发现一旦删除保存订阅代码.doOnCompleted(saveResult.subscribe()),它就会变得正常并且只解决一次。这段代码有什么问题吗?
【问题讨论】:
标签: rx-java reactive-programming side-effects