@Override public void onComplete() { AsyncInputStreamAdapter.this.complete = true; terminatePendingReads(); } }
protected void request(int n) { if (complete) { terminatePendingReads(); return; } Operators.addCap(DEMAND, this, n); if (SUBSCRIBED.get(this) == SUBSCRIPTION_NOT_SUBSCRIBED) { if (SUBSCRIBED.compareAndSet(this, SUBSCRIPTION_NOT_SUBSCRIBED, SUBSCRIPTION_SUBSCRIBED)) { buffers.subscribe(new DataBufferCoreSubscriber()); } } else { Subscription subscription = this.subscription; if (subscription != null) { requestFromSubscription(subscription); } } }
/** * Creates a {@link Mono} emitting a {@link AsyncInputStream} to consume a {@link Publisher} emitting * {@link DataBuffer} and exposing the binary stream through {@link AsyncInputStream}. {@link DataBuffer}s are * released by the adapter during consumption. * <p/> * This method returns a {@link Mono} to retain the {@link reactor.util.context.Context subscriber context}. * * @param dataBuffers must not be {@literal null}. * @return {@link Mono} emitting {@link AsyncInputStream}. * @see DataBufferUtils#release(DataBuffer) */ static Mono<AsyncInputStream> toAsyncInputStream(Publisher<? extends DataBuffer> dataBuffers) { return Mono.create(sink -> { sink.success(new AsyncInputStreamAdapter(dataBuffers, sink.currentContext())); }); } }
@Override public void onNext(DataBuffer dataBuffer) { if (cancelled || complete) { DataBufferUtils.release(dataBuffer); Operators.onNextDropped(dataBuffer, AsyncInputStreamAdapter.this.subscriberContext); return; } BiConsumer<DataBuffer, Integer> poll = AsyncInputStreamAdapter.this.readRequests.poll(); if (poll == null) { DataBufferUtils.release(dataBuffer); Operators.onNextDropped(dataBuffer, AsyncInputStreamAdapter.this.subscriberContext); subscription.cancel(); return; } poll.accept(dataBuffer, dataBuffer.readableByteCount()); requestFromSubscription(subscription); }
@Override public Publisher<Integer> read(ByteBuffer dst) { return Mono.create(sink -> { readRequests.offer((db, bytecount) -> { try { if (error != null) { sink.error(error); return; } if (bytecount == -1) { sink.success(-1); return; } ByteBuffer byteBuffer = db.asByteBuffer(); int toWrite = byteBuffer.remaining(); dst.put(byteBuffer); sink.success(toWrite); } catch (Exception e) { sink.error(e); } finally { DataBufferUtils.release(db); } }); request(1); }); }
@Override public void onError(Throwable t) { if (AsyncInputStreamAdapter.this.cancelled || AsyncInputStreamAdapter.this.complete) { Operators.onErrorDropped(t, AsyncInputStreamAdapter.this.subscriberContext); return; } AsyncInputStreamAdapter.this.error = t; AsyncInputStreamAdapter.this.complete = true; terminatePendingReads(); }