ReactorTest

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
  <dependency>
    <groupId>io.projectreactor</groupId>
    <artifactId>reactor-core</artifactId>
    <version>3.2.8.RELEASE</version>
  </dependency>
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-test</artifactId>
      <version>3.2.8.RELEASE</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import reactor.core.publisher.Flux;

@Slf4j
public class ReactorTest {


  public static void main(String[] args) {
   /* Mono.fromCallable(System::currentTimeMillis)
        .doOnSuccess(r -> log.info("1"))
        .subscribe(r -> log.info("2"));
    Flux.interval(Duration.of(500, ChronoUnit.MILLIS)).subscribe(r -> log.info(""+r));
    CompletableFuture.supplyAsync(System::currentTimeMillis).join();*/

    //防止程序过早退出,放一个CountDownLatch拦住
   /* CountDownLatch latch = new CountDownLatch(1);
    try {
      latch.await();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }*/
    Flux.just(1, 2, 3, 4, 5).subscribe(new Subscriber<Integer>() { // 1

      @Override
      public void onSubscribe(Subscription s) {
        log.info("onSubscribe");
        s.request(6);   // 2
      }

      @Override
      public void onNext(Integer integer) {
        log.info("onNext:" + integer);
      }

      @Override
      public void onError(Throwable t) {

      }

      @Override
      public void onComplete() {
        log.info("onComplete");
      }
    });
  }
}

 

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import reactor.core.publisher.Flux;

@Slf4j
public class ReactorTest {

  public static void main(String[] args) throws ExecutionException, InterruptedException {

    MyTask myTask = new MyTask();//实例化任务,传递参数
    FutureTask<Integer> futureTask = new FutureTask<>(myTask);//将任务放进FutureTask里
    //采用thread来开启多线程,futuretask继承了Runnable,可以放在线程池中来启动执行
    Thread thread = new Thread(futureTask);
    thread.start();

    log.info("begin");
    MySubscriber mySubscriber = new MySubscriber();
    Flux.just(futureTask.get()).subscribe(mySubscriber);

    Integer result = mySubscriber.getI();
    log.info("result: "+ result);
  }
}

@Slf4j
class MyTask  implements Callable<Integer>{

  //任务执行的动作
  @Override
  public Integer call() throws Exception {

   Thread.sleep(2000);
    Random r = new Random();
    int i = r.nextInt(5);
    log.info("set i ="+i);
    return i;
  }
}

@Slf4j
class MySubscriber  implements Subscriber<Integer>{

  private Integer i;

  @Override
  public void onSubscribe(Subscription s) {
    log.info("onSubscribe");
    s.request(2);
  }

  @Override
  public void onNext(Integer integer) {
    log.info("onNext "+integer);
    i = integer;
    log.info("onNext i="+i);
  }

  @Override
  public void onError(Throwable throwable) {
    log.info("onError");
  }

  @Override
  public void onComplete() {
    log.info("onComplete");
  }

  public Integer getI() {
    return i;
  }
}

 

import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.CountDownLatch;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import reactor.core.publisher.Flux;

@Slf4j
public class ReactorTestOld {
  public static void main(String[] args) {
   // Flux.interval(Duration.of(500, ChronoUnit.MILLIS)).subscribe(r -> log.info(""+r));
    Flux.interval(Duration.of(500, ChronoUnit.MILLIS)).subscribe(new Subscriber<Long>() { // 1

      @Override
      public void onSubscribe(Subscription s) {
        log.info("onSubscribe");
       //s.request(3);   // 2
        s.request(Long.MAX_VALUE);
      }

      @Override
      public void onNext(Long integer) {
        log.info("onNext:" + integer);
      }

      @Override
      public void onError(Throwable e) {
        log.error("onError:" ,e);
      }

      @Override
      public void onComplete() {
        log.info("onComplete");
      }
    });
    CountDownLatch latch = new CountDownLatch(1);
    try {
      latch.await();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>test</name>
  <url>http://maven.apache.org</url>

  <properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
  </properties>

    
    
  <dependencies>
     <!-- <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
            <exclusions>去掉默认配置  
                <exclusion>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-starter-logging</artifactId>  
                </exclusion>  
                </exclusions> 
     </dependency>  
       <dependency> 引入log4j2依赖  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-log4j2</artifactId>  
        </dependency>
    <dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency> -->

    <!--<dependency>
      <groupId>io.reactivex.rxjava2</groupId>
      <artifactId>rxjava</artifactId>
      <version>2.1.7</version>
    </dependency>-->

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

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.1</version>
</dependency>

<!--log4j相关配置开始-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.3</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
 </dependencies>
  
     <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.1</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
</project>
package com.test.reactor;

import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

@Slf4j
public class MonoTest {
  public static void main(String[] args) {
    /*Mono.fromCallable(System::currentTimeMillis)
        .flatMap(time -> Mono.first(serviceA.findRecent(time), serviceB.findRecent(time)))
        .timeout(Duration.ofSeconds(3), errorHandler::fallback)
        .doOnSuccess(r -> serviceM.incrementSuccess())
        .subscribe(System.out::println);*/
   /* Flux.range(1,4)

        .filter(e -> {
      log.info("filter thread:[{}]",Thread.currentThread().getName());
      return e % 2 == 0;
    })
        .subscribeOn(Schedulers.newSingle("newSingle1"))
        .publishOn(Schedulers.newSingle("newSingle2"))
        .subscribe(e-> {
          log.info("log thread:[{}]",Thread.currentThread().getName());
          System.out.println(e);});*/
    Flux.range(1,4)

        //.delayUntil(MonoTest::request)
        /*.subscribeOn(Schedulers.elastic())
        .filter(e -> {
          log.info("filter thread:[{}]",Thread.currentThread().getName());
          return e % 2 == 0;
        })*/
        // .publishOn(Schedulers.newSingle("newSingle2"))
        .doOnComplete(()->Mono.just(6).subscribeOn(Schedulers.elastic()).subscribe(e-> log.info(""+e)))
        .subscribe(e->  log.info(""+e));


    //LockSupport.park();
  }

  public static Mono<Void> request(int i) {
    // run in a separate thread (RabbitTemplate uses blocking calls)
    return Mono.fromRunnable(() -> {
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      log.info("log thread:[{}]",Thread.currentThread().getName());
      })
        .subscribeOn(Schedulers.newSingle("newSingle"))
        .then();
  }
}

 

posted @ 2020-06-03 19:58  tonggc1668  阅读(471)  评论(0编辑  收藏  举报