为什么在部署到 thorntail+microprofile 的微不足道的 .war 中不触发 @Fallback()?
Why @Fallback() isn't triggered in a trivial .war deployed to thorntail+microprofile?
我有一个简单的 "Hello World!" REST 服务,它使用 microprofile 进行容错,特别是 @Fallback 注释
// HelloApplication.java
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/api")
public class HelloApplication extends Application {
}
// HelloRest.java
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@ApplicationScoped
@Path("/")
public class HelloRest {
final HelloService client = new HelloService();
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/hello")
public String sayHello() {
return client.lookupMessage();
}
}
// HelloService.java
import org.eclipse.microprofile.faulttolerance.Fallback;
import javax.enterprise.context.ApplicationScoped;
import java.util.Random;
@ApplicationScoped
public class HelloService {
@Fallback(fallbackMethod = "fallbackMessage")
public String lookupMessage() {
int rand = new Random().nextInt() % 10;
if (rand <= 3) {
return "Hello World!";
}
throw new RuntimeException("message lookup failed");
}
public String fallbackMessage() {
return "fallback message";
}
}
我用 gradle 和 运行 用刺尾空心罐建造它。
$ java -jar microprofile-hollow-thorntail.jar my-trivial-hello-service.war
我希望
curl http://localhost:8080/api/hello
到 return "Hello World!" 用于 30% 的调用,"fallback message" 用于剩余的 70%。相反,我在 70% 的情况下得到 RuntimeException
。
我如何开始 and/or 配置 thorntail 以便为我的琐碎 WAR 激活 microprofile 分数?
你需要更换
final HelloService client = new HelloService();
和
@Inject
HelloService client;
为什么?因为只有使用 CDI 代理(我认为 CDI 规范称其为 "contextual reference"),所有 CDI 魔法(在本例中为实现容错策略的 CDI 拦截器)才会发生。如果你手动构建实例,你直接调用方法而不是通过代理,有效地绕过了 CDI 为你保证的一切。
我有一个简单的 "Hello World!" REST 服务,它使用 microprofile 进行容错,特别是 @Fallback 注释
// HelloApplication.java
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/api")
public class HelloApplication extends Application {
}
// HelloRest.java
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@ApplicationScoped
@Path("/")
public class HelloRest {
final HelloService client = new HelloService();
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/hello")
public String sayHello() {
return client.lookupMessage();
}
}
// HelloService.java
import org.eclipse.microprofile.faulttolerance.Fallback;
import javax.enterprise.context.ApplicationScoped;
import java.util.Random;
@ApplicationScoped
public class HelloService {
@Fallback(fallbackMethod = "fallbackMessage")
public String lookupMessage() {
int rand = new Random().nextInt() % 10;
if (rand <= 3) {
return "Hello World!";
}
throw new RuntimeException("message lookup failed");
}
public String fallbackMessage() {
return "fallback message";
}
}
我用 gradle 和 运行 用刺尾空心罐建造它。
$ java -jar microprofile-hollow-thorntail.jar my-trivial-hello-service.war
我希望
curl http://localhost:8080/api/hello
到 return "Hello World!" 用于 30% 的调用,"fallback message" 用于剩余的 70%。相反,我在 70% 的情况下得到 RuntimeException
。
我如何开始 and/or 配置 thorntail 以便为我的琐碎 WAR 激活 microprofile 分数?
你需要更换
final HelloService client = new HelloService();
和
@Inject
HelloService client;
为什么?因为只有使用 CDI 代理(我认为 CDI 规范称其为 "contextual reference"),所有 CDI 魔法(在本例中为实现容错策略的 CDI 拦截器)才会发生。如果你手动构建实例,你直接调用方法而不是通过代理,有效地绕过了 CDI 为你保证的一切。