我正在尝试将Hystrix javanica集成到我现有的Java EJB Web应用程序中,并面临运行它的2个问题。
当我尝试调用以下服务时,它总是从fallback方法返回响应,我看到fallback方法中的Throwable对象有" com.netflix.hystrix.exception.HystrixTimeoutException"异常。
每次触发此服务时,HystrixCommad和后备方法都会多次调用50次。
任何人都可以建议我输入吗?我错过了任何配置吗?
我在项目中包含以下库。 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();
}
}
感谢您的帮助。
答案 0 :(得分:0)
如果您想确保设置属性,可以在电路注释中明确地执行此操作:
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.timeout.enabled", value = "false")
})
我只建议将其用于调试目的。
跳出来的东西是Javanica使用了AspectJ AOP,我之前从未见过使用new MyBean()
。我总是必须使用@Autowired和Spring或类似的代码才能允许代理。这可能只是对我来说不熟悉的事情。
如果在getClusterNameForId
内部设置断点,你能否在堆栈跟踪中看到它是通过反射调用的(它应该是AFAIK)?
请注意,您可以删除commandKey
,因为这将默认为方法名称。我个人也会删除groupKey
并将其默认为类名。