@Override public <U> UpdateHandlerRegistration<U> registerUpdateHandler( SubscriptionQueryMessage<?, ?, ?> query, SubscriptionQueryBackpressure backpressure, int updateBufferSize) { EmitterProcessor<SubscriptionQueryUpdateMessage<U>> processor = EmitterProcessor.create(updateBufferSize); FluxSink<SubscriptionQueryUpdateMessage<U>> sink = processor.sink(backpressure.getOverflowStrategy()); sink.onDispose(() -> updateHandlers.remove(query)); FluxSinkWrapper<SubscriptionQueryUpdateMessage<U>> fluxSinkWrapper = new FluxSinkWrapper<>(sink); updateHandlers.put(query, fluxSinkWrapper); Registration registration = () -> { fluxSinkWrapper.complete(); return true; }; return new UpdateHandlerRegistration<>(registration, processor.replay(updateBufferSize).autoConnect()); }
public AxonServerSubscriptionQueryResult( SubscriptionQuery query, Function<StreamObserver<SubscriptionQueryResponse>, StreamObserver<SubscriptionQueryRequest>> openStreamFn, AxonServerConfiguration configuration, SubscriptionQueryBackpressure backPressure, int bufferSize, Runnable onDispose) { this.onDispose = onDispose; this.subscriptionQuery = query; EmitterProcessor<QueryUpdate> processor = EmitterProcessor.create(bufferSize); this.updateMessageFluxSink = processor.sink(backPressure.getOverflowStrategy()); StreamObserver<SubscriptionQueryRequest> subscription = openStreamFn.apply(this); Function<FlowControl, SubscriptionQueryRequest> requestMapping = flowControl -> newBuilder().setFlowControl(SubscriptionQuery.newBuilder(subscriptionQuery) .setNumberOfPermits(flowControl.getPermits())).build(); requestObserver = new FlowControllingStreamObserver<>(subscription, configuration, requestMapping, t -> false); requestObserver.sendInitialPermits(); requestObserver.onNext(newBuilder().setSubscribe(subscriptionQuery).build()); updateMessageFluxSink.onDispose(requestObserver::onCompleted); Registration registration = () -> { updateMessageFluxSink.complete(); return true; }; Mono<QueryResponse> mono = Mono.create(sink -> initialResult(sink, requestObserver::onNext)); this.result = new DefaultSubscriptionQueryResult<>(mono, processor.replay().autoConnect(), registration); }
FluxSink<SubscriptionQueryUpdateMessage<U>> sink = processor.sink(backpressure.getOverflowStrategy()); sink.onDispose(() -> updateHandlers.remove(query)); FluxSinkWrapper<SubscriptionQueryUpdateMessage<U>> fluxSinkWrapper = new FluxSinkWrapper<>(sink);
@Override public <U> UpdateHandlerRegistration<U> registerUpdateHandler( SubscriptionQueryMessage<?, ?, ?> query, SubscriptionQueryBackpressure backpressure, int updateBufferSize) { EmitterProcessor<SubscriptionQueryUpdateMessage<U>> processor = EmitterProcessor.create(updateBufferSize); FluxSink<SubscriptionQueryUpdateMessage<U>> sink = processor.sink(backpressure.getOverflowStrategy()); sink.onDispose(() -> updateHandlers.remove(query)); FluxSinkWrapper<SubscriptionQueryUpdateMessage<U>> fluxSinkWrapper = new FluxSinkWrapper<>(sink); updateHandlers.put(query, fluxSinkWrapper); Registration registration = () -> { fluxSinkWrapper.complete(); return true; }; return new UpdateHandlerRegistration<>(registration, processor.replay(updateBufferSize).autoConnect()); }
public AxonServerSubscriptionQueryResult( SubscriptionQuery query, Function<StreamObserver<SubscriptionQueryResponse>, StreamObserver<SubscriptionQueryRequest>> openStreamFn, AxonServerConfiguration configuration, SubscriptionQueryBackpressure backPressure, int bufferSize, Runnable onDispose) { this.onDispose = onDispose; this.subscriptionQuery = query; EmitterProcessor<QueryUpdate> processor = EmitterProcessor.create(bufferSize); this.updateMessageFluxSink = processor.sink(backPressure.getOverflowStrategy()); StreamObserver<SubscriptionQueryRequest> subscription = openStreamFn.apply(this); Function<FlowControl, SubscriptionQueryRequest> requestMapping = flowControl -> newBuilder().setFlowControl(SubscriptionQuery.newBuilder(subscriptionQuery) .setNumberOfPermits(flowControl.getPermits())).build(); requestObserver = new FlowControllingStreamObserver<>(subscription, configuration, requestMapping, t -> false); requestObserver.sendInitialPermits(); requestObserver.onNext(newBuilder().setSubscribe(subscriptionQuery).build()); updateMessageFluxSink.onDispose(requestObserver::onCompleted); Registration registration = () -> { updateMessageFluxSink.complete(); return true; }; Mono<QueryResponse> mono = Mono.create(sink -> initialResult(sink, requestObserver::onNext)); this.result = new DefaultSubscriptionQueryResult<>(mono, processor.replay().autoConnect(), registration); }