为什么在部署到thorntail + microprofile的琐碎.war中没有触发@Fallback()?

时间:2019-02-28 16:44:41

标签: microprofile thorntail

我有一个琐碎的“ Hello World!” REST服务,该服务使用微配置文件进行容错,尤其是@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

返回“ Hello World!”用于30%的调用,而“后备消息”用于其余70%。相反,在70%的情况下,我得到了RuntimeException

我必须如何启动和/或配置thorntail才能激活微不足道的WAR的微轮廓部分?

1 个答案:

答案 0 :(得分:1)

您需要更换

final HelloService client = new HelloService();

使用

@Inject
HelloService client;

为什么?因为只有使用CDI代理(我认为CDI规范称其为“上下文引用”),才能发生所有CDI魔术(在这种情况下,是实现容错策略的CDI拦截器)。如果您手动构造实例,则直接调用该方法而不是通过代理进行调用,从而有效地绕过了CDI为您提供的所有保证。