ActiveJ框架学习——Async I/O之Datastream(一)

2021SC@SDUSC

概述:

Datastream is an extremely fast implementation of reactive streams. It is useful for intra and inter-server communication and asynchronous data processing.

 Datastream是一个非常快速的反应式流的实现。 它对服务器内和服务器间的 通信和异步数据处理非常有用

特点:

  • 一个现代的异步反应流的实现(不同于Java 8中的流和传统的基于线程的阻塞流)。
  • 具有极其有效的背压控制的异步性,以处理数据源速度的自然不平衡问题
  • 可组合的流操作(映射器、还原器、过滤器、分类器、合并/拆分器、压缩、序列化)。
  • 在Eventloop模块之上的基于流的网络和文件I/O
  • 与CSP模块相兼容

 与CSP的比较

 可以发现,这与上一篇讲到的CSP有一定的相似之处。将两者比较一下。

  • 开销:Datastream的开销极低,可以通过1个虚拟呼叫启动;CSP无短路评估,开销较高
  • 吞吐速度:Datastream:极快;CSP:速度快,但慢于Datastream
  • 对象:Datastream用于传输小段数据;CSP用于传输中型对象,如ByteBufs
  • 编程模型:DataStream更复杂,CSP更简单方便

 为了提供最高的效率,ActiveJ广泛使用CSP和Datastream的组合。为此,ChannelSupplier、ChannelConsumer、StreamSupplier 和 StreamConsumer 具有 transformWith() 方法和特殊的 Transformer 接口。使用这些方法和接口,我们可以将通道无缝转换为其他通道或数据流,反之亦然,从而创建此类转换链。

 这是Datastream的主要代码部分,首先我们来看一下AbstractStreamConsumer类。这是StreamConsumer的抽象类,该类有助于处理状态转换,并帮助实现基本行为。

其含有的方法有:

	protected void onInit() {
	}

	protected void onStarted() {
	}

	protected void onEndOfStream() {
	}

	public final void resume(@Nullable StreamDataAcceptor<T> dataAcceptor) {
		if (CHECK) checkState(eventloop.inEventloopThread(), "Not in eventloop thread");
		if (endOfStream) return;
		if (this.dataAcceptor == dataAcceptor) return;
		this.dataAcceptor = dataAcceptor;
		if (!isStarted()) return;
		supplier.updateDataAcceptor();
	}

    public final void suspend() {
		resume(null);
	}

	public final void acknowledge() {
		if (CHECK) checkState(eventloop.inEventloopThread(), "Not in eventloop thread");
		ensureInitialized();
		endOfStream = true;
		if (acknowledgement.trySet(null)) {
			cleanup();
		}
	}

	protected void onError(Exception e) {
	}

	private void ensureInitialized() {
		if (!initialized) {
			initialized = true;
			onInit();
		}
	}

	protected void onCleanup() {
	}
  • onInit():此方法将只调用一次:在创建此供应商后的下一个事件循环价格中,或者在 {@link #onStarted()} 或 {@link #onError(异常)} 调用之前调用
  • onStarted():当此使用者开始接收项目时,将调用此方法。如果消费者从未收到任何关闭的东西,则可能不会调用它。
  • onEndOfStream():当关联供应商关闭时,将调用此方法。
  • resume():开始将数据接收到给定的受体中,恢复关联的供应商以从其接收数据。
  • suspend():暂停关联的供应商。
  • acknowledge():触发此使用者的 {getAcknowledgement() }。
  • onError():当此使用者错误地更改为已确认状态时,将调用此方法。
  • ensureInitialized():仅当尚未初始化此使用者时,才通过调用 {@link #onInit()} 来初始化此使用者。
  • onCleanup():此使用者更改为确认状态后,无论出现错误,都将异步调用此方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值