我正在寻找替换本地日志处理库,它与io.projectreactor
非常接近ReactiveStreams。目标是减少我们维护的代码,并利用社区添加的任何新功能(瞄准运营商融合)。
首先,我需要使用stdio并将多行日志条目合并到流向管道的文本blob中。在Filebeat文档的multiline log entries章节中详细解释了用例(除了我们希望它在进程中)。
到目前为止,我的代码是:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
Flux<String> lines = Flux.generate(sink -> rethrow(() -> { while (true) sink.next(input.readLine()); }));
Flux<String> logRecordsStr = lines.concatMap(new LogRecordJoiner());
Flux<LogRecord> logRecords = logRecordsStr.map(new LogRecordMapper());
logRecords.doOnEach(r -> System.out.printf("%s payload: %d chars\n", r.timestamp, r.payload.length()))
.subscribe();
当检测到新的日志标头时,这会关注多行合并,但在现有库中,我们还会在超时后刷新累积的行(即如果在5秒内没有收到文本,则刷新记录)。
在Reactor中对此进行建模的正确方法是什么?我是否需要编写自己的运算符,还是可以自定义任何现有运算符?
非常感谢在Project Reactor或RxJava中实现此用例的相关示例和文档的任何指示。
答案 0 :(得分:3)
这取决于你如何识别每个缓冲区的开始和结束,所以下面的RxJava 2代码用作关于使用主源的值打开和关闭缓冲区门的提示:
TestScheduler scheduler = new TestScheduler();
PublishProcessor<String> pp = PublishProcessor.create();
Function<Flowable<String>, Flowable<List<String>>> f = o ->
o.buffer(o.filter(v -> v.contains("Start")),
v -> Flowable.merge(o.filter(w -> w.contains("End")),
Flowable.timer(5, TimeUnit.MINUTES, scheduler)));
pp.publish(f)
.subscribe(System.out::println);
pp.onNext("Start");
pp.onNext("A");
pp.onNext("B");
pp.onNext("End");
pp.onNext("Start");
pp.onNext("C");
scheduler.advanceTimeBy(5, TimeUnit.MINUTES);
pp.onNext("Start");
pp.onNext("D");
pp.onNext("End");
pp.onComplete();
打印:
[Start, A, B, End]
[Start, C]
[Start, D, End]
它通过publish
共享源来工作,它允许从上游重用相同的值,而不会同时运行多个源副本。开口由线上“开始”字符串的检测决定。结束由“结束”字符串的检测或宽限期后的计时器触发控制。
修改强>
如果“开始”也是下一批的指示器,您可以用“开始”替换“结束”检查并更改缓冲区的内容,因为它将在前一个缓冲区中包含新标头,否则:< / p>
pp.publish(f)
.doOnNext(v -> {
int s = v.size();
if (s > 1 && v.get(s - 1).contains("Start")) {
v.remove(s - 1);
}
})
.subscribe(System.out::println);
答案 1 :(得分:1)
/* some pig latin code here */
sh mv /user/test/folder_pattern* /path/to/move
/* some pig latin code here */
运算符对我来说似乎是最合适和最简单的解决方案。
它有基于大小和时间的策略。 你有记录,所以我认为,你可以将行数解释为缓冲区大小。
此处示例 - 如何按时间间隔发出按4或5秒分组的项目:
buffer