reactive streaming

Reactive Streaming : 可背压的异步数据流规范,,,是一套异步流式处理+ 背压(backpressure)机制的规范,,是一套接口标准:

  • Publisher
  • Subscriber
  • Subscription
  • Processor<T,R> : 数据转换器

消费者控制节奏:由Subscriber订阅者决定要多少数据,,,Publisher只能发被请求的数量,,通过中间的Subscription控制, 数据可以通过Processor进行转换过滤

基于Reactive Streaming 规范实现的有:

  • java9中的Flow
  • RxJava
  • spring webflux

等

接口:

java 复制代码
public interface Publisher<T> {


    void subscribe(Subscriber<? super T> subscriber);
}
java 复制代码
public interface Subscriber<T> {


    void onSubscribe(Subscription subscription);


    void onNext(T t);

    void onError(Throwable t);
    void onComplete();
}
java 复制代码
public interface Subscription {


    void request(long n);

    void cancel();
}
java 复制代码
public interface Processor<T,R> extends Subscriber<T>,Publisher<R>{



}

实现类:

java 复制代码
package com.cj;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

public class SimplePublisher implements Publisher<Integer>{

   private final int max;
   private Subscription subscription;

    public SimplePublisher(int max) {
        this.max = max;
    }


    @Override
    public void subscribe(Subscriber<? super Integer> subscriber) {
//        this.subscriber = subscriber

       Subscription subscription =  new SimpleSubscription(subscriber,max);
       subscriber.onSubscribe(subscription);

       this.subscription = subscription;
    }


    public void publish(long n){
            this.subscription.request(n);
    }



    static class SimpleSubscription implements Subscription{

        private final Subscriber<? super Integer> subscriber;

        private final int max;

        private AtomicLong requested = new AtomicLong(0);
        private AtomicInteger current = new AtomicInteger(1);

        SimpleSubscription(Subscriber<? super Integer> subscriber, int max) {
            this.subscriber = subscriber;
            this.max = max;
            start();
        }




        @Override
        public synchronized void request(long n) {
            requested.addAndGet(n);

            notify();
        }

        private void start(){
            new Thread(()->{

                synchronized (this){
                    while(true){

                        if (requested.get() == 0){
                            try {
                                wait();
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            }
                        }




                        requested.getAndDecrement();



                        subscriber.onNext(current.getAndIncrement());


                        if (current.get() > max){
                            subscriber.onComplete();
                            break;
                        }


                    }
                }


            }).start();
        }

        @Override
        public void cancel() {

        }
    }
}
java 复制代码
package com.cj;

public class SimpleSubscriber implements Subscriber<Integer>{

    private Subscription subscription;

    private int count = 0;
    @Override
    public void onSubscribe(Subscription subscription) {
        this.subscription = subscription;
    }

    @Override
    public void onNext(Integer item) {

        System.out.println("消费了:"+item);

        count++;

        if (count % 3 == 0){
            System.out.println("3的倍数。。。。。");
            subscription.request(3);
        }

    }

    @Override
    public void onError(Throwable t) {

    }

    @Override
    public void onComplete() {


        System.out.println("请求完了");
    }
}
java 复制代码
package com.cj;

import java.util.function.Function;

public class MyProcessor implements Processor<Integer,Integer>{
    Function<Integer,Integer> func = (a)->a*2;

    Subscription upStream;
    Subscriber<? super Integer> downStream;

    @Override
    public void subscribe(Subscriber<? super Integer> subscriber) {

        Subscription subscription = new Subscription() {
            @Override
            public void request(long n) {
                upStream.request(n);
            }

            @Override
            public void cancel() {
                upStream.cancel();
            }
        };

        this.downStream = subscriber;
        subscriber.onSubscribe(subscription);

    }

    @Override
    public void onSubscribe(Subscription subscription) {
        this.upStream = subscription;
    }

    @Override
    public void onNext(Integer item) {
        Integer mapped = func.apply(item);
        this.downStream.onNext(mapped);
    }

    @Override
    public void onError(Throwable t) {

    }

    @Override
    public void onComplete() {

    }
}

测试:

java 复制代码
public class Main {
    public static void main(String[] args) {


        SimplePublisher publisher = new SimplePublisher(10);

        MyProcessor myProcessor = new MyProcessor();
        SimpleSubscriber subscriber = new SimpleSubscriber();

        publisher.subscribe(myProcessor);
        myProcessor.subscribe(subscriber);

        publisher.publish(3);
    }
}
相关推荐
追星星の人几秒前
java web项目(eclipse软件)全流程备份
java·servlet
文丑颜不良啊1 小时前
LeetCode1461~1480题目解析
java·leetcode
2301_780789668 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设9 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn10 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵10 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David10 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10011 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin11 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php