Java 具有延迟结果和反应器的Spring异步REST

Java 具有延迟结果和反应器的Spring异步REST,java,spring,rest,reactor,project-reactor,Java,Spring,Rest,Reactor,Project Reactor,这是我在REST调用中实现与Reactor异步的最佳想法,因为它的可用性:我不满意。。你知道如何做得更好吗 () REST接口: @RestController public class REST_Interface { @Autowired public EventBus eventBus; @RequestMapping("/getGreeting/{name}") public DeferredResult<String> getGreeti

这是我在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;
        }
}
@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());
    }
}
@RestController
公共类REST\u接口{
@自动连线
公共活动巴士;
@请求映射(“/getGreeting/{name}”)
公共延迟结果getGreeting(@PathVariable字符串名称){
DeferredResult=新的DeferredResult();
EventWrapper=新的EventWrapper(结果、名称);
eventBus.notify(“greeting.topic”,Event.wrap(wrapper));
返回结果;
}
}
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
}
公共类事件包装器{
私有延迟结果延迟结果;
私人T载荷;
public EventWrapper(DeferredResult DeferredResult,T有效负载){
this.deferredResult=deferredResult;
这个有效载荷=有效载荷;
}
//接球手和接球手
}
事件消费者:

@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;
        }
}
@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());
    }
}
@消费者
公共类事件消费者{
@自动连线
公共活动巴士;
@选择器(“greeting.topic”)
公共void onTestTopic(对象o){
System.out.println(“为记录而接收的事件”+o.toString());
}
@选择器(“greeting.topic”)
公共无效包装器(EventWrapper ew){
ew.getDeferredResult().setResult(“Ciao”+ow.getPayload().toUpperCase());
}
}

看看EventBus.SendReceive(),它正是为这种用例而设计的。示例来自:

EventBus总线;
总线接收($(“作业接收器”),(事件ev)->{
返回ev.getData().toUpperCase();
}); 
发送和接收总线(
“工作,水槽”,
Event.wrap(“你好,世界!”),
s->System.out.printf(“在线程%s%n上获得了%s”,s,thread.currentThread())
);

在Java中,它看起来不太好看无论如何,这种方式迫使在所有事件链中使用相同的方法,因此不再是事件驱动的范例,而只是一系列异步调用。