RxJava2批处理项目

时间:2018-02-09 11:52:58

标签: java rx-java2

我有一个连续生成的日志流,即只要系统中有新日志可以调用的方法。我不想在每次生成日志时处理日志(因为日志是每毫秒左右生成的)。

我想收集一段时间内发出的日志,比如5秒,然后批量处理。

如何使用rxjava实现此目的。

我尝试过像

这样的东西
private static void logResults(LogData logData) {
        Observable.create((ObservableOnSubscribe<LogData>) e -> {
            e.onNext(logData);
        }).buffer(5, TimeUnit.SECONDS).subscribeWith(new DisposableObserver<List<LogData>>() {
            @Override
            public void onNext(List<LogData> logData) {
               System.out.print(logData.toString()));
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onComplete() {
            }
        });
    }


 /**
    This method get called every time when new log is there
  */
  public static void logGenerated(LogData log) {
     logResults(log);
  }

1 个答案:

答案 0 :(得分:4)

您需要创建一个在多个logResults调用中保持活动状态的流。最简单的方法是使用静态PublishSubject

private static final Subject<LogData> subject =
    PublishSubject.<LogData>create(); // .toSerialized();

private static final Disposable logProcessing =
    subject.buffer(5, TimeUnit.SECONDS)
    .subscribeWith(new DisposableObserver<List<LogData>>() {
        @Override
        public void onNext(List<LogData> logData) {
           System.out.print(logData.toString()));
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onComplete() {
        }
    });

private static void logResults(LogData logData) {
    subject.onNext(logData);
}


/**
 * This method get called every time when new log is there
 */
public static void logGenerated(LogData log) {
    logResults(log);
}