我正在使用spring-cloud-starter(即具有所有微服务功能的spring boot)。当我在使用javanica @HystrixCommand批注的组件中创建hystrix方法时,请遵循javanica github网站(https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica)上的说明以使该方法异步运行,无论我使用其'Future '还是 react 性执行'Observable ,没有任何运行/执行,我得到了 每当我尝试提取结果(在Future 的情况下)或获取回调(在响应式执行..和println的dont触发,因此它实际上没有运行)时,就使用java.lang.ClassCastException: springbootdemo.EricComponent$1 cannot be cast to springbootdemo.Eric。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; }@Componentclass 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 来实现。一种执行我所得到的方法。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您的应用程序类上是否有@EnableHystrix批注?subscribe方法是异步的,您正尝试在同步 Controller 方法中填充列表,因此那里可能存在问题。您可以将subscribe更改为toBlockingObservable().forEach(),看看是否有帮助? 更新#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属性时,它提示它找不到AOP的公开版本EricComponent。我做了EricComponent public static,它奏效了。自己文件中的顶级类将起作用。上面链接的我的代码有效(假设restTemplate调用有效)并返回n OK。 (adsbygoogle = window.adsbygoogle || []).push({});
08-18 05:03