在查看了他们的官方教程开始使用异步指南之后,我试图了解 Uni 在 Quarkus 框架中的行为。在服务方法中,我做了以下更改
package org.acme.getting.started.async;
import javax.enterprise.context.ApplicationScoped;
import io.smallrye.mutiny.Uni;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ApplicationScoped
public class GreetingService {
ExecutorService executor = Executors.newFixedThreadPool(10, r -> {
return new Thread(r, "CUSTOM_TASK_EXECUTION_THREAD");
});
public Uni<String> greeting(String name) {
System.out.println("greeting Executing on Thread "+Thread.currentThread().getName());
return Uni.createFrom().item(ioSimulation(name))
.emitOn(executor);//Infrastructure.getDefaultExecutor()
}
public String ioSimulation(String param){
System.out.println("ioSimulation Executing on Thread "+Thread.currentThread().getName());
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello "+param;
}
}
然后我测试了 /greeting/{name} 资源,执行根本不是异步的,实际上它在同一个线程中以同步方式执行了所有相关方法。
那么这之间有什么区别
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/greeting/{name}")
public Uni<String> greeting(@PathParam String name) {
}
和
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/greeting/{name}")
public String greeting(@PathParam String name) {
}
它是如何异步的?请帮助我理解它。