我读了一些RxJava中的背压文档,但我找不到详细的解释,比如它是如何在库中内部发生的,每个人都只是总结说“生产者”太快,“消费者”太慢。
例如,如下面的代码:
Observable.interval(1, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.newThread())
.subscribe(
i -> {
System.out.println(i);
try {
Thread.sleep(100);
} catch (Exception e) { }
},
System.out::println);
我已经看过了RxJava源代码,所以我的理解是,在主线程中,我们将每毫秒发出一次事件,一旦发出,我们就将值传递给系统。出来println(i)方法,并将其扔进newhead调度器的线程池,然后在可运行程序中运行该方法。
所以我的问题是,异常是如何在内部发生的?因为当我们调用线程时。sleep(),我们只是在Hibernate处理方法调用的线程-
谢谢
你可以把背压想象成一个系统,允许一个操作员向其上游源头伸出手来:你可以给我128个元素。稍晚一点,这个操作员可能会说“好的,再给我96个”,所以总共可能有224个未完成的许可证。一些源,比如interval
不关心许可证,只是定期分发值。由于许可证的数量通常与队列或缓冲区中的可用容量密切相关,因此分发超过这些存储容量的许可证可以容纳收益率MissingBackpressureException
。
检测背压违规主要发生在有界队列的offer
返回false时,例如观察
中指示队列已满的那个。
检测违规行为的第二种方法是通过跟踪操作员中未完成的许可计数,例如onBackpressureDrop
,并且每当上游发送超过这个数时,操作员就不会转发它:
// in onBackpressureDrop
public void onNext(T value) {
if (emitted != availablePermits) {
emitted++;
child.onNext(value);
} else {
// ignoring this value
}
}
子订阅者通过request()发出许可信号,这通常会导致onBackpressureDrop
中出现类似的情况:
public void childRequested(long n) {
availablePermits += n;
}
实际上,由于可能的异步执行,availablePermits
是一个AtomicLong
(被称为request
)。
我们也正在手动更新成功提交后的偏移。KafkaTransactionManager用于维护事务。由于消息是通过RestController发布到firstTopic的,我们的@Transactional从那里开始,在偏移更新时结束。为此,我们使用executeInTransaction()。 Kafka造型 Rest控制器 这是解决生产者失败的正确方法吗? 有没有方法在第10次重试后捕获异常并根据
我正在使用Gluon scenebuilder,我正在用很多可编辑的组合框制作UI(重要的是因为这个问题不会出现在不可编辑的组合框上)。我需要组合框的颜色为红色(或者任何颜色都无关紧要),但是当我在组合框的样式选项卡中使用-fx-background-color和#a80808时,只有框的边框才会变成红色。作为对问题的澄清:场景构建器截图 作为与此相关的第二个问题,我也愿意在应用程序运行时更改颜色
背压有问题。使用发布主题获取发射时的传感器事件,并需要在事务中订阅主题时将数据保存到数据库。 我一直在尝试使用。窗口(100)操作符,这样每当我连续收到100个传感器事件时,我就可以批量插入,但一次只能收到一个项目。订阅 不希望使用缓冲区运算符删除事件。正确的处理方法是什么?
我使用RxJava观察点击几个按钮。 这些订阅将在一个对象上调用不同的函数,这需要几毫秒的时间。这些功能是同步的。 问题是,当按下太多按钮时,会出现背压异常。对我来说,有效的方法是删除几个输入(最好是旧的输入)。RxJava有可能做到这一点吗?
问题内容: GitHub的家伙们最近发布了他们的使用Redis的后台处理应用程序:http : //github.com/defunkt/resque http://github.com/blog/542-introducing- resque 我让它在本地运行,但是我正在努力使其投入生产。有没有人得到: 用于部署工人的Capistrano配方(控制工人数量,重新启动工人等) 将工作人员部署到与运
我试图在我的Android应用程序中使用rx Java中的背压创建无限滚动。我希望它只调用请求的外部服务次数(在调用之后)。但在使用flatmap后,每个