[英]Hystrix async methods within javanica not running inside spring-boot java application
我正在使用spring-cloud-starter(即具有所有微服务功能的spring boot)。 当我在使用javanica @HystrixCommand注释的组件中创建hystrix方法时,请按照javanica github网站( https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica )上的说明进行操作该方法异步运行,无论我使用它们的“ Future <>”还是响应式执行“ Observable <>”,都不会运行/执行任何操作,并且我得到
java.lang.ClassCastException: springbootdemo.EricComponent$1 cannot be cast to springbootdemo.Eric
无论何时我尝试拉出结果(对于Future <>)或获取回调(如果是Reactive Execution ..而println都不触发,它真的没有运行)。
public class Application { ...
}
@RestController
@RequestMapping(value = "/makebunchofcalls/{num}")
class EricController { ..
@RequestMapping(method={RequestMethod.POST})
ArrayList<Eric> doCalls(@PathVariable Integer num) throws IOException {
ArrayList<Eric> ale = new ArrayList<Eric>(num);
for (int i =0; i<num; i++) {
rx.Observable<Eric> oe = this.ericComponent.doRestTemplateCallAsync(i);
oe.subscribe(new Action1<Eric>() {
@Override
public void call(Eric e) { // AT RUNTIME, ClassCastException
ale.add(e);
}
});
}
return ale;
}
@Component
class EricComponent { ...
// async version =========== using reactive execution via rx library from netflix ==============
@HystrixCommand(fallbackMethod = "defaultRestTemplateCallAsync", commandKey = "dogeAsync")
public rx.Observable<Eric> doRestTemplateCallAsync(int callNum) {
return new ObservableResult<Eric>() {
@Override
public Eric invoke() { // NEVER CALLED
try {
ResponseEntity<String> result = restTemplate.getForEntity("http://doges/doges/24232/photos", String.class); // actually make a call
System.out.println("*************** call successfull: " + new Integer(callNum).toString() + " *************");
} catch (Exception ex) {
System.out.println("=============== call " + new Integer(callNum).toString() + " not successfull: " + ex.getMessage() + " =============");
}
return new Eric(new Integer(callNum).toString(), "ok");
}
};
}
public rx.Observable<Eric> defaultRestTemplateCallAsync(int callNum) {
return new ObservableResult<Eric>() {
@Override
public Eric invoke() {
System.out.println("!!!!!!!!!!!!! call bombed " + new Integer(callNum).toString() + "!!!!!!!!!!!!!");
return new Eric(new Integer(callNum).toString(), "bomb");
}
};
}
}
为什么我要找回EricComponent$1
而不是Eric
? 顺便说一句, Eric
只是一个带有2个字符串的简单类……它被忽略了。
我想我必须必须显式执行,但这暗示了我,因为:1)由于文档要求,不能使用Future <>来执行queue()方法,并且2)确实可以使用Observable <>来实现。这是我得到的一种执行方法。
您的应用程序类上是否有@EnableHystrix
批注?
subscribe
方法是异步的,您正在尝试使用同步控制器方法填充列表,因此那里可能存在问题。 您可以更改对toBlockingObservable().forEach()
的subscribe
,看看是否有帮助?
更新#1我能够复制。 您的默认方法不应返回Observable<Eric>
,而应返回Eric
。
public Eric defaultRestTemplateCallAsync(final int callNum) {
System.out.println("!!!!!!!!!!!!! call bombed " + new Integer(callNum) + "!!!!!!!!!!!!!");
return new Eric(new Integer(callNum).toString(), "bomb");
}
更新#2在这里查看我的代码https://github.com/spencergibb/communityanswers/tree/so26372319
更新#3当我注释掉fallbackMethod
属性时,它抱怨找不到EricComponent
于AOP的EricComponent
的公共版本。 我将EricComponent
public static
,它起作用了。 自己文件中的顶级类将起作用。 上面链接的我的代码有效(假设restTemplate调用有效)并返回n OK
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.