2015-11-22 4 views
0

C'est la meilleure idée que je pourrais élaborer pour obtenir Asynchronicity avec Reactor dans un appel REST, pour la facilité d'utilisation: je ne suis pas satisfaite .. aucune idée sur la façon de le faire mieux?Spring REST asynchrone avec DeferredResult et Reactor

(complete code here for reference)

Interface REST:

@RestController 
public class REST_Interface { 

    @Autowired 
    public EventBus eventBus; 

    @RequestMapping("/getGreeting/{name}") 
    public DeferredResult<String> getGreeting(@PathVariable String name) { 

     DeferredResult<String> result = new DeferredResult<>(); 

     EventWrapper<String> wrapper = new EventWrapper<>(result, name); 
     eventBus.notify("greeting.topic", Event.wrap(wrapper)); 

     return result; 
     } 
} 

EventWrapper:

public class EventWrapper<T> { 
    private DeferredResult<T> deferredResult; 
    private T payload; 

    public EventWrapper(DeferredResult<T> deferredResult, T payload) { 
     this.deferredResult = deferredResult; 
     this.payload = payload; 
    } 
    // Getters & Setters 
} 

consommateurs de l'événement:

@Consumer 
public class EventConsumer { 

    @Autowired 
    public EventBus eventBus; 

    @Selector("greeting.topic") 
    public void onTestTopic(Object o) { 
     System.out.println("Event receved for Logging " + o.toString()); 
    } 

    @Selector("greeting.topic") 
    public void wrappedGreeter(EventWrapper<String> ew) { 

     ew.getDeferredResult().setResult("Ciao " + ow.getPayload().toUpperCase()); 
    } 
} 

Répondre

2

Jetez un oeil à EventBus.sendAndReceive(), il est fait exactement pour ce genre de cas d'utilisation. Exemple de :

EventBus bus; 

bus.receive($("job.sink"), (Event<String> ev) -> { 
    return ev.getData().toUpperCase(); 
}); 

bus.sendAndReceive(
    "job.sink", 
    Event.wrap("Hello World!"), 
    s -> System.out.printf("Got %s on thread %s%n", s, Thread.currentThread()) 
); 
+1

En Java, cela ne semble pas si agréable. : D Quoi qu'il en soit, cette façon de forcer à utiliser la même méthode tout au long de la chaîne d'événements, ne sera plus un paradigme axé sur les événements, mais seulement une série d'appels asynchrones. –