查询RxJava observeOn调度程序线程

时间:2017-04-25 12:19:59

标签: java rx-java vert.x rx-java2

我必须根据传入的请求写入文件。由于多个请求可能同时发生,我不希望多个线程试图一起覆盖文件内容,这可能导致丢失一些数据。

因此,我尝试收集所有请求&#39;使用var html = "<a href=\"#\" id='removeBtn' class='glyphicon glyphicon-remove'></a>"; $('#conversations').append("<li id=" + id + "><a href=\"#\" class=\"list-group-item\"><span>" + conversation.name + "</span></a>" + html + "</li>"); 的实例变量的数据。我在init期间订阅了PublishSubject,这个订阅将在整个应用程序的生命周期中保留。另外,我在一个单独的线程上观察相同的实例(由Vertx事件循环提供),该线程调用负责编写文件的方法。

publishSubject

稍后在请求处理期间,我拨打private PublishSubject<FileData> publishSubject = PublishSubject.create(); private void init() { publishSubject.observeOn(RxHelper.blockingScheduler(vertx)).subscribe(fileData -> writeData(fileData)); } ,如下所示:

onNext

据我所知,当我调用handleRequest() { //do some task publishSubject.onNext(fileData); } 时,数据将排队,由onNext运算符分配的特定线程写入文件。但是,我试图理解的是

  1. 此线程是否在WAITING状态下被阻止 任务?或者,
  2. 在没有文件时也会用于其他活动 写作发生了? 我不希望最终有一个来自vertx事件循环的线程在等待状态下浪费,以便采用这种方法。另外,如果有的话,请建议任何更好的方法。
  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

实际上RxJava会为你做,根据定义onNext()排放将以连续方式行事:

  

Observables必须连续向观察者发出通知(不是并行)。他们可能会从不同的线程发出这些通知,但通知之间必须存在正式的事先关系。 (Observable Contract

因此,只要您在订阅者的RxHelper.blockingScheduler(vertx)内运行阻塞调用(并且不会手动将工作分叉到另一个线程),您就可以了,并且不会发生并行写入。

实际上,您的担忧应该来自相反的方向 - Backpressure    你应该在这里选择你的背压策略,好像请求会更快,然后你将处理它们(写入文件)你可能会溢出缓冲区并陷入麻烦。 (考虑使用Flowable并根据您的需要选择背压策略。

关于你的问题,这取决于调度程序,你使用AUTO_INCREMENT看起来像你的自定义代码,所以我不能告诉,如果调度程序在工作队列中使用共享线程时尚,它不会闲着。
无论如何,Rx不会为您确定这一点,调度程序的职责是根据其逻辑将工作分配给某个线程。