2015-05-06 6 views
5

Ben tipik kod - Bir Consumer bir depo ile çalışanTaşıma istisnalar ben Reaktörü 2 ve İşte bahar 4. kullanıyorum

Sonra
@Consumer 
public class ApplicationService { 

    @Selector(value="/applications/id", type = SelectorType.URI) 
    @ReplyTo 
    public Application byApplicationId(String id) throws ApplicationNotFoundException { 
     Application app = appRepo.findOne(id); 
     if(app == null) 
     throw new ApplicationNotFoundException("Application `" + id + "` could not be found."); 
     return app; 
    } 
} 

Bir eventBus istek geçirir bir denetleyici var içine Ben istekleri geçmek ve bir Promise

@RestController 
@RequestMapping("/applications") 
public class ApplicationsController { 
    @RequestMapping(value = "/{id}", method = GET, produces = APPLICATION_JSON_VALUE) 
    public Promise<Event<Application>> byApplicationId(@PathVariable final String id) { 
     final Promise<Event<Application>> p = Promises.prepare(env); 
     eventBus.sendAndReceive("/applications/id", Event.wrap(id), p); 
     return p; 
    } 

} 

şeyler çalışmak ancak ApplicationService durumunda bir istisna Promise s değeri ayarlı değil atma dönmek ama inci aşağıdaki alabilirim E konsolu:

16:46:58.003 [main] ERROR reactor.bus.EventBus - null 
java.lang.reflect.UndeclaredThrowableException 
    at org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:302) 
... 
Caused by: com.metlife.harmony.exceptions.ApplicationNotFoundException: Application `2860c555-0bc4-45e6-95ea-f724ae3f4464` could not be found. 
    at com.metlife.harmony.services.ApplicationService.byApplicationId(ApplicationService.java:46) ~[classes/:?] 
... 
Caused by: reactor.core.support.Exceptions$ValueCause: Exception while signaling value: reactor.bus.Event.class : Event{id=null, headers={}, [email protected], key=/applications/id, data=2860c555-0bc4-45e6-95ea-f724ae3f4464} 

Sorular şunlardır:

  1. Yanlış şekilde Reactor ve eventBus kullanırım? ve eğer öyleyse,

  2. belki de bu işlev henüz

+0

' eventBus.sendAndReceive mevcuttur? –

+0

@AnadiMisra hangi noktada? – EvgeniySharapov

+0

Kodunuzu meraktan kurtarmaya çalıştım ve bunu aldım: EventBus türünde sendAndReceive (Object, Event , Consumer ) yöntemi, argümanlar için geçerli değildir (String, Event , Promise >) line, benim Promise nesnesi 'Promise > response = Promises.prepare;' –

cevap

3

benim Bahar uygulamada reaktör kullanılarak stratejisini yeniden değerlendirildi tahmin uygulanmadı doğru yolu budur. olan (

Şimdi benim denetleyicisi

@RestController 
public class GreetingController { 

    @Autowired 
    private GreetingService greetingService; 

    @RequestMapping("/greeting") 
    public Promise<ResponseEntity<?>> greeting(final @RequestParam(value = "name", defaultValue = "World") String name) { 
     return greetingService.provideGreetingFor(name).map(new Function<Greeting, ResponseEntity<?>>() { 
      @Override 
      public ResponseEntity<?> apply(Greeting t) { 
       return new ResponseEntity<>(t, HttpStatus.OK); 
      } 
     }).onErrorReturn(WrongNameException.class, new Function<WrongNameException, ResponseEntity<?>>() { 
      @Override 
      public ResponseEntity<?> apply(WrongNameException t) { 
       return new ResponseEntity<>(t.getMessage(), HttpStatus.BAD_REQUEST); 
      } 
     }).next(); 
    } 
} 

benziyor Ve hizmet nedir kötü şimdi hizmette yöntemin sonucunda Stream<T> kullanmak zorunda olmasıdır

@Service 
public class GreetingService { 
    @Autowired 
    private Environment env; 

    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    public Stream<Greeting> provideGreetingFor(String name) { 
     return Streams.just(name).dispatchOn(env).map(new Function<String, Greeting>() { 
      @Override 
      public Greeting apply(String t) { 
       if (t == null || t.matches(".*\\d+.*")) 
        throw new WrongNameException(); 
       return new Greeting(counter.incrementAndGet(), String.format(template, t)); 
      } 
     }); 
    } 
} 

benziyor sözde bir iş mantığı), bu nedenle hizmeti kullanan herkes şu anda hizmetin Stream -ish niteliğinin farkındadır ve sonuç olarak Stream kodun diğer bölümlerine sızar. şimdi servisi kullanarak await() kodunu kullanmam gerekebilir. `Hatayı döküm cuase etmez

Tam uygulama (Event.wrap (id), s "/ uygulamalar/id") https://github.com/evgeniysharapov/spring-reactor-demo