io.smallrye.mutiny.Uni multi threading 不起作用 (Quarkus)



我尝试用不同的线程执行2种不同的操作。下面是我的代码:

Uni.combine().all()
.unis(getItem(), getItemDetails())
.asTuple().subscribe().with(tuple -> {
context.setItem(tuple.getItem1());
context.setItemDetails(tuple.getItem2());
});

方法:

public Uni<ItemResponse> callGetItem(){
Supplier<ItemResponse> supplier = () -> itemService.getItem("item_id_1");
return Uni.createFrom().item(supplier);
}
public Uni<ItemDetailsResponse> callGetItemDetail(){
Supplier<ItemDetailsResponse> supplier = () -> itemService.getItemDetail("dummy_item_id");
return Uni.createFrom().item(supplier) ;
}

但是当我运行代码都callGetItem()callGetItemDetail ()方法在同一个线程(executor-thread-0)中工作。

我哪里做错了?

编辑:

当我给执行器服务Executors.newFixedThreadPool(2)为我的单元,它们仍然在单线程中工作。我将callGetItem()和callGetItemDetail()修改为:

public Uni<ItemResponse> callGetItem(){
Supplier<ItemResponse> supplier = () -> itemService.getItem("item_id_1");
return Uni.createFrom().item(supplier).emitOn(executor);
}
public Uni<ItemDetailsResponse> callGetItemDetail(){
Supplier<ItemDetailsResponse> supplier = () -> itemService.getItemDetail("dummy_item_id");
return Uni.createFrom().item(supplier).emitOn(executor) ;
}

executor is:

ExecutorService executor = Executors.newFixedThreadPool(2);

,但它们仍然在同一个线程中工作。你知道为什么会这样吗?

由于您使用Uni.combine().all().unis().asTuple()组合不同的Uni,因此组合后的Uni将在最后一个元素发出其项后发出其结果(组合)

最后一个(上游)Uni将有它的项目发射(就像其他Unis的情况一样)在任何Thread上,你已经声明性地设置它发射。因此,Uni的组合将在同一个调用Thread的情况下执行。

因此,如果您正在访问组合的组值,则将在相同的执行载体Thread上访问这些值。

最新更新