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();
}
}