请帮我了解Flux.join参数

时间:2019-06-08 18:34:30

标签: java project-reactor

我有两个带有时间戳记事件的通量,它们以不同的速率发出,并且我想根据它们重叠的时间窗口将它们组合成单个复合通量。这似乎是Flux.join的教科书用法,但是我无法弄清楚为几个参数提供什么。根据{{​​3}},参数为:

  • other-另一个与项目关联的发布者
  • leftEnd-返回发布者的函数,该发布者的发射表明要考虑源值的时间窗口
  • rightEnd-返回发布者的函数,该发布者的发射指示要考虑的正确发布者值的时间窗
  • resultSelector-一个函数,该函数接受每个发布者发出的项目并返回要由结果Flux发出的值

我知道other是要加入的第二个通量,并且resultSelector是将每个通量的单个值组合为结果或合计值以在新通量上输出的函数。但是我无法绕开leftEndrightEnd。它们的目的必须是使联接运算符能够确定2个通量中的哪个值在时间上重叠。但是,为什么这些函数必须返回发布者,并且两个发布者可以具有不同的值类型呢?天真地,我希望必须为每个输入通量生成一个函数,以提取每个值的时间戳或时间段以及可以确定它们是否重叠的比较器,因此显然我对此没有“了解”

可能有一个例子。我们假设两个输入通量具有相同的值类型,包括一个String以及一个由beginTime和endTime表示的时间段,它们都是很长的毫秒数,即

class ValueClass {
    String text;
    long beginTime;
    long endTime;
}

为简单起见,我将值写为{“ A”,0,250},用文本=“ A”,beginTime = 0和endTime = 250表示ValueClass对象。现在,假设这两个输入通量产生以下值:

leftFlux: {"A", 0, 249}, {"B", 250, 499}, {"C", 500, 749}, {"D", 750, 999}
rightFlux: {"X", 0, 333}, {"Y", 334, 666}, {"Z", 667, 999}

在时间轴上,我可以大致如下所示:

A   B   C   D
X     Y    Z

基于此,我希望加入的助焊剂产生字符串值:

"AX", "BX", "BY", "CY", "CZ", "DZ".

完成此操作的代码应类似于:

leftFlux.join(
    rightFlux,
    new Function<ValueClass, Publisher<something>>() {
            @Override
            public Publisher<something> apply(ValueClass v) {
                return some-publisher;
            }
        },
    new Function<ValueClass, Publisher<something>>() {
            @Override
            public Publisher<something> apply(ValueClass v) {
                return some-publisher;
            }
        },
    new BiFunction<ValueClass, ValueClass, String>() {
        public String apply(ValueClass l, ValueClass r) {
            return l.text + r.text;
        }
    }
);

发布者应为哪种值类型(上述代码中的“某物”)?那些出版商应该产生哪些价值?


更新

即使查看了Reactor Core中包含的(很少)测试用例,我仍然无法理解Flux.join的预期用途。但是,我为我的情况找到了另一种解决方案。我建立了一个使用内部类订阅两个通量的类,将它们的项目放在显式队列中,然后逐步对其进行处理,并通过DirectProcessor生成结果项目。

0 个答案:

没有答案