使用Observable#observeOn时如何避免MissingBackpressureException?

时间:2016-05-21 14:00:00

标签: java rx-java

后台:我有一个应用程序,我通过以下方式遍历所有用户:

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

问题:

  1. 在没有1)buffering all items into memory或2)dropping items的情况下,避免MissingBackpressureException的最佳做法是什么?我不能错过任何物品。
  2. 作为一种解决方法,我基本上实现了my own simple observeOn。我一直在浏览OperatorObserveOn的实施,而且它非常复杂。我错过了一些明显的东西吗?

0 个答案:

没有答案