2014-10-14 36 views
8

Yaylı bulut başlatıcısını kullanıyorum (örn. Tüm önyükleme özelliklerine sahip yaylı önyükleme). Javanica @HystrixCommand kullanılarak açıklanmış bir bileşendeki hystrix yöntemini oluşturduğumda, 'Gelecekteki <>' veya Reaktif yürütme 'Gözlemlenebilir < kullanıp kullanmadığımı dikkate almadan, bu yöntemin uyumsuz çalışmasını sağlamak için javanica github sitesindeki (https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica) yönergeleri izleyin. > ', hiçbir şey çalıştırılamaz/yürütür ve ben sonucu çekmeye çalıştığımda (Gelecek <>>) veya bir geri arama (her zaman Çalıştır)' i çalıştırmaya çalıştığımda
java.lang.ClassCastException: springbootdemo.EricComponent$1 cannot be cast to springbootdemo.Eric aldım.). javanica içinde Hystrix async yöntemleri, ilkbahar-önyükleme java uygulamasında çalışmaz.

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"); 
      } 
     }; 
    } 
} 

yerine neden bir Eric bir EricComponent$1 geri almak olacaktır? btw, Eric sadece 2 telli basit bir sınıfa ait. > 1) Future < ile de genişlemiş> kuyruğu() yöntemiyle ilgili belgeler iddia ettiği gibi kullanılamaz ve 2) gözlemlenebilir < ile yapıyor:

Ben açıkça yürütmek için gereken bulmaktan, fakat bu beni ima Bunu gerçekleştirmem için gerçekten bir yol yok.

cevap

3

Uygulama sınıfınızda @EnableHystrix ek açıklama var mı?

subscribe yöntemi eşzamansızdır ve senkronize denetleyici yönteminde bir listeyi doldurmaya çalışıyorsunuz, bu nedenle orada bir sorun olabilir. subscribe'u toBlockingObservable().forEach() olarak değiştirebilir ve bunun yardımcı olup olmadığını görebilir misiniz?

Güncelleştirme # 1 Yinelenebildi. Varsayılan yönteminiz bir Observable<Eric>, sadece bir Eric döndürmemelidir.

public Eric defaultRestTemplateCallAsync(final int callNum) { 
    System.out.println("!!!!!!!!!!!!! call bombed " + new Integer(callNum) + "!!!!!!!!!!!!!"); 
    return new Eric(new Integer(callNum).toString(), "bomb"); 
} 

burada Güncelleme 2. Bkz kodum https://github.com/spencergibb/communityanswers/tree/so26372319

Ben fallbackMethod öznitelik dışarı yorumladı 3 , bunun EricComponent herkese açık bir sürümü için bulamadık şikayetçi Güncelleme # AOP. EricComponentpublic static'u yaptım ve işe yaradı. Kendi dosyasında bir üst düzey sınıf çalışacaktı. Yukarıda bağlı olan kodum (restTemplate çağrısının çalıştığını varsayar) çalışır ve n OK değerini döndürür.

+0

Teşekkürler @spencergibb bunun için harcadığınız süre boyunca. @EnableHystrix .. 'i kullandım ve öntanımlı olarak' Gözlemlenebilir 'yerine 'Eric' 'i değiştirmek için ClassCastException'dan kaçınmayı başardı. Birisi bunu belirtmek için Javanica belgelerini güncellemelidir. Ancak, bunu çalıştırdığımda tüm "çağrı bomba" println's alırsınız. Artı '' invoke() 'yöntemi 'Gözlemleniyor ''de döndürülür hala idam edilmez. – RubesMN

+0

Güncelleme # 3'e göre, EricComponent'i kendi dosyasına ayıranın mükemmel bir şekilde çalıştığı ortaya çıkıyor. Her şey şimdi koşuyor. Buna ek olarak, BlockingObservables ile engellemeye geçiş ve düzenli Gözlemciler aracılığıyla engellememe çalışmaları da bana POC'im için gerekenleri sağlar. @spencergibb için tekrar teşekkürler. – RubesMN

İlgili konular