Hystrix Javanica:调用总是从fallback方法返回结果。(没有spring的java web app)

时间:2017-11-15 19:07:46

标签: hystrix

我正在尝试将Hystrix javanica集成到我现有的Java EJB Web应用程序中,并面临运行它的2个问题。

  1. 当我尝试调用以下服务时,它总是从fallback方法返回响应,我看到fallback方法中的Throwable对象有" com.netflix.hystrix.exception.HystrixTimeoutException"异常。

  2. 每次触发此服务时,HystrixCommad和后备方法都会多次调用50次。

  3. 任何人都可以建议我输入吗?我错过了任何配置吗?

    我在项目中包含以下库。 project libraries

    我已按如下方式设置我的方面文件:

    <aspectj>
     <weaver options="-verbose -showWeaveInfo"></weaver>
     <aspects>
        <aspect name="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect"/>
     </aspects>
    </aspectj>
    

    这是我在META-INF / config.properties

    中的config.properties文件
    hystrix.command.default.execution.timeout.enabled=false
    

    这是我的休息服务文件

    @Path("/hystrix")
    public class HystrixService {
    
     @GET
     @Path("clusterName")
     @Produces({ MediaType.APPLICATION_JSON })
     public Response getClusterName(@QueryParam("id") int id) {
        ClusterCmdBean clusterCmdBean = new ClusterCmdBean();
        String result = clusterCmdBean.getClusterNameForId(id);
        return Response.ok(result).build();
     }
    }
    

    这是我的bean类

    public class ClusterCmdBean {
    
     @HystrixCommand(groupKey = "ClusterCmdBeanGroup", commandKey = "getClusterNameForId", fallbackMethod = "defaultClusterName")
     public String getClusterNameForId(int id) {
        if (id > 0) {
            return "cluster"+id;
        } else {
            throw new RuntimeException("command failed");
        }
     }
    
     public String defaultClusterName(int id, Throwable e) {
        return "No cluster - returned from fallback:" + e.getMessage();
     }
    }
    

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您想确保设置属性,可以在电路注释中明确地执行此操作:

@HystrixCommand(commandProperties = {
    @HystrixProperty(name = "execution.timeout.enabled", value = "false")
})

我只建议将其用于调试目的。

跳出来的东西是Javanica使用了AspectJ AOP,我之前从未见过使用new MyBean()。我总是必须使用@Autowired和Spring或类似的代码才能允许代理。这可能只是对我来说不熟悉的事情。 如果在getClusterNameForId内部设置断点,你能否在堆栈跟踪中看到它是通过反射调用的(它应该是AFAIK)?

请注意,您可以删除commandKey,因为这将默认为方法名称。我个人也会删除groupKey并将其默认为类名。