java - Spring 异步 REST 与 DeferredResult 和 Reactor

标签 java spring rest reactor project-reactor

这是我可以详细阐述的在 REST 调用中使用 Reactor 获得异步性的最佳想法,以提高可用性:我不满足......关于如何做得更好的任何想法?

(complete code here for reference)

REST 接口(interface):

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

事件包装器:

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

关于java - Spring 异步 REST 与 DeferredResult 和 Reactor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33854611/

相关文章:

java - 在 Java 中将 double(基本类型)转换为枚举类型

java - ActionListener代码触发了两次

java - 如何处理 URL(Spring、REST、CXF)中的转义字符(管道 |)?

rest - 通过 REST API 的 Flume 指标

c# - WCF REST 消息记录、POST 请求问题

api - 通过 PayPal REST API 进行银行支付

java - "getOutputStream() has already been called for this response"使用spring mvc下载文件时出现异常

java - 使 Hibernate 鉴别器值使用绑定(bind)变量而不是文字

java - 为什么 pointcut.matches(String.class) 返回 "true"

spring - 在 Tomcat : Constraint violation when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" 上部署