Java 将通量输入与先前的和映射相结合 问题:

Java 将通量输入与先前的和映射相结合 问题:,java,project-reactor,Java,Project Reactor,有流量时,如何访问上一个元素 背景 我有一个外部事件流,它按顺序给出事件,该流的顺序是分派一个事件,然后立即分派另一个事件。但是,第二个事件的元数据位于第一个事件中 请注意,事件的数量并不总是偶数 我想做的是将这些事件组合成一个事件流,供下游用户使用 Flux#zip看起来很有希望,但这意味着返回一个外部事件类型的对象 初始码 到目前为止,我得到的是 BinaryLogClient client = new BinaryLogClient(host, port, username, pa

有流量时,如何访问上一个元素

背景 我有一个外部事件流,它按顺序给出事件,该流的顺序是分派一个事件,然后立即分派另一个事件。但是,第二个事件的元数据位于第一个事件中

请注意,事件的数量并不总是偶数

我想做的是将这些事件组合成一个事件流,供下游用户使用

Flux#zip
看起来很有希望,但这意味着返回一个外部事件类型的对象

初始码 到目前为止,我得到的是

    BinaryLogClient client = new BinaryLogClient(host, port, username, password);
    Flux<Event> bridge = Flux.create(sink -> {
        EventListener fluxListener = event -> {
            sink.next(event);
        };

        client.registerEventListener(fluxListener);
    });

    bridge.subscribe(DemoApplication::printEvent);
    bridge.map(new EventPairMemorizer());


public class EventPair  {
    private final Event previous;
    private final Event current;

    public EventPair(Event previous, Event current) {
        this.previous = previous;
        this.current = current;
    }

    /**
     * @return `null` if no previous events.
     */
    public Event getPrevious() {
        return previous;
    }

    public Event getCurrent() {
        return current;
    }
}

/**
 * Not thread safe has to go on a single thread
 */
public class EventPairMemorizer implements Function<Event, EventPair> {
    Event previous = null;

    EventPair toPair(Event e) {
        EventPair pair = new EventPair(previous, e);
        previous = e;
        return pair;
    }

    @Override
    public EventPair apply(Event current) {
        return toPair(current);
    }
}
BinaryLogClient=newbinarylogclient(主机、端口、用户名、密码);
通量桥=通量。创建(接收器->{
EventListener fluxListener=事件->{
下一个(事件);
};
client.registerEventListener(fluxListener);
});
订阅(DemoApplication::printEvent);
map(新的EventPairMemorizer());
公共类事件对{
私人决赛之前;
私人最终事件当前;
公共事件对(上一个事件、当前事件){
this.previous=先前;
这个电流=电流;
}
/**
*@return`null`如果没有以前的事件。
*/
公共事件getPrevious(){
返回上一个;
}
公共事件getCurrent(){
回流;
}
}
/**
*非线程安全必须在单个线程上运行
*/
公共类EventPairMemorizer实现函数{
Event-previous=null;
事件对toPair(事件e){
EventPair=新的EventPair(上一个,e);
先前=e;
返回对;
}
@凌驾
公共事件对应用(当前事件){
返回顶部空气(当前);
}
}
这部分是学习练习,部分是概念验证

无关细节 我正在尝试使用mysql binlog connector java获取数据库中更改内容的流

因此,如果我收到一个
EXT\u WRITE\u ROWS
事件,那么上一个事件就是
TABLE\u MAP
事件。然后,我想在
TABLE\u MAP
事件上进行列查找(使用jdbc)。然后转换为JSON友好的内部结构

这同样适用于
EXT\u UPDATE\u ROWS
事件

所以idea代码看起来像

  • 一个外部推动流量
  • 检查事件类型。如果匹配,使用Mono在jdbc线程上调用jdbc
  • 结合单声道和当前事件
  • 映射到内部类型
  • 发射到不同的流
  • 利润

  • 重叠缓冲区怎么样

    使用
    buffer(2,1)
    可以为每个元素打开一个缓冲区,每个缓冲区包含2个元素


    然后,您可以忽略不以您感兴趣的事件结束的缓冲区,并获取您感兴趣的事件的上一个值…

    重叠缓冲区如何

    使用
    buffer(2,1)
    可以为每个元素打开一个缓冲区,每个缓冲区包含2个元素

    然后,您可以忽略不以您感兴趣的事件结束的缓冲区,并获取您感兴趣的事件的上一个值…

    您可以使用
    .scan()

    Flux pairs=bridge.scan(新事件对(null,null),(prevPair,newEvent)->
    新事件对(prevPair.current,newEvent)
    );
    
    您可以使用
    .scan()

    Flux pairs=bridge.scan(新事件对(null,null),(prevPair,newEvent)->
    新事件对(prevPair.current,newEvent)
    );
    
    注意,当需要访问序列中的过去元素时,反应式编程不一定是最佳选择:尽管有一些方法可以实现,它们比简单的命令式解决方案更迂回problems@SimonBasl但他也同意,这在一定程度上是一种学习活动。我在过去用vert.x做过一些编码,但这是不同的,我正在努力学习它是如何完成的。还有有效连接到事件流的想法,在我看来,转换和提供另一个事件流似乎是Ractor的目的,但我可能弄错了。注意,当需要访问序列中的过去元素时,反应式编程并不一定是最合适的:尽管有一些方法可以实现,它们比简单的命令式解决方案更迂回problems@SimonBasl但他也同意,这在一定程度上是一种学习活动。我在过去用vert.x做过一些编码,但这是不同的,我正在努力学习它是如何完成的。同样,在我看来,有效地连接到一个事件流、转换和提供另一个事件流的想法似乎是莱克托的目的,但我可能弄错了。这似乎是合理的,而且似乎是可行的。我不喜欢通量的界面,因为它看起来比实际可接受的更通用。然而,这似乎也是一个很好的折衷方案。这似乎是合理的,而且似乎是可行的。我不喜欢通量的界面,因为它看起来比实际可接受的更通用。然而,这似乎也是一个很好的权衡。
    Flux<EventPair> pairs = bridge.scan(new EventPair(null,null),(prevPair,newEvent)->
      new EventPair(prevPair.current,newEvent)
    );