/** * Observe a request execution and emit the response to the observer. * * @param supplier teh supplier * @return The hot observable (eagerly executes). */ public static Observable<Response> observe(final Func0<BoundRequestBuilder> supplier) { //use a ReplaySubject to buffer the eagerly subscribed-to Observable ReplaySubject<Response> subject = ReplaySubject.create(); //eagerly kick off subscription toObservable(supplier).subscribe(subject); //return the subject that can be subscribed to later while the execution has already started return subject; } }
/** * When set any client thread blocking on get() will immediately be unblocked and receive the single-valued response. * * @throws IllegalStateException * if called more than once or after setException. * @param response response to give to initial command */ @Override public void setResponse(T response) { if (!isTerminated()) { subject.onNext(response); valueSet.set(true); subject.onCompleted(); } else { throw new IllegalStateException("Response has already terminated so response can not be set : " + response); } }
/** * Set an exception if a response is not yet received otherwise skip it * * @param e synthetic error to set on initial command when no actual response is available */ public void setExceptionIfResponseNotReceived(Exception e) { if (!valueSet.get() && !isTerminated()) { subject.onError(e); } }
protected HystrixCachedObservable(final Observable<R> originalObservable) { ReplaySubject<R> replaySubject = ReplaySubject.create(); this.originalSubscription = originalObservable .subscribe(replaySubject); this.cachedObservable = replaySubject .doOnUnsubscribe(new Action0() { @Override public void call() { outstandingSubscriptions--; if (outstandingSubscriptions == 0) { originalSubscription.unsubscribe(); } } }) .doOnSubscribe(new Action0() { @Override public void call() { outstandingSubscriptions++; } }); }
@OnClick(R.id.replay_subject_default) public void onReplaySubjectDefault() { unsubscribe(); createSubscription(); ReplaySubject<Stock> stockReplaySubject = ReplaySubject.create(); stockReplaySubject.onNext(new Stock(GOOG, 715.09)); stockReplaySubject.onNext(new Stock(GOOG, 716.00)); stockReplaySubject.onNext(new Stock(GOOG, 714.00)); Subscription defaultSub = stockReplaySubject.subscribe(getDefaultSubscriber()); compositeSubscription.add(defaultSub); // All three values will be delivered. stockReplaySubject.onNext(new Stock(GOOG, 720)); stockReplaySubject.onCompleted(); // Terminate the stream with a completed event. // Subscribe again, this time the subscriber will get all events and the terminal event // right away. All items are "replayed" even though the stream has completed. Subscription tardySubscription = stockReplaySubject.subscribe(getTardySubscriber()); compositeSubscription.add(tardySubscription); }
bodyStream = ReplaySubject.create(); serverRequest = ServerRequestBuilder.buildServerRequest(request, bodyStream); bodyStream.onError(request.decoderResult().cause()); bodyStream.onNext(content.nioBuffer()); bodyStream.onError(httpContent.decoderResult().cause()); bodyStream.onCompleted();
/** * Emit a response that should be OnNexted to an Observer * @param response response to emit to initial command */ @Override public void emitResponse(T response) { if (!isTerminated()) { subject.onNext(response); valueSet.set(true); } else { throw new IllegalStateException("Response has already terminated so response can not be set : " + response); } }
@Override public void run() { ReplaySubject<Integer> subject = ReplaySubject.create(); subject.onNext(1); subject.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { log("Subscriber1:" + integer); } }); subject.onNext(2); subject.onNext(3); subject.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { log("Subscriber2:" + integer); } }); subject.onNext(4); } });
ReplaySubject<String> r = ReplaySubject.create(); r.onNext("1"); r.onNext("2"); r.subscribe(new Action1<String>() { @Override public void call(String s) { r.onNext("3"); ReplaySubject<Integer> r= ReplaySubject.createWithSize(2); r.onNext(1); r.onNext(2); r.onNext(3); r.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { r.onNext(4); ReplaySubject<Integer> r= ReplaySubject.createWithTime(150, TimeUnit.MILLISECONDS, Schedulers.immediate()); r.onNext(1); Thread.sleep(100); r.onNext(2); Thread.sleep(100); r.onNext(3); r.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) {
sub.onNext(res); sub.onCompleted(); } catch (final Exception e1) { sub.onError(e1);
/** * Complete current notification subject, and create a new one. All interest subscribers will onComplete. */ public void reset() { fullRegistrySubject.onCompleted(); notificationSubjects.clear(); Mockito.reset(registry); fullRegistrySubject = ReplaySubject.create(); }
public Observable<Net.HttpResponse> write (ByteString data) { Buffer buffer = Buffer.buffer (data.toByteArray ()); ReplaySubject<Net.HttpResponse> subject = ReplaySubject.createWithSize(1); request.handler (response -> { if (!okStatuses.contains (response.statusCode ())) { throw new IllegalStateException (format("Unexpected statusCode %s and message %S", response.statusCode (), response.statusMessage ())); } response.bodyHandler (body -> { subject.onNext ( new Net.HttpResponse () { @Override public BytesEvent data () { return Codecs.BYTES.from (body.getBytes ()); } @Override public int status () { return response.statusCode (); } }); subject.onCompleted (); }); }) .exceptionHandler ( ex -> subject.onError (ex)) .putHeader ("Content-Length", String.valueOf (buffer.length ())) .end (buffer); return subject; }
@OnClick(R.id.replay_subject_sized) public void onReplaySubjectSizedClick() { unsubscribe(); createSubscription(); // A replay subject that will only replay the last two items. ReplaySubject<Stock> stockReplaySubject = ReplaySubject.createWithSize(2); stockReplaySubject.onNext(new Stock(GOOG, 715.09)); stockReplaySubject.onNext(new Stock(GOOG, 716.00)); stockReplaySubject.onNext(new Stock(GOOG, 714.00)); // Only the last two items will be replayed to this subscriber (716 and 714) Subscription defaultSub = stockReplaySubject.subscribe(getDefaultSubscriber()); compositeSubscription.add(defaultSub); // All three values will be delivered. // This will also be emitted to the defaultSub above. stockReplaySubject.onNext(new Stock(GOOG, 720)); stockReplaySubject.onCompleted(); // Terminate the stream with a completed event. // Subscribe again, this time the subscriber will get the last two events and the terminal // event right away. The last two items are "replayed" even though the stream has completed. Subscription tardySubscription = stockReplaySubject.subscribe(getTardySubscriber()); compositeSubscription.add(tardySubscription); }
ReplaySubject<Stock> stockReplaySubject = ReplaySubject.createWithTime(250, TimeUnit.MILLISECONDS, Schedulers.immediate()); stockReplaySubject.onNext(new Stock(GOOG, 715.09)); Thread.sleep(100); stockReplaySubject.onNext(new Stock(GOOG, 716.00)); Thread.sleep(100); stockReplaySubject.onNext(new Stock(GOOG, 714.00)); Thread.sleep(100); Subscription defaultSub = stockReplaySubject.subscribe(getDefaultSubscriber()); stockReplaySubject.onNext(new Stock(GOOG, 720)); Thread.sleep(100); stockReplaySubject.onCompleted(); // Terminate the stream with a completed event. Subscription tardySubscription = stockReplaySubject.subscribe(getTardySubscriber()); compositeSubscription.add(tardySubscription);
private ReplaySubject<ChangeNotification<InstanceInfo>> getInterestSubject(final Interest<InstanceInfo> interest) { ReplaySubject<ChangeNotification<InstanceInfo>> subject = notificationSubjects.get(interest); if (subject == null) { subject = ReplaySubject.create(); final ReplaySubject<ChangeNotification<InstanceInfo>> finalSubject = subject; fullRegistrySubject.subscribe(new Subscriber<ChangeNotification<InstanceInfo>>() { @Override public void onCompleted() { finalSubject.onCompleted(); } @Override public void onError(Throwable e) { finalSubject.onError(e); } @Override public void onNext(ChangeNotification<InstanceInfo> notification) { if (notification.isDataNotification() && interest.matches(notification.getData())) { finalSubject.onNext(notification); } } }); notificationSubjects.put(interest, subject); } return subject; } }
private SubscriptionProxy(Observable<T> upstreamObservable, Action0 onTerminate) { ReplaySubject<T> replaySubject = ReplaySubject.create(); upstreamSubscription = upstreamObservable.subscribe(replaySubject); proxy = replaySubject.doOnTerminate(onTerminate); subscriptionList = new CompositeSubscription(upstreamSubscription); }
public static RxJava1SubjProxy serializedReplaySubjectProxy() { return new RxJava1SubjProxy(ReplaySubject.create().toSerialized()); }
@Override public void run() { try { ReplaySubject<Integer> subject = ReplaySubject.createWithTime(150, TimeUnit.MILLISECONDS, Schedulers.immediate()); subject.onNext(1); Thread.sleep(100); subject.onNext(2); Thread.sleep(100); subject.onNext(3); subject.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { log("" + integer); } }); subject.onNext(4); } catch (InterruptedException e) { log("error:" + e.getMessage()); } } });
@Override public void operationComplete(Future<? super Channel> future) throws Exception { if (future.isSuccess()) { sslCompletionStatus.onCompleted(); } else { sslCompletionStatus.onError(future.cause()); } } });