webflux-响应式编程

响应式流

 

Java 9 新引入了Reactive Stream(响应式流),而应用了响应式流的编程即为响应式编程

Reactive Stream标准:异步的流处理,并支持非阻塞式的 backpressure(背压? 很拗口的翻译,就是生产者与消费者之者应有流量控制)

Java 9 - 说说ååºå¼æµ

既然 Reactive Stream 和 Java 8 引入的 Stream 都叫做流,它们之间有什么关系呢?有一点关系,Java 8 的 Stream 主要关注在流的过滤,映射,合并,而  Reactive Stream 更进一层,侧重的是流的产生与消费,即流在生产与消费者之间的协调

 

2015 年,正式的 Reactive Stream 出台,发布在http://www.reactive-streams.org/

 

实现了Reactive Stream标准的有

  • Akka Streams(1.0-RC2)
  • MongoDB (1.0.0)
  • Ratpack (0.9.16), 可用来创建非阻塞式 HTTP 应用
  • Reactive Rabbit (1.0.0), Rabiit MQ /AMQP 的驱动
  • Reactor (Spring 5 的响应式 MVC 就是用的它)
  • RxJava (1.0.0), Netflix 出品
  • Slick (3.0.0), Scala 的函数式关系映射组件,用于操作 数据库
  • Vert.x 3.0 (milestone-5a), Ecl ip se 出品,也能用于构建非阻塞式 HTTP 应用
  • Java 9 Reactive Streams Flow API 

 所以引入了Spring 5的已经可以开始使用了,不必将项目升级为Java 9支持

 参考:http://ju.outofmemory.cn/entry/360633

 

webflux学习demo

Handler:

package com.jesse.reactiveWebDemo.handler;

import com.jesse.reactiveWebDemo.domain.Man;
import com.jesse.reactiveWebDemo.repository.ManMongoRepository;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * ServerResponse 是对响应的封装,可以设置响应状态、响应头、响应正文。
 * 比如 ok 代表的是 200 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。
 * <p>
 * 这里用 Mono 作为返回对象,是因为返回包含了一个 ServerResponse 对象,而不是多个元素。
 */
@Component
public class HelloHandler {

//    @Autowired
//    ManRepository manRepository;

    @Autowired
    ManMongoRepository manMongoRepository;

    public Mono<ServerResponse> hello(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                .body(BodyInserters.fromObject("Hello, my lover!"));
    }

    public Mono<Man> save(Man man) {
        return manMongoRepository.save(man);
    }

    public Mono<Man> findCityById(ObjectId id) {

        return manMongoRepository.findById(id);
    }

    public Flux<Man> findAllCity() {
        return manMongoRepository.findAll();
    }
}

 Router

@Configuration
public class HelloRouter {
    @Bean
    public RouterFunction<ServerResponse> route(HelloHandler cityHandler) {

        BinaryOperator<Long> binaryOperator = (Long x, Long y) -> x + y;
        return RouterFunctions
                .route(RequestPredicates.GET("/save")
                                .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        cityHandler::hello);
    }
}

由于mysql不支持异步型的事务,所以无法使用webflux

故这里用了mongodb作为实例

 

webflux-demo源码

https://github.com/Jesse-so-cool/webflux-demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值