Почему @Fallback () не запускается в тривиальном .war, развернутом в thorntail + microprofile? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть тривиальное "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%.Вместо этого я получаю RuntimeException в 70% случаев.

Как мне запустить и / или настроить Thorntail, чтобы активировать фракцию микропрофиля для моей тривиальной WAR?

1 Ответ

0 голосов
/ 28 февраля 2019

Вам нужно заменить

final HelloService client = new HelloService();

на

@Inject
HelloService client;

Почему?Потому что вся магия CDI (в данном случае перехватчик CDI, который реализует стратегию отказоустойчивости) может произойти только в том случае, если используется прокси-сервер CDI (я думаю, что спецификация CDI называет это «контекстной ссылкой»).Если вы создаете экземпляр вручную, вы вызываете метод напрямую, а не через прокси, фактически обойдя все, что CDI гарантирует для вас.

...