Search in sources :

Example 1 with RxThreadFactory

use of rx.internal.util.RxThreadFactory in project mantis by Netflix.

the class MantisRxSingleThreadSchedulerTest method testObserveOnAfterOnCompleteMantisRxScheduler.

@Test
public void testObserveOnAfterOnCompleteMantisRxScheduler() throws InterruptedException {
    int nThreads = 6;
    final MantisRxSingleThreadScheduler[] mantisRxSingleThreadSchedulers = new MantisRxSingleThreadScheduler[nThreads];
    RxThreadFactory rxThreadFactory = new RxThreadFactory("MantisRxScheduler-");
    logger.info("creating {} Mantis threads", nThreads);
    for (int i = 0; i < nThreads; i++) {
        mantisRxSingleThreadSchedulers[i] = new MantisRxSingleThreadScheduler(rxThreadFactory);
    }
    int numInnerObs = 10;
    int valuesPerCompletingInnerObs = 2;
    int valuesToWaitFor = numInnerObs * valuesPerCompletingInnerObs + 10;
    Observable<Observable<String>> oo = createSourceObs(numInnerObs, valuesPerCompletingInnerObs);
    final CountDownLatch latch = new CountDownLatch(valuesToWaitFor);
    Observable<String> map = oo.lift(new MonitorOperator<>("worker_stage_outer")).map(observable -> observable.groupBy(e -> System.nanoTime() % nThreads).flatMap(go -> go.observeOn(mantisRxSingleThreadSchedulers[go.getKey().intValue()]).doOnNext(x -> {
        logger.info("processing {} on thread {}", x, Thread.currentThread().getName());
        latch.countDown();
    }))).flatMap(x -> x);
    Subscription subscription = map.subscribe();
    assertTrue(latch.await(5, TimeUnit.SECONDS));
    for (int i = 0; i < nThreads; i++) {
        assertFalse(mantisRxSingleThreadSchedulers[i].createWorker().isUnsubscribed());
    }
    subscription.unsubscribe();
}
Also used : TimeUnit(java.util.concurrent.TimeUnit) CountDownLatch(java.util.concurrent.CountDownLatch) Logger(org.slf4j.Logger) Assert.assertFalse(org.junit.Assert.assertFalse) RxThreadFactory(rx.internal.util.RxThreadFactory) LoggerFactory(org.slf4j.LoggerFactory) Assert.assertTrue(org.junit.Assert.assertTrue) MonitorOperator(io.mantisrx.common.metrics.rx.MonitorOperator) Test(org.junit.Test) Subscription(rx.Subscription) Observable(rx.Observable) RxThreadFactory(rx.internal.util.RxThreadFactory) CountDownLatch(java.util.concurrent.CountDownLatch) Subscription(rx.Subscription) Observable(rx.Observable) Test(org.junit.Test)

Example 2 with RxThreadFactory

use of rx.internal.util.RxThreadFactory in project mantis by Netflix.

the class StageExecutors method executeMantisGroupsInParallel.

/**
 * @param go
 * @param computation
 *
 * @return untyped to support multiple callers return types
 */
@SuppressWarnings("unchecked")
private static <K, T, R> Observable<Observable<R>> executeMantisGroupsInParallel(Observable<Observable<MantisGroup<K, T>>> go, Computation computation, final Context context, final boolean applyTimeoutToInners, final long timeout, final int concurrency) {
    logger.info("initializing {}", computation.getClass().getCanonicalName());
    computation.init(context);
    // from groups to observable
    final Func2<Context, Observable<MantisGroup<K, T>>, Observable<R>> c = (Func2<Context, Observable<MantisGroup<K, T>>, Observable<R>>) computation;
    if (concurrency == StageConfig.DEFAULT_STAGE_CONCURRENCY) {
        return go.lift(new MonitorOperator<>("worker_stage_outer")).map(observable -> c.call(context, observable.observeOn(Schedulers.computation()).lift(new MonitorOperator<>("worker_stage_inner_input"))).lift(new MonitorOperator<>("worker_stage_inner_output")));
    } else {
        final MantisRxSingleThreadScheduler[] mantisRxSingleThreadSchedulers = new MantisRxSingleThreadScheduler[concurrency];
        RxThreadFactory rxThreadFactory = new RxThreadFactory("MantisRxSingleThreadScheduler-");
        logger.info("creating {} Mantis threads", concurrency);
        for (int i = 0; i < concurrency; i++) {
            mantisRxSingleThreadSchedulers[i] = new MantisRxSingleThreadScheduler(rxThreadFactory);
        }
        return go.lift(new MonitorOperator<>("worker_stage_outer")).map(observable -> observable.groupBy(e -> Math.abs(e.getKeyValue().hashCode()) % concurrency).flatMap(gbo -> c.call(context, gbo.observeOn(mantisRxSingleThreadSchedulers[gbo.getKey().intValue()]).lift(new MonitorOperator<MantisGroup<K, T>>("worker_stage_inner_input"))).lift(new MonitorOperator<R>("worker_stage_inner_output"))));
    }
}
Also used : Context(io.mantisrx.runtime.Context) Index(io.mantisrx.runtime.source.Index) StageConfig(io.mantisrx.runtime.StageConfig) MantisRxSingleThreadScheduler(io.mantisrx.runtime.scheduler.MantisRxSingleThreadScheduler) MetricsRegistry(io.mantisrx.common.metrics.MetricsRegistry) LoggerFactory(org.slf4j.LoggerFactory) Action1(rx.functions.Action1) Observable(rx.Observable) Computation(io.mantisrx.runtime.computation.Computation) ServiceRegistry(io.mantisrx.server.core.ServiceRegistry) Func1(rx.functions.Func1) Func2(rx.functions.Func2) GroupToGroup(io.mantisrx.runtime.GroupToGroup) GroupedObservableUtils(io.reactivx.mantis.operators.GroupedObservableUtils) Schedulers(rx.schedulers.Schedulers) GroupToScalar(io.mantisrx.runtime.GroupToScalar) RxMetrics(io.reactivex.mantis.remote.observable.RxMetrics) KeyToScalar(io.mantisrx.runtime.KeyToScalar) Metrics(io.mantisrx.common.metrics.Metrics) Counter(io.mantisrx.common.metrics.Counter) Groups(io.mantisrx.runtime.Groups) Logger(org.slf4j.Logger) RxThreadFactory(rx.internal.util.RxThreadFactory) ScalarToKey(io.mantisrx.runtime.ScalarToKey) SourceHolder(io.mantisrx.runtime.SourceHolder) KeyToKey(io.mantisrx.runtime.KeyToKey) Context(io.mantisrx.runtime.Context) STAGE_CONCURRENCY(io.mantisrx.runtime.parameter.ParameterUtils.STAGE_CONCURRENCY) TimeUnit(java.util.concurrent.TimeUnit) GroupedObservable(rx.observables.GroupedObservable) ScalarToScalar(io.mantisrx.runtime.ScalarToScalar) Action0(rx.functions.Action0) ScalarToGroup(io.mantisrx.runtime.ScalarToGroup) SinkHolder(io.mantisrx.runtime.SinkHolder) MantisMarker(io.mantisrx.runtime.markers.MantisMarker) MantisGroup(io.mantisrx.common.MantisGroup) MonitorOperator(io.mantisrx.common.metrics.rx.MonitorOperator) MantisRxSingleThreadScheduler(io.mantisrx.runtime.scheduler.MantisRxSingleThreadScheduler) MantisGroup(io.mantisrx.common.MantisGroup) Observable(rx.Observable) GroupedObservable(rx.observables.GroupedObservable) MonitorOperator(io.mantisrx.common.metrics.rx.MonitorOperator) RxThreadFactory(rx.internal.util.RxThreadFactory) Func2(rx.functions.Func2)

Example 3 with RxThreadFactory

use of rx.internal.util.RxThreadFactory in project mantis by Netflix.

the class StageExecutors method executeInnersInParallel.

/**
 * @param oo
 * @param computation
 *
 * @return untyped to support multiple callers return types
 */
@SuppressWarnings("unchecked")
private static <T, R> Observable<Observable<R>> executeInnersInParallel(Observable<Observable<T>> oo, Computation computation, final Context context, final boolean applyTimeoutToInners, final long timeout, final int concurrency) {
    logger.info("initializing {}", computation.getClass().getCanonicalName());
    computation.init(context);
    // from groups to observable
    final Func2<Context, Observable<T>, Observable<R>> c = (Func2<Context, Observable<T>, Observable<R>>) computation;
    if (concurrency == StageConfig.DEFAULT_STAGE_CONCURRENCY) {
        return oo.lift(new MonitorOperator<>("worker_stage_outer")).map(observable -> c.call(context, observable.observeOn(Schedulers.computation()).lift(new MonitorOperator<T>("worker_stage_inner_input"))).lift(new MonitorOperator<R>("worker_stage_inner_output")));
    } else {
        final MantisRxSingleThreadScheduler[] mantisRxSingleThreadSchedulers = new MantisRxSingleThreadScheduler[concurrency];
        RxThreadFactory rxThreadFactory = new RxThreadFactory("MantisRxSingleThreadScheduler-");
        logger.info("creating {} Mantis threads", concurrency);
        for (int i = 0; i < concurrency; i++) {
            mantisRxSingleThreadSchedulers[i] = new MantisRxSingleThreadScheduler(rxThreadFactory);
        }
        return oo.lift(new MonitorOperator<>("worker_stage_outer")).map(observable -> observable.groupBy(e -> System.nanoTime() % concurrency).flatMap(go -> c.call(context, go.observeOn(mantisRxSingleThreadSchedulers[go.getKey().intValue()]).lift(new MonitorOperator<>("worker_stage_inner_input"))).lift(new MonitorOperator<>("worker_stage_inner_output"))));
    }
}
Also used : Context(io.mantisrx.runtime.Context) Index(io.mantisrx.runtime.source.Index) StageConfig(io.mantisrx.runtime.StageConfig) MantisRxSingleThreadScheduler(io.mantisrx.runtime.scheduler.MantisRxSingleThreadScheduler) MetricsRegistry(io.mantisrx.common.metrics.MetricsRegistry) LoggerFactory(org.slf4j.LoggerFactory) Action1(rx.functions.Action1) Observable(rx.Observable) Computation(io.mantisrx.runtime.computation.Computation) ServiceRegistry(io.mantisrx.server.core.ServiceRegistry) Func1(rx.functions.Func1) Func2(rx.functions.Func2) GroupToGroup(io.mantisrx.runtime.GroupToGroup) GroupedObservableUtils(io.reactivx.mantis.operators.GroupedObservableUtils) Schedulers(rx.schedulers.Schedulers) GroupToScalar(io.mantisrx.runtime.GroupToScalar) RxMetrics(io.reactivex.mantis.remote.observable.RxMetrics) KeyToScalar(io.mantisrx.runtime.KeyToScalar) Metrics(io.mantisrx.common.metrics.Metrics) Counter(io.mantisrx.common.metrics.Counter) Groups(io.mantisrx.runtime.Groups) Logger(org.slf4j.Logger) RxThreadFactory(rx.internal.util.RxThreadFactory) ScalarToKey(io.mantisrx.runtime.ScalarToKey) SourceHolder(io.mantisrx.runtime.SourceHolder) KeyToKey(io.mantisrx.runtime.KeyToKey) Context(io.mantisrx.runtime.Context) STAGE_CONCURRENCY(io.mantisrx.runtime.parameter.ParameterUtils.STAGE_CONCURRENCY) TimeUnit(java.util.concurrent.TimeUnit) GroupedObservable(rx.observables.GroupedObservable) ScalarToScalar(io.mantisrx.runtime.ScalarToScalar) Action0(rx.functions.Action0) ScalarToGroup(io.mantisrx.runtime.ScalarToGroup) SinkHolder(io.mantisrx.runtime.SinkHolder) MantisMarker(io.mantisrx.runtime.markers.MantisMarker) MantisGroup(io.mantisrx.common.MantisGroup) MonitorOperator(io.mantisrx.common.metrics.rx.MonitorOperator) MantisRxSingleThreadScheduler(io.mantisrx.runtime.scheduler.MantisRxSingleThreadScheduler) Observable(rx.Observable) GroupedObservable(rx.observables.GroupedObservable) MonitorOperator(io.mantisrx.common.metrics.rx.MonitorOperator) RxThreadFactory(rx.internal.util.RxThreadFactory) Func2(rx.functions.Func2)

Aggregations

MonitorOperator (io.mantisrx.common.metrics.rx.MonitorOperator)3 TimeUnit (java.util.concurrent.TimeUnit)3 Logger (org.slf4j.Logger)3 LoggerFactory (org.slf4j.LoggerFactory)3 Observable (rx.Observable)3 RxThreadFactory (rx.internal.util.RxThreadFactory)3 MantisGroup (io.mantisrx.common.MantisGroup)2 Counter (io.mantisrx.common.metrics.Counter)2 Metrics (io.mantisrx.common.metrics.Metrics)2 MetricsRegistry (io.mantisrx.common.metrics.MetricsRegistry)2 Context (io.mantisrx.runtime.Context)2 GroupToGroup (io.mantisrx.runtime.GroupToGroup)2 GroupToScalar (io.mantisrx.runtime.GroupToScalar)2 Groups (io.mantisrx.runtime.Groups)2 KeyToKey (io.mantisrx.runtime.KeyToKey)2 KeyToScalar (io.mantisrx.runtime.KeyToScalar)2 ScalarToGroup (io.mantisrx.runtime.ScalarToGroup)2 ScalarToKey (io.mantisrx.runtime.ScalarToKey)2 ScalarToScalar (io.mantisrx.runtime.ScalarToScalar)2 SinkHolder (io.mantisrx.runtime.SinkHolder)2