Spring boot 将流量减少到流量

Spring boot 将流量减少到流量,spring-boot,stream,reactive-programming,project-reactor,Spring Boot,Stream,Reactive Programming,Project Reactor,我在应用流上的reduce操作时遇到一些问题,我想将其减少到通量。每个AdProvider都以流量的形式提供提供,我想使用流从每个提供中获取所有提供,并将它们连接到一个管道。我怎么可能用reduce来做呢 Set<AdProvider> adProviders; @Override @LogBefore public void gather() { adProviders .parallelStream() .map(this::gather

我在应用
上的reduce操作时遇到一些问题,我想将其减少到
通量
。每个AdProvider都以流量的形式提供提供,我想使用流从每个提供中获取所有提供,并将它们连接到一个管道。我怎么可能用reduce来做呢

Set<AdProvider> adProviders;

@Override
@LogBefore
public void gather()
{
    adProviders
        .parallelStream()
        .map(this::gatherOffers)
        .reduce(?)
        .subscribe();
}

private Flux<Ad> gatherOffers(AdProvider adProvider)
{
    try
    {
        return adProvider.offers();
    }
    catch(Exception e)
    {
        log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e);

        return Flux.empty();
    }
}
设置adProviders;
@凌驾
@LogBefore
公众集会()
{
adProviders
.parallelStream()
.map(此::gatherOffers)
.减少(?)
.subscribe();
}
私人流量提供(AdProvider AdProvider)
{
尝试
{
返回adProvider.offers();
}
捕获(例外e)
{
log.warn(处理提供时出现异常,adProvider.getClass().getSimpleName(),e);
返回通量.empty();
}
}
使用
Flux#fromStream()
+
Flux#flatMap()
为了解决此问题,您可以组合
Flux#fromStream()
(将
Stream
转换为
Flux
)和
Flux#flatMap()
(将内部通量展平为平面
Flux
)如下示例所示:

Set<AdProvider> adProviders;

@Override
public void gather()
{
    Flux.fromStream(adProviders.stream())
        .parallel() // replace .parallelStream with separate parallel + runOn
        .runOn(Schedulers.parallel())
        .flatMap(this::gatherOffers)
        .subscribe();
}

private Flux<Ad> gatherOffers(AdProvider adProvider)
{
    try
    {
        return adProvider.offers();
    }
    catch(Exception e)
    {
        log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e);

        return Flux.empty();
    }
}
Set<AdProvider> adProviders;

@Override
public void gather()
{
    Flux.fromIterable(adProviders)
        .parallel() // replace .parallelStream with separate parallel + runOn
        .runOn(Schedulers.parallel())
        .flatMap(this::gatherOffers)
        .subscribe();
}

private Flux<Ad> gatherOffers(AdProvider adProvider)
{
    try
    {
        return adProvider.offers();
    }
    catch(Exception e)
    {
        log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e);

        return Flux.empty();
    }
}