我必须根据传入的请求写入文件。由于多个请求可能同时发生,我不希望多个线程试图一起覆盖文件内容,这可能导致丢失一些数据。
因此,我尝试收集所有请求&#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
运算符分配的特定线程写入文件。但是,我试图理解的是
提前致谢。
答案 0 :(得分:1)
实际上RxJava会为你做,根据定义onNext()
排放将以连续方式行事:
Observables必须连续向观察者发出通知(不是并行)。他们可能会从不同的线程发出这些通知,但通知之间必须存在正式的事先关系。 (Observable Contract)
因此,只要您在订阅者的RxHelper.blockingScheduler(vertx)
内运行阻塞调用(并且不会手动将工作分叉到另一个线程),您就可以了,并且不会发生并行写入。
实际上,您的担忧应该来自相反的方向 - Backpressure 你应该在这里选择你的背压策略,好像请求会更快,然后你将处理它们(写入文件)你可能会溢出缓冲区并陷入麻烦。 (考虑使用Flowable并根据您的需要选择背压策略。
关于你的问题,这取决于调度程序,你使用AUTO_INCREMENT
看起来像你的自定义代码,所以我不能告诉,如果调度程序在工作队列中使用共享线程时尚,它不会闲着。
无论如何,Rx不会为您确定这一点,调度程序的职责是根据其逻辑将工作分配给某个线程。