Hystrix Collapser不起作用(Javanica; SpringBoot)

时间:2019-05-05 04:40:05

标签: java spring-boot java-11 hystrix

我正在将SpringBoot 2.1.4与Java 11一起使用,并且试图使用Hystrix Collapser将请求聚合为单个请求。因为我有SpringBoot,所以我使用Javanica注释使其工作。问题是我的代码正在运行实际的Collapser主体,而不是batchMethod。

该条目是getApplicationById方法。这将首先检查结果在缓存中是否可用,如果不可用,将调用提供的函数。 k参数是密钥,在本例中为id

从lambda调用转到getAppFromServer方法,该方法将多个参数转换为Collapser的一个参数。然后调用崩溃器。

问题是我的代码停止,因为抛出了RuntimeException,但是绝不应该到达代码的这一部分,因为Collapser应该调用batchMethod

我已经尝试将Future<Application>更改为Observable<Application>,但是并不能解决问题。我还尝试删除了缓存功能构造,并直接调用方法getAppFromServer,但它没有解决。我还将Hystrix版本从1.5.12(SpringBoot依赖项)升级到1.5.18(最新Hystrix版本)。

这是我的代码:

    @Override
    public Application getApplicationById(String id, String user) {
        return cache.get(id, k -> getAppFromServer(k, user));
    }

    @HystrixCollapser(scope = com.netflix.hystrix.HystrixCollapser.Scope.REQUEST, batchMethod = "getApplicationsByIds")
    public Future<Application> getApplicationById2(RequestData data) {
        throw new RuntimeException("This method body should not be executed");
    }

    @HystrixCommand(fallbackMethod = "fallbackGetApplicationsByIds")
    public List<Application> getApplicationsByIds(List<RequestData> requestData) {
        List<Application> result = null;
        // Now make the HTTP call and make sure the result List<Application> is the same size as the original list. 
        // Actual code removed for readability. 
        return result;
    }

    Application getAppFromServer(String id, String user) {
        var reqData = new RequestData(id, user);
        var future = getApplicationById2(reqData);
        Application result = null;

        try {
            result=future.get();
        } catch (InterruptedException e) {
            log.error("Interrupted while getting result:"+e.toString());
        } catch (ExecutionException e) {
            log.error("ExecutionException while getting result"+e.toString());
        }

        return result;
    }

0 个答案:

没有答案