private void publish(byte[] buffer, int offset, int length) throws IOException { Objects.requireNonNull(buffer); try { final Flow.Subscriber<? super ByteBuffer> sub = subscriber.get(); while (!subscriber.isClosed() && !requested.tryDecrement()) { Thread.sleep(250); // wait until some data can be sent or the stream has been closed } synchronized (invocationLock) { if (subscriber.isClosed()) { throw new IOException("Output stream already closed."); } sub.onNext(ByteBuffer.wrap(buffer, offset, length)); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); complete(e); throw new IOException(e); } catch (ExecutionException e) { complete(e.getCause()); throw new IOException(e.getCause()); } }
private void publish(byte[] buffer, int offset, int length) throws IOException { Objects.requireNonNull(buffer); try { final Flow.Subscriber<? super ByteBuffer> sub = subscriber.get(); while (!subscriber.isClosed() && !requested.tryDecrement()) { //java9 //Thread.onSpinWait(); // wait until some data can be sent or the stream has been closed //java8 :( Thread.sleep(30); } synchronized (invocationLock) { if (subscriber.isClosed()) { throw new IOException("Output stream already closed."); } sub.onNext(ByteBuffer.wrap(buffer, offset, length)); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); complete(e); throw new IOException(e); } catch (ExecutionException e) { complete(e.getCause()); throw new IOException(e.getCause()); } }
singleSubscriber.onNext(item); } finally { nexting = false;
private void publish(byte[] buffer, int offset, int length) throws IOException { Objects.requireNonNull(buffer); try { final Flow.Subscriber<? super ByteBuffer> sub = subscriber.get(); while (!subscriber.isClosed() && !requested.tryDecrement()) { Thread.sleep(250); // wait until some data can be sent or the stream has been closed } synchronized (invocationLock) { if (subscriber.isClosed()) { throw new IOException("Output stream already closed."); } sub.onNext(ByteBuffer.wrap(buffer, offset, length)); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); complete(e); throw new IOException(e); } catch (ExecutionException e) { complete(e.getCause()); throw new IOException(e.getCause()); } }
private void tryPublish() { while (!subscriber.isClosed() && (requested.get() > 0) && publishing.compareAndSet(false, true)) { try { final Flow.Subscriber<? super ByteBuffer> sub = this.subscriber.get(); // blocking retrieval while (!subscriber.isClosed() && requested.tryDecrement()) { int len = inputStream.read(buffer); if (len >= 0) { sub.onNext(ByteBuffer.wrap(buffer, 0, len)); } else { tryComplete(); } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); tryComplete(e); } catch (IOException | ExecutionException e) { tryComplete(e); } finally { publishing.set(false); // give a chance to some other thread to publish } } }
@Override public void onNext(T item) { delegate.onNext(item); }
private void handleValve() { valve.handle((data) -> { singleSubscriber.onNext(data); pausableFeeder.acquire(); }, throwable -> singleSubscriber.onError(new IllegalStateException( "Valve to Publisher in an error.", throwable)), singleSubscriber::onComplete); }
@Override public void onNext(T event) { if (lastEvent == event) { // do NOT repeat same event more than once to same Subscriber //missed event must be requested once more subscription.request(1); } else { lastEvent = event; delegate.onNext(event); } }
@Override public void onNext(ConfigDiff event) { //(3. fire just on case the sub-node has changed) if (event.changedKeys().contains(AbstractConfigImpl.this.realKey)) { delegate.onNext(AbstractConfigImpl.this.contextConfig(event.config())); } else { subscription.request(1); } }
@Override public void onNext(ConfigDiff event) { if (ConfigFactory.this.config() == event.config()) { //ignore events about current Config instance //missed event must be requested once more subscription.request(1); } else { delegate.onNext(event); } }
@Override public void onNext(T o) { subscriber.onNext(o); }
subscr.onNext(chunk); } else { curentChunk = chunk;
singleSubscriber.onNext(item); } else { LOGGER.finest(() -> "Not publishing due to low request count: " + nextCount + " <= " + reqCount);
private void tryPublish() { while (!subscriber.isClosed() && (requested.get() > 0) && publishing.compareAndSet(false, true)) { try { final Flow.Subscriber<? super ByteBuffer> sub = this.subscriber.get(); // blocking retrieval while (!subscriber.isClosed() && requested.tryDecrement()) { int len = inputStream.read(buffer); if (len >= 0) { sub.onNext(ByteBuffer.wrap(buffer, 0, len)); } else { tryComplete(); } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); tryComplete(e); } catch (IOException | ExecutionException e) { tryComplete(e); } finally { publishing.set(false); // give a chance to some other thread to publish } } }
@Override public void onNext(T o) { subscriber.onNext(o); }
@Override public void onNext(ConfigDiff event) { if (ConfigFactory.this.config() == event.config()) { //ignore events about current Config instance //missed event must be requested once more subscription.request(1); } else { delegate.onNext(event); } }
@Override public void onNext(T item) { delegate.onNext(item); }
@Override public void onNext(T event) { if (lastEvent == event) { // do NOT repeat same event more than once to same Subscriber //missed event must be requested once more subscription.request(1); } else { lastEvent = event; delegate.onNext(event); } }
private void handleValve() { valve.handle((data) -> { singleSubscriber.onNext(data); pausableFeeder.acquire(); }, throwable -> singleSubscriber.onError(new IllegalStateException( "Valve to Publisher in an error.", throwable)), singleSubscriber::onComplete); }
@Override public void onNext(ConfigDiff event) { //(3. fire just on case the sub-node has changed) if (event.changedKeys().contains(AbstractConfigImpl.this.realKey)) { delegate.onNext(AbstractConfigImpl.this.contextConfig(event.config())); } else { subscription.request(1); } }