【问题标题】:Spring Asynchronous REST with DeferredResult and Reactor带有 DeferredResult 和 Reactor 的 Spring 异步 REST
【发布时间】:2015-11-22 12:12:05
【问题描述】:

这是我可以详细说明的最佳想法,以在 REST 调用中获得与 Reactor 的异步性,以提高可用性:我不满意.. 任何想法如何做得更好?

(complete code here for reference)

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

【问题讨论】:

    标签: java spring rest reactor project-reactor


    【解决方案1】:

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

    【讨论】:

    • 在 Java 中看起来不太好。 :D 无论如何,这种方式迫使在所有事件链中使用相同的方法,因此不再是事件驱动的范例,而只是一系列异步调用。
    猜你喜欢
    • 2017-01-10
    • 2020-08-21
    • 2012-12-12
    • 2018-07-04
    • 2020-10-28
    • 2023-02-13
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多