后台:我有一个应用程序,我通过以下方式遍历所有用户:
Observable<User> allUsers = fetchAllUsers();
allUsers
.filter(new MyUserFilter())
.flatMap(new UserItemFetcher()) // Expand into stuff I'm interested in.
.filter(new MyItemFilter())
.forEach(new UserItemHandler());
每个UserItemHandler
执行都有点慢,所以我想使用一个线程池进行处理:
ExecutorService threadPool = ...;
Observable<User> allUsers = fetchAllUsers();
allUsers
.filter(new MyUserFilter())
.flatMap(new UserItemFetcher())
.filter(new MyItemFilter())
.forEach(new UserItemHandler(threadPool));
gracefulShutdownOf(threadPool);
,其中
UserItemHandler
代表要完成threadPool
的工作;和threadPool
有一个
RejectedExecutionHandler
阻塞,直到队列有可用的位置。然而,在最好的世界里,我不希望开发人员在使用ExeccutorService
时必须处理UserItemHandler
,所以我重构了
ExecutorService threadPool = ...;
Observable<User> allUsers = fetchAllUsers();
allUsers
.observeOn(Schedulers.from(threadPool))
.filter(new MyUserFilter())
.flatMap(new UserItemFetcher())
.filter(new MyItemFilter())
.forEach(new UserItemHandler());
gracefulShutdownOf(threadPool);
每当我运行上述应用程序时, 问题: OperatorObserveOn
会抛出MissingBackpressureException
。
问题:
MissingBackpressureException
的最佳做法是什么?我不能错过任何物品。observeOn
。我一直在浏览OperatorObserveOn
的实施,而且它非常复杂。我错过了一些明显的东西吗?