Я использую spring-cloud-starter (т.е. весеннюю загрузку со всеми функциями микросервисов). Когда я создаю метод hystrix в компоненте, аннотированном с помощью javanica @HystrixCommand, следуйте инструкциям на сайте javanica github (https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica), чтобы этот метод работал асинхронно, независимо от того, использую ли я их «Future‹>» или Reactive Execution 'Observable‹>', ничего не запускается/не выполняется, и я получаю java.lang.ClassCastException: springbootdemo.EricComponent$1 cannot be cast to springbootdemo.Eric
всякий раз, когда пытаюсь получить результат (в случае Future‹>) или получить обратный вызов (в случае Reactive Execution .. и println's не запускайте, так что он действительно не работал).
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
- это просто простой класс с двумя строками... он опущен.
Я полагаю, что мне нужно выполнить явное выполнение, но это намекает на меня, потому что: 1) выполнение этого с помощью Future‹> метод queue() недоступен, как утверждает документация, и 2) выполнение этого с помощью Observable‹> действительно т способ выполнить это, что я получаю.