弹簧活性样品
Spring-Reactive旨在為基于Spring的項(xiàng)目帶來響應(yīng)式編程支持 ,并且有望在Spring 5的時(shí)間表中提供。 我的意圖是使用此模型為REST端點(diǎn)行使一些非常基本的簽名。
在繼續(xù)之前,請?jiān)试S我確認(rèn)整個(gè)樣本完全基于塞巴斯蒂安·德勒茲(SébastienDeleuze) 在這里匯總的樣本– https://github.com/sdeleuze/spring-reactive-playground
我想考慮三個(gè)示例,首先是現(xiàn)有Java 8 CompletableFuture作為類型返回的情況,其次是RxJava的Observable作為類型返回的情況,其次是Spring Reactor Core的 Flux類型的情況。
預(yù)期協(xié)議
這三個(gè)服務(wù)中的每一個(gè)處理的請求和響應(yīng)消息的結(jié)構(gòu)都遵循以下幾行,它們?nèi)繉⒔邮芤粋€(gè)如下所示的請求:
{"id":1,"delay_by": 2000,"payload": "Hello","throw_exception": false }delay_by將使響應(yīng)延遲,throw_exception將使對(duì)錯(cuò)誤的響應(yīng)消失。 合理的響應(yīng)如下:
{"id": "1","received": "Hello","payload": "Response Message" }我將忽略此職位的例外情況。
CompletableFuture作為返回類型
考慮一個(gè)返回java 8 CompletableFuture作為返回類型的服務(wù):
public CompletableFuture<MessageAcknowledgement> handleMessage(Message message) {return CompletableFuture.supplyAsync(() -> {Util.delay(message.getDelayBy());return new MessageAcknowledgement(message.getId(), message.getPayload(), "data from CompletableFutureService");}, futureExecutor); }現(xiàn)在,調(diào)用此服務(wù)的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);}}當(dāng)CompletableFuture完成時(shí),框架將確保適當(dāng)?shù)卣眄憫?yīng)。
Rx Java可觀察為返回類型
考慮將Rx Java Observable作為返回類型返回的服務(wù):
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"));}); }調(diào)用此類服務(wù)??的控制器現(xiàn)在可以直接將Observable作為類型返回,并且框架將確保一旦發(fā)出所有項(xiàng)目,響應(yīng)就會(huì)正確地編組。
@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到許多項(xiàng)目的流,因此這次響應(yīng)是一個(gè)json數(shù)組。
Spring Reactor Core Flux作為返回類型
最后,如果響應(yīng)類型是Flux類型,則框架確保響應(yīng)被干凈處理。 該服務(wù)遵循以下原則:
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"));}); }以及使用此類服務(wù)??的控制器:
@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);}}結(jié)論
這只是Spring Reactive項(xiàng)目支持的返回類型的示例,可能的返回類型遠(yuǎn)不止于此–這里是一個(gè)更全面的示例。
我期待反應(yīng)式編程模型在核心Spring框架中可用。
我的github存儲(chǔ)庫中提供了此博客文章中提供的示例
翻譯自: https://www.javacodegeeks.com/2016/06/spring-reactive-samples.html
總結(jié)
- 上一篇: OPPO 与索尼合作推出新一代 LYTI
- 下一篇: 浏览器网页不显示图片怎么办解决方法