Search in sources :

Example 1 with MergePoint

use of ru.fix.completable.reactor.runtime.dsl.MergePoint in project completable-reactor by ru-fix.

the class CompletableReactorTest method graph_with_detached_merge_point_connected_to_start_point.

@Test
public void graph_with_detached_merge_point_connected_to_start_point() throws Exception {
    Semaphore mergePoint2Semaphore = new Semaphore(0);
    class Config {

        final ReactorGraphBuilder builder = new ReactorGraphBuilder(this);

        Processor<IdListPayload> idProcessor0 = buildProcessor(builder, new IdProcessor(0));

        Processor<IdListPayload> idProcessor1 = buildProcessor(builder, new IdProcessor(1));

        MergePoint<StartPointMergeGroupPayload> mergePoint2 = builder.mergePoint().forPayload(CompletableReactorTest.StartPointMergeGroupPayload.class).withMerger("mergePoint-2", pld -> {
            try {
                mergePoint2Semaphore.acquire();
            } catch (Exception exc) {
                log.error("Failed to acquire semaphore", exc);
            }
            pld.getIdSequence().add(2);
            return CompletableReactorTest.Status.OK;
        }).buildMergePoint();

        Processor<IdListPayload> idProcessor3 = buildProcessor(builder, new IdProcessor(3));

        ReactorGraph<StartPointMergeGroupPayload> buildGraph() {
            return builder.payload(CompletableReactorTest.StartPointMergeGroupPayload.class).handle(idProcessor0).handle(idProcessor1).merge(mergePoint2).mergePoint(idProcessor0).onAny().merge(idProcessor1).mergePoint(idProcessor1).onAny().merge(idProcessor3).mergePoint(mergePoint2).onAny().handle(idProcessor3).onAny().merge(idProcessor0).mergePoint(idProcessor3).onAny().complete().coordinates().start(476, 88).proc(idProcessor0, 339, 224).proc(idProcessor1, 537, 218).proc(idProcessor3, 747, 247).merge(idProcessor0, 382, 314).merge(idProcessor1, 580, 346).merge(idProcessor3, 809, 403).merge(mergePoint2, 739, 140).complete(idProcessor3, 914, 512).buildGraph();
        }
    }
    val graph = new Config().buildGraph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    val resultFuture = reactor.submit(new StartPointMergeGroupPayload()).getResultFuture();
    try {
        resultFuture.get(1, TimeUnit.SECONDS);
        fail("Failed to wait for mergePoint2");
    } catch (TimeoutException exc) {
    // ignore timeout exception
    }
    mergePoint2Semaphore.release();
    val result = resultFuture.get(5, TimeUnit.MINUTES);
    assertEquals(Arrays.asList(2, 0, 1, 3), result.getIdSequence());
}
Also used : lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) Semaphore(java.util.concurrent.Semaphore) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) TimeoutException(java.util.concurrent.TimeoutException) TimeoutException(java.util.concurrent.TimeoutException) Test(org.junit.Test)

Example 2 with MergePoint

use of ru.fix.completable.reactor.runtime.dsl.MergePoint in project completable-reactor by ru-fix.

the class CompletableReactorTest method detached_merge_point_from_start_point.

@Test
public void detached_merge_point_from_start_point() throws Exception {
    final int MERGE_POINT_ID = 42;
    class Config {

        ReactorGraphBuilder graphBuilder = new ReactorGraphBuilder(this);

        Processor<IdListPayload> idProcessor0 = buildProcessor(graphBuilder, new IdProcessor(0));

        Processor<IdListPayload> idProcessor1 = buildProcessor(graphBuilder, new IdProcessor(1));

        MergePoint<DetachedMergePointFromStartPointPayload> mergePoint = graphBuilder.mergePoint().forPayload(DetachedMergePointFromStartPointPayload.class).withMerger("mergePointTitle", new String[] { "merge point documentation", "here" }, pld -> {
            pld.getIdSequence().add(MERGE_POINT_ID);
            return Status.OK;
        }).buildMergePoint();

        ReactorGraph<DetachedMergePointFromStartPointPayload> graph() {
            return graphBuilder.payload(DetachedMergePointFromStartPointPayload.class).handle(idProcessor0).handle(idProcessor1).merge(mergePoint).mergePoint(mergePoint).onAny().merge(idProcessor1).mergePoint(idProcessor1).onAny().merge(idProcessor0).mergePoint(idProcessor0).onAny().complete().coordinates().start(107, 9).proc(idProcessor0, 22, 78).proc(idProcessor1, 211, 79).merge(idProcessor0, 126, 215).merge(idProcessor1, 267, 187).merge(mergePoint, 424, 160).complete(idProcessor0, 57, 274).buildGraph();
        }
    }
    val graph = new Config().graph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    CompletableReactor.Execution<DetachedMergePointFromStartPointPayload> result = reactor.submit(new DetachedMergePointFromStartPointPayload());
    DetachedMergePointFromStartPointPayload resultPayload = result.getResultFuture().get(10, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(42, 1, 0), resultPayload.getIdSequence());
}
Also used : lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) CompletableReactor(ru.fix.completable.reactor.runtime.CompletableReactor) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) Test(org.junit.Test)

Example 3 with MergePoint

use of ru.fix.completable.reactor.runtime.dsl.MergePoint in project completable-reactor by ru-fix.

the class CompletableReactorTest method detached_merge_point_from_processors_merge_point.

@Test
public void detached_merge_point_from_processors_merge_point() throws Exception {
    final int MERGE_POINT_ID = 42;
    class Config {

        ReactorGraphBuilder graphBuilder = new ReactorGraphBuilder(this);

        Processor<IdListPayload> idProcessor0 = buildProcessor(graphBuilder, new IdProcessor(0));

        Processor<IdListPayload> idProcessor1 = buildProcessor(graphBuilder, new IdProcessor(1));

        MergePoint<DetachedMergePointFromProcessorsMergePointPayload> mergePoint = graphBuilder.mergePoint().forPayload(DetachedMergePointFromProcessorsMergePointPayload.class).withMerger("addMergePointId", new String[] { "Adds merge point id", "to payload sequence" }, pld -> {
            pld.getIdSequence().add(MERGE_POINT_ID);
            return Status.OK;
        }).buildMergePoint();

        ReactorGraph<DetachedMergePointFromProcessorsMergePointPayload> graph() {
            return graphBuilder.payload(DetachedMergePointFromProcessorsMergePointPayload.class).handle(idProcessor0).handle(idProcessor1).mergePoint(idProcessor0).onAny().merge(idProcessor1).mergePoint(idProcessor1).onAny().merge(mergePoint).mergePoint(mergePoint).onAny().complete().coordinates().start(95, 62).proc(idProcessor0, 164, 131).proc(idProcessor1, 330, 127).merge(idProcessor0, 235, 224).merge(idProcessor1, 357, 241).merge(mergePoint, 461, 289).complete(mergePoint, 406, 369).buildGraph();
        }
    }
    val graph = new Config().graph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    CompletableReactor.Execution<DetachedMergePointFromProcessorsMergePointPayload> result = reactor.submit(new DetachedMergePointFromProcessorsMergePointPayload());
    DetachedMergePointFromProcessorsMergePointPayload resultPayload = result.getResultFuture().get(10, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(0, 1, 42), resultPayload.getIdSequence());
}
Also used : lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) CompletableReactor(ru.fix.completable.reactor.runtime.CompletableReactor) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) Test(org.junit.Test)

Example 4 with MergePoint

use of ru.fix.completable.reactor.runtime.dsl.MergePoint in project completable-reactor by ru-fix.

the class CompletableReactorTest method run_subgraph.

@Test
public void run_subgraph() throws Exception {
    class Config {

        ReactorGraphBuilder builder = new ReactorGraphBuilder(this);

        Processor<IdListPayload> idProcessor11 = buildProcessor(builder, new IdProcessor(11));

        Processor<IdListPayload> idProcessor12 = buildProcessor(builder, new IdProcessor(12));

        Processor<IdListPayload> idProcessor13 = buildProcessor(builder, new IdProcessor(13));

        ReactorGraph<SubgraphPayload> childGraph() {
            return builder.payload(SubgraphPayload.class).handle(idProcessor11).handle(idProcessor12).mergePoint(idProcessor11).onAny().merge(idProcessor12).mergePoint(idProcessor12).onAny().handle(idProcessor13).mergePoint(idProcessor13).onAny().complete().coordinates().proc(idProcessor11, 306, 216).proc(idProcessor12, 612, 218).proc(idProcessor13, 539, 596).merge(idProcessor11, 430, 365).merge(idProcessor12, 620, 421).merge(idProcessor13, 613, 693).start(500, 100).complete(idProcessor13, 587, 776).buildGraph();
        }

        Processor<IdListPayload> idProcessor1 = buildProcessor(builder, new IdProcessor(1));

        Processor<IdListPayload> idProcessor2 = buildProcessor(builder, new IdProcessor(2));

        Processor<IdListPayload> idProcessor3 = buildProcessor(builder, new IdProcessor(3));

        Subgraph<ParentGraphPayload> subgraphProcessor = builder.subgraph(SubgraphPayload.class).forPayload(ParentGraphPayload.class).passArg(payload -> new SubgraphPayload()).withMerger((payload, result) -> {
            payload.getIdSequence().addAll(result.getIdSequence());
            return Status.OK;
        }).buildSubgraph();

        ReactorGraph<ParentGraphPayload> parentGraph() {
            return builder.payload(ParentGraphPayload.class).handle(idProcessor1).mergePoint(idProcessor1).onAny().handle(idProcessor2).onAny().handle(subgraphProcessor).mergePoint(subgraphProcessor).onAny().merge(idProcessor2).mergePoint(idProcessor2).onAny().handle(idProcessor3).mergePoint(idProcessor3).onAny().complete().coordinates().proc(idProcessor1, 406, 228).proc(idProcessor2, 626, 408).proc(idProcessor3, 415, 730).proc(subgraphProcessor, 195, 418).merge(idProcessor1, 475, 342).merge(subgraphProcessor, 341, 565).merge(idProcessor2, 488, 620).merge(idProcessor3, 490, 840).start(460, 120).complete(idProcessor3, 460, 930).buildGraph();
        }
    }
    Config config = new Config();
    val childGraph = config.childGraph();
    val parentGraph = config.parentGraph();
    reactor.registerReactorGraph(childGraph);
    printGraph(childGraph, parentGraph);
    reactor.registerReactorGraph(parentGraph);
    ParentGraphPayload resultPaylaod = reactor.submit(new ParentGraphPayload()).getResultFuture().get(5, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(1, 11, 12, 13, 2, 3), resultPaylaod.getIdSequence());
}
Also used : Reactored(ru.fix.completable.reactor.api.Reactored) Arrays(java.util.Arrays) Accessors(lombok.experimental.Accessors) TimeoutException(java.util.concurrent.TimeoutException) CompletableFuture(java.util.concurrent.CompletableFuture) ArrayList(java.util.ArrayList) ReactorGraph(ru.fix.completable.reactor.runtime.ReactorGraph) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) lombok.experimental.var(lombok.experimental.var) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) Before(org.junit.Before) Semaphore(java.util.concurrent.Semaphore) lombok.val(lombok.val) Test(org.junit.Test) EqualsAndHashCode(lombok.EqualsAndHashCode) CompletableReactor(ru.fix.completable.reactor.runtime.CompletableReactor) TimeUnit(java.util.concurrent.TimeUnit) Mockito(org.mockito.Mockito) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) Subgraph(ru.fix.completable.reactor.runtime.dsl.Subgraph) Data(lombok.Data) Assert(org.junit.Assert) SimpleProfiler(ru.fix.commons.profiler.impl.SimpleProfiler) lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) Subgraph(ru.fix.completable.reactor.runtime.dsl.Subgraph) Test(org.junit.Test)

Example 5 with MergePoint

use of ru.fix.completable.reactor.runtime.dsl.MergePoint in project completable-reactor by ru-fix.

the class CompletableReactorTest method single_detached_merge_point.

@Test
public void single_detached_merge_point() throws Exception {
    class Config {

        final ReactorGraphBuilder builder = new ReactorGraphBuilder(this);

        MergePoint<IdListPayload> mergePoint = builder.mergePoint().forPayload(IdListPayload.class).withMerger(pld -> {
            pld.idSequence.add(1);
            return Status.OK;
        }).buildMergePoint();

        ReactorGraph buildGraph() {
            return builder.payload(SingleDetachedMergePointPayload.class).merge(mergePoint).mergePoint(mergePoint).onAny().complete().coordinates().start(500, 100).merge(mergePoint, 615, 179).complete(mergePoint, 615, 263).buildGraph();
        }
    }
    val graph = new Config().buildGraph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    SingleDetachedMergePointPayload resultPayload = reactor.submit(new SingleDetachedMergePointPayload()).getResultFuture().get(10, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(1), resultPayload.getIdSequence());
}
Also used : lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) MergePoint(ru.fix.completable.reactor.runtime.dsl.MergePoint) Test(org.junit.Test)

Aggregations

lombok.val (lombok.val)7 Test (org.junit.Test)7 ReactorGraphBuilder (ru.fix.completable.reactor.runtime.ReactorGraphBuilder)7 MergePoint (ru.fix.completable.reactor.runtime.dsl.MergePoint)7 Processor (ru.fix.completable.reactor.runtime.dsl.Processor)6 CompletableReactor (ru.fix.completable.reactor.runtime.CompletableReactor)4 Semaphore (java.util.concurrent.Semaphore)2 TimeoutException (java.util.concurrent.TimeoutException)2 lombok.experimental.var (lombok.experimental.var)2 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 List (java.util.List)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 TimeUnit (java.util.concurrent.TimeUnit)1 Data (lombok.Data)1 EqualsAndHashCode (lombok.EqualsAndHashCode)1 Accessors (lombok.experimental.Accessors)1 Slf4j (lombok.extern.slf4j.Slf4j)1 Assert (org.junit.Assert)1 Before (org.junit.Before)1