012、Project Reactor

一、什么是Project Reactor

官网  https://projectreactor.io/

由表及里学 ProjectReactor   http://blog.yannxia.top/2018/06/26/java/spring/projectreactor/

即 响应式编程。主要解决了回调地狱(callback hell)的问题。

 

二、如何使用

1. 引入依赖

		<dependency>
			<groupId>io.projectreactor</groupId>
			<artifactId>reactor-core</artifactId>
		</dependency>

 

2. 例子

	@Override
	public void run(ApplicationArguments args) throws Exception {

		Flux.range(1, 6)
		        .doOnRequest(n -> log.info("Request {} number", n)) // 注意顺序造成的区别
		        .publishOn(Schedulers.elastic())
				.doOnComplete(() -> log.info("Publisher COMPLETE 1"))
				.map(i -> {
					log.info("Publish   thread: {}, i: {}", Thread.currentThread(), i);
//					return i / (3 - i);
					return i;
				})
//				.onErrorReturn(-1)  // onErrorReturn 和  onErrorResume 顺序,在前优先
				.onErrorResume(e -> {
					log.error("ErrorResume: {}", e.toString());
					return Mono.just(-2);
				})
				.doOnComplete(() -> log.info("Publisher COMPLETE 2"))
				.subscribeOn(Schedulers.elastic())
				.subscribe(i -> log.info("Subscribe thread: {}, i: {}", Thread.currentThread(), i)
						,e -> log.error("error: {}", e.toString())
						,() -> log.info("Subscriber COMPLETE")
//						,s -> s.request(4)
						);
		
		Thread.sleep(2000);
	}

 

二、redis with reactive

1. 引入依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
		</dependency>

 

2. 例子

	private void reactiveRedis() throws InterruptedException {
		ReactiveHashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();
		
		String KEY = "reactor-redis";
		
		CountDownLatch countDownLatch = new CountDownLatch(1);
		
		Flux.fromArray(new String[] {"123", "456"})
		    .publishOn(Schedulers.single())
		    .doOnComplete(() -> log.info("list ok"))
		    .flatMap(c -> {
                log.info("try to put {}: {}", c, c);
                return opsForHash.put(KEY, c, c);
            })
		    .doOnComplete(() -> log.info("set ok"))
		    .concatWith(redisTemplate.expire(KEY, Duration.ofMinutes(1)))
		    .doOnComplete(() -> log.info("expire ok"))
		    .onErrorResume(e -> {
                log.error("exception {}", e.getMessage());
                return Mono.just(false);
            })
		    .subscribe(b -> log.info("subscribe: {}", b)
		    		,
                    e -> log.error("Exception {}", e.getMessage())
                    ,
                    () -> countDownLatch.countDown()
                    );
		    ;
		    
		    countDownLatch.await();
	}

 

三、mongodb with reactive

1. 引入依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
		</dependency>

 

2. 例子

	private void reactiveMongo() throws InterruptedException {
		CountDownLatch cdl = new CountDownLatch(2);
		
		List<Coffee> objectsToSave = Arrays.asList(new Coffee().setName("猫屎咖啡").setPrice(19).setCreateTime(new Date()).setUpdateTime(new Date()),
				new Coffee().setName("拿铁咖啡").setPrice(15).setCreateTime(new Date()).setUpdateTime(new Date()));
		
		mongoTemplate.insertAll(objectsToSave)
		    .publishOn(Schedulers.elastic())
		    .doOnNext(c -> log.info("Next: {}", c))
		    .doOnComplete(() -> {
		    	log.info("Runnable");
		    	mongoTemplate.updateMulti(Query.query(Criteria.where("price").gte(16)),
						        new Update().inc("price", -5)
								    .currentDate("updateTime"),
								Coffee.class)
				    .doFinally(s -> {
						cdl.countDown();
						log.info("Finnally 2, {}", s);
					})
					.subscribe(r -> log.info("Result is {}", r));
		    })
		    .doFinally(s -> {
				cdl.countDown();
				log.info("Finnally 1, {}", s);
			})
		    .count()
		    .subscribe(c -> log.info("Insert {} records", c));
		
		cdl.await();
	}

 

源码

Fork me on Gitee

转载于:https://my.oschina.net/tita/blog/3062656

Project Reactor是基于反应式流规范的Java库,用于编写异步、可伸缩、非阻塞的响应式应用程序。它提供了一种声明式的编程方式,使得编写响应式代码变得更加容易。 以下是一些学习Project Reactor的资源: 1. 官方文档:Project Reactor的官方文档提供了对该库的全面介绍和使用指南,包括基本概念、操作符、错误处理等方面的内容。文档地址:https://projectreactor.io/docs/core/release/reference/ 2. Spring官方文档:Spring Framework 5.0及以上版本已经完全支持响应式编程,其中就包括了对Project Reactor的支持。Spring官方文档提供了有关在Spring应用程序中使用Project Reactor的详细信息。文档地址:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux 3. Reactive Programming with Reactor 3:这是一本介绍Project Reactor的书籍,它提供了深入的探讨,包括基本概念、响应式流处理、操作符、错误处理等方面的内容。该书还提供了许多实际的示例,帮助读者更好地理解和运用Project Reactor。书籍地址:https://www.packtpub.com/web-development/reactive-programming-reactor-3 4. Spring Boot Reactor Starter:这是一个Spring Boot的starter,它提供了对Project Reactor的集成和自动配置。使用这个starter可以快速地在Spring Boot应用程序中使用Project Reactor。GitHub地址:https://github.com/reactor/reactor-bom 5. Reactive Spring示例应用程序:这是一个使用Spring Boot和Project Reactor的完整示例应用程序,它包括一个简单的Web界面和一个使用响应式流的后台服务。GitHub地址:https://github.com/spring-projects/spring-reactive-samples 希望以上资源能够帮助你快速入门Project Reactor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值