繁体   English   中英

具有DeferredResult和Reactor的Spring异步REST

[英]Spring Asynchronous REST with DeferredResult and Reactor

为了可用性,这是我可以阐述的最好的想法,以便在REST调用中获得与Reactor的异步性:出于对我的理解,关于如何做得更好的任何想法?

完整的代码在这里供参考

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
}

活动使用者:

@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());
    }
}

看一下EventBus.sendAndReceive(),它正是针对这种用例而设计的。 来自http://projectreactor.io/docs/reference/#bus-request-reply的示例:

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())
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM