mfc 弹簧
Spring-Reactive旨在为基于Spring的项目带来响应式编程支持 ,并且有望在Spring 5的时间表中提供。 我的意图是使用此模型为REST端点行使一些非常基本的签名。
在继续之前,请允许我确认整个样本完全基于塞巴斯蒂安·德勒兹(SébastienDeleuze) 在这里汇总的样本– https://github.com/sdeleuze/spring-reactive-playground
我想考虑三个示例,首先是现有Java 8 CompletableFuture作为类型返回的情况,其次是RxJava的Observable作为类型返回的情况,其次是Spring Reactor Core的 Flux类型的情况。
预期协议
这三个服务中的每一个处理的请求和响应消息的结构都遵循以下几行,它们都将接收如下所示的请求:
{"id":1,"delay_by": 2000,"payload": "Hello","throw_exception": false
}
delay_by将使响应延迟,throw_exception将使对错误的响应消失。 合理的响应如下:
{"id": "1","received": "Hello","payload": "Response Message"
}
我将忽略此职位的例外情况。
CompletableFuture作为返回类型
考虑一个返回java 8 CompletableFuture作为返回类型的服务:
public CompletableFuture<MessageAcknowledgement> handleMessage(Message message) {return CompletableFuture.supplyAsync(() -> {Util.delay(message.getDelayBy());return new MessageAcknowledgement(message.getId(), message.getPayload(), "data from CompletableFutureService");}, futureExecutor);
}
现在,调用此服务的Controller的方法签名如下所示:
@RestController
public class CompletableFutureController {private final CompletableFutureService aService;@Autowiredpublic CompletableFutureController(CompletableFutureService aService) {this.aService = aService;}@RequestMapping(path = "/handleMessageFuture", method = RequestMethod.POST)public CompletableFuture<MessageAcknowledgement> handleMessage(@RequestBody Message message) {return this.aService.handleMessage(message);}}
当CompletableFuture完成时,框架将确保将响应适当地编组。
Rx Java可观察为返回类型
考虑将Rx Java Observable作为返回类型返回的服务:
public Observable<MessageAcknowledgement> handleMessage(Message message) {logger.info("About to Acknowledge");return Observable.just(message).delay(message.getDelayBy(), TimeUnit.MILLISECONDS).flatMap(msg -> {if (msg.isThrowException()) {return Observable.error(new IllegalStateException("Throwing a deliberate exception!"));}return Observable.just(new MessageAcknowledgement(message.getId(), message.getPayload(), "From RxJavaService"));});
}
调用此类服务的控制器现在可以直接将Observable作为类型返回,并且框架将确保一旦发出所有项目,响应就会正确地编组。
@RestController
public class RxJavaController {private final RxJavaService aService;@Autowiredpublic RxJavaController(RxJavaService aService) {this.aService = aService;}@RequestMapping(path = "/handleMessageRxJava", method = RequestMethod.POST)public Observable<MessageAcknowledgement> handleMessage(@RequestBody Message message) {System.out.println("Got Message..");return this.aService.handleMessage(message);}}
请注意,由于Observable代表0到许多项目的流,因此这次响应是一个json数组。
Spring Reactor Core Flux作为返回类型
最后,如果响应类型是Flux类型,则框架确保响应被干净处理。 该服务遵循以下原则:
public Flux<messageacknowledgement> handleMessage(Message message) {return Flux.just(message).delay(Duration.ofMillis(message.getDelayBy())).map(msg -> Tuple.of(msg, msg.isThrowException())).flatMap(tup -> {if (tup.getT2()) {return Flux.error(new IllegalStateException("Throwing a deliberate Exception!"));}Message msg = tup.getT1();return Flux.just(new MessageAcknowledgement(msg.getId(), msg.getPayload(), "Response from ReactorService"));});
}
以及使用此类服务的控制器:
@RestController
public class ReactorController {private final ReactorService aService;@Autowiredpublic ReactorController(ReactorService aService) {this.aService = aService;}@RequestMapping(path = "/handleMessageReactor", method = RequestMethod.POST)public Flux<MessageAcknowledgement> handleMessage(@RequestBody Message message) {return this.aService.handleMessage(message);}}
结论
这只是Spring Reactive项目支持的返回类型的示例,可能的返回类型远不止于此–这里是一个更全面的示例。
我期待React式编程模型在核心Spring框架中可用。
我的github存储库中提供了此博客文章中提供的示例
翻译自: https://www.javacodegeeks.com/2016/06/spring-reactive-samples.html
mfc 弹簧