Java 同步定期更新和创建、更新和删除操作

Java 同步定期更新和创建、更新和删除操作,java,rx-java2,synchronized,thread-synchronization,Java,Rx Java2,Synchronized,Thread Synchronization,我使用Flowable链定期调用用户任务的请求(API) Flowable.interval(60, TimeUnit.SECONDS) .flatMapCompletable(_tick -> mUserRepository.getAllUsers() .flatMapObservable(Observable::fromIterable) .flatMap(user -> downloadAndPersistTasks(user)

我使用
Flowable
链定期调用用户任务的请求(API)

Flowable.interval(60, TimeUnit.SECONDS)
.flatMapCompletable(_tick ->
    mUserRepository.getAllUsers()
    .flatMapObservable(Observable::fromIterable)
    .flatMap(user ->
      downloadAndPersistTasks(user)
      .subscribeOn(Schedulers.io())
    )
    .subscribeOn(Schedulers.io())
  , false, 1
);
方法下载和持久化数据下载每个用户的当前任务,从数据库中删除所有旧任务并持久化下载的任务。可以从服务器端更改用户的任务

问题是下载的持续时间相对较长

本案:

  • 下载任务-开始
  • 插入任务-API调用+保存到数据库-begin
  • 插入任务-API调用+保存到数据库-结束
  • 下载任务-结束(记录中未插入任务)
  • 将下载的记录写入数据库->插入的任务被覆盖
  • 我需要在执行insert API调用时禁用特定用户的数据下载,并在执行定期更新时禁用函数insert任务


    是否有RxJava解决方案,或者是使用Java框架的本机同步原语的最佳选择?但是我不需要跳过定期更新,只需要延迟它。

    我将假设任务插入步骤是在本地完成的,同时还有
    下载和持久化任务()

    让我们介绍一个类型化的联合:
    或者
    。它有静态工厂方法
    other.createLeft(L值)
    other.createRight(R值)
    。它还有类方法:
    isLeft()
    isRight()
    ,和
    getLeft()
    /
    getRight()
    来完成自然的事情

    主题
    用于注入插入任务步骤:

    PublishSubject<InsertTask> taskInserter = PublishSubject.create();
    
    flatMap()
    的第二个参数确保一次只处理一个用户,对于
    mergeWith()
    操作符也是如此。合并第二个流确保一次只执行一个操作,并且
    observeOn()
    操作符将所有操作放在同一个线程上,因此不会出现争用


    如果您需要更高的并行性或更细粒度的控制,则可能需要引入每个用户可观察的操作。

    您在哪里找到了来自Iterable和mergeWith 2个参数的运算符?
    。flatMap()
    采用一个参数,即并行订阅的数量。我在
    mergeWith()
    中犯了一个错误,因为如果您提供一个可观察对象列表,那么
    merge()
    操作符确实会受到并行度限制。我有上面提到的周期更新方法,以及在不同类中创建、更新和删除方法。是否可以使用Java同步原语来解决问题?当我调用insert(update,delete)时,我会禁用(wait)特定用户项目的emmiting,反之亦然。是的,您可以使用Java同步原语。您需要从定期更新代码以及其他类中的create、update和delete方法执行同步。
    Flowable.timer(60, SECONDS)
      .flatMap( tick -> 
          Observable.fromIterable( mUserRepository.getAllUsers() ), 1 )
      .map( t -> Either.createLeft(t) )
      .mergeWith( taskInserter.map( i -> Either.createRight( i ) ), 1 )
      .observeOn( scheduler )
      .subscribe( ti -> {
        if ( ti.isLeft() ) {
          downloadAndPersistTasks( ti.getLeft() );
        } else {
          insertTask( ti.getRight() );
        }
       );