当前位置: 首页 > 知识库问答 >
问题:

如何检查结果元素流中包含的2个或更多值的内容-通量(spring WebFlux)

戚衡
2023-03-14

我有一个方法可以验证Stream中包含的一些元素。

  • 任务

例如,有一个序列有一系列数字(数字不重复),每个数字都比另一个大:

1, 20, 35, 39, 45, 43

... 有必要检查此流中是否存在指定范围,例如35。。。如果没有这样的范围,那么你需要抛出一个异常。

但由于这是异步处理,通常的方法在这里不起作用。毕竟,我们处理流中的元素,不知道下一个元素是什么。

该序列的元素需要折叠,添加应逐渐进行(一旦找到元素的初始范围)。

在服务期间,您需要检查生成的序列中是否存在endpoint,以及何时接收到整个元素流,但这一点不是,然后请求异常,因为未接收到指定范围的上限

此外,在找到指定范围的起点之前,不要开始计算,

虽然我们不能阻止流,否则我们将得到相同的Exstrong TextException。

如何组织这种检查?

当我使用常规线程时,它看起来是这样的:


   private boolean isRangeValues() {

        List<BigInteger> sequence = Arrays
                .asList(
                        new BigInteger("11"),
                        new BigInteger("15"),
                        new BigInteger("23"),
                        new BigInteger("27"),
                        new BigInteger("30"));

           BigInteger startRange =   new BigInteger("15");
           BigInteger finishRange = new BigInteger("27");

        boolean isStartRangeMember = sequence.contains(startRange);
        boolean isFinishRangeMembe = sequence.contains(finishRange);


        return isStartRangeMember && isFinishRangeMember;
    }

但是我有一个任务来处理以一定间隔生成的元素流。为了得到结果,在Spring中使用了Reactor栈,我在Flux中得到了结果。

只需转换为列表和进程,-它不会工作,会有异常。过滤完这些元素后,流将继续被处理。

但是如果我在过滤时看到数据验证中的错误(在这种情况下,不需要任何元素),那么我将需要请求异常,该异常将被全局处理并返回给客户端。

    @GetMapping("v1/sequence/{startRange}/{endRange}")
    Mono<BigInteger> getSumSequence(
            @PathVariable BigInteger startRange,
            @PathVariable BigInteger endRange) {

        Flux<BigInteger> sequenceFlux = sequenceGenerated();
        
         validateSequence(sequenceFlux)
      
       return sum(sequenceFlux );
     }

     private Mono<BigInteger> sum (Flux<BigInteger> sequenceFlux ){
      .....
     }

       private void validateSequence(Flux<BigInteger> sequenceFlux){
         ... is wrong
         throw new RuntimeException();
     }
}

我提出了一些解决方案(我在本主题中发表了它)。

    public void validateRangeSequence(sequenceDto dto) {

        Flux<BigInteger> sequenceFlux = dto.getSequenceFlux();
        BigInteger startRange = dto.getStartRange();
        BigInteger endRange = dto.getEndRange();

        Mono<Boolean> isStartRangeMember = sequenceFlux.hasElement(startRange);
        
        Mono<Boolean> isEndRangeMember = sequenceFlux.hasElement(endRange);

        if ( !isStartRangeMember.equals(isEndRangeMember) ){
            throw new RuntimeException("error");
        }

但是它并没有像预期的那样工作,即使是正确的结果也会导致异常。

使现代化

public void validateRangeSeq(RangeSequenceDto dto) {

        Flux<BigInteger> sequenceFlux = dto.getSequenceFlux();
        BigInteger startRange = dto.getStartRange();
        BigInteger endRange = dto.getEndRange();

        Mono<Boolean> isStartRangeMember = sequenceFlux.hasElement(startRange);
        Mono<Boolean> isEndRangeMember = sequenceFlux.hasElement(endRange);

        sequenceFlux
                .handle((number, sink) -> {
                    if (!isStartRangeMember.equals(isEndRangeMember) ){
                        sink.error(new RangeWrongSequenceExc("It is wrong given range!."));
                    } else {
                        sink.next(number);
                    }
                });
    }

  • 不幸的是,这个决定也不管用。
        sequenceFlux
                .handle(((bigInteger, synchronousSink) -> {
                    if(!bigInteger.equals(startRange)){
                        synchronousSink.error(new RuntimeException("!!!!!!!!!!! ---- Wrong range!"));
                    } else {
                        synchronousSink.next(bigInteger);
                    }
                }));

它的一段代码-它不起作用。(不以任何方式做出反应)

谁认为这是什么?应该这样做还是有其他方法?

我不熟悉Spring中的Reactor栈,也不知道如何处理这种情况。

也许有人对如何组织这样的过滤有想法,并且不会阻止流中元素的处理。

共有1个答案

糜鸿风
2023-03-14

你可以试着这样做

    Flux<Integer> yourStream = Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).share();
Flux.zip(
        yourStream.filter(integer -> integer.equals(4)),
        yourStream.filter(integer -> integer.equals(6)),
        (integer, integer2) -> Tuple2.of(integer, integer2))
    .subscribe(System.out::println);
 类似资料:
  • 问题内容: 有什么方法可以检查一个集合是否包含一个或多个具有比使用contains循环两次更好的性能的值? 在其他意义上看起来像这样 问题答案: 循环的实现遍历每个元素并进行测试,因此调用两次 效率低下 。 您可以编写自己的循环,使用已编译的regex 模式同时检查两者,同时查找两个名称:

  • 我要求用户在控制台写四个数字,每个数字用连字符分隔。然后我将它们拆分,这将自动创建一个列表,并将其转换为int。但我不知道用户输入了多少数字。 如何检查if方法中这个列表包含多少元素?我需要这样的东西: 我不需要建议来重建我的代码,我需要知道我是否可以检查它或不。

  • 问题内容: 我可能在这里找不到一个简单的单行代码,但这是我的问题: 如何检查ArrayList是否包含另一个ArrayList中的所有对象?我正在寻找(如果存在的话)类似的东西: 例如: 问题答案: 接口中有一个声明的方法。在您的设置中给出所需的答案。

  • 问题内容: 如何检查一个DOM元素是否是另一个DOM元素的子元素?有内置的方法吗?例如,类似: 要么 如果没有,那么有什么想法怎么做?它还需要跨浏览器。我还应该提到,孩子可以嵌套在父级以下的多个级别。 问题答案: 更新: 现在有一种本地方法可以实现此目的。。在评论中也提到了答案。 旧答案: 使用该属性应该可以。从跨浏览器的角度来看,它也是非常安全的。如果已知这种关系是一级的,则可以简单地检查一下:

  • 问题内容: 使用普通的JavaScript(不是jQuery),是否可以检查元素是否 包含 类? 目前,我正在这样做: 问题是,如果我将HTML更改为此… …不再存在完全匹配的内容,因此我得到的默认输出为none()。但我还是想输出为,因为还 包含 了类。 问题答案: 使用方法: 这适用于所有当前浏览器,并且也有polyfill支持旧版本的浏览器。 或者 ,如果您使用较旧的浏览器,并且不想使用po

  • 我有一个包含字符串的列。 (我以检查字符串是否在数据帧中为例) BabyDataSet=[(《鲍勃和马丁与安德鲁》,968)、(《杰西卡和茱莉亚与安东尼》,155)、(《玛丽和约翰》,77)、(《约翰》,578)、(《梅尔和黛安娜》,973)、(《马丁-鲍勃-黛安娜与安德鲁》,968)] a=pd.DataFrame(data=BabyDataSet,columns=['Names','natio