Search in sources :

Example 16 with ReactorGraphBuilder

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

the class CompletableReactorTest method dead_transition_kills_merge_point_and_all_outgoing_transitions.

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

        final ReactorGraphBuilder builder = new ReactorGraphBuilder(this);

        Processor<IdListPayload> idProcessor0 = builder.processor().forPayload(IdListPayload.class).withHandler(new IdProcessor(0)::handle).withMerger((pld, id) -> {
            pld.getIdSequence().add(id);
            return DeadTransitionPayload.Status.FIRST;
        }).buildProcessor();

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

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

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

        Processor<IdListPayload> idProcessor4 = builder.processor().forPayload(IdListPayload.class).withHandler(new IdProcessor(4)::handle).withMerger((pld, id) -> {
            try {
                pld.getIdSequence().add(id);
                processor4mergerSemaphore.acquire();
                return Status.OK;
            } catch (Exception exc) {
                throw new RuntimeException(exc);
            }
        }).buildProcessor();

        ReactorGraph<DeadTransitionPayload> buildGraph() {
            return builder.payload(DeadTransitionPayload.class).handle(idProcessor0).handle(idProcessor1).handle(idProcessor2).mergePoint(idProcessor0).on(DeadTransitionPayload.Status.FIRST).handle(idProcessor4).on(DeadTransitionPayload.Status.SECOND).merge(idProcessor1).mergePoint(idProcessor1).onAny().merge(idProcessor2).mergePoint(idProcessor2).onAny().handle(idProcessor3).mergePoint(idProcessor3).onAny().complete().mergePoint(idProcessor4).onAny().complete().coordinates().start(461, 96).proc(idProcessor0, 366, 177).proc(idProcessor2, 649, 181).proc(idProcessor1, 502, 178).proc(idProcessor3, 708, 396).proc(idProcessor4, 289, 339).merge(idProcessor0, 407, 250).merge(idProcessor1, 538, 304).merge(idProcessor2, 682, 315).merge(idProcessor3, 755, 477).merge(idProcessor4, 330, 436).complete(idProcessor3, 820, 514).complete(idProcessor4, 396, 475).buildGraph();
        }
    }
    val graph = new Config().buildGraph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    val resultFuture = reactor.submit(new DeadTransitionPayload()).getResultFuture();
    try {
        log.info("wait for 2 seconds to test if graph executes merge points number 2 or 3");
        val result = resultFuture.get(2, TimeUnit.SECONDS);
        fail("Failed to wait graph execution. " + result);
    } catch (TimeoutException exc) {
    // ignore timeout exception
    }
    processor4mergerSemaphore.release();
    val result = resultFuture.get(5, TimeUnit.MINUTES);
    assertEquals(Arrays.asList(0, 4), 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) TimeoutException(java.util.concurrent.TimeoutException) TimeoutException(java.util.concurrent.TimeoutException) Test(org.junit.Test)

Example 17 with ReactorGraphBuilder

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

the class CompletableReactorTest method use_class_mock_as_processor_with_mockito.

@Test
public void use_class_mock_as_processor_with_mockito() throws Exception {
    IdProcessor processor = Mockito.mock(IdProcessor.class);
    Mockito.when(processor.handle()).thenReturn(CompletableFuture.completedFuture(78));
    class Config {

        ReactorGraphBuilder graphBuilder = new ReactorGraphBuilder(this);

        Processor<SingleInterfaceProcessorPayload> idProcessor1 = graphBuilder.processor().forPayload(SingleInterfaceProcessorPayload.class).withHandler(processor::handle).withMerger((pld, id) -> {
            pld.getIdSequence().add(id);
            return Status.OK;
        }).buildProcessor();

        ReactorGraph<SingleInterfaceProcessorPayload> graph() {
            return graphBuilder.payload(SingleInterfaceProcessorPayload.class).handle(idProcessor1).mergePoint(idProcessor1).onAny().complete().coordinates().proc(idProcessor1, 450, 184).merge(idProcessor1, 522, 299).start(500, 100).complete(idProcessor1, 498, 398).buildGraph();
        }
    }
    val graph = new Config().graph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    SingleInterfaceProcessorPayload resultPayload = reactor.submit(new SingleInterfaceProcessorPayload()).getResultFuture().get(10, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(78), resultPayload.getIdSequence());
}
Also used : lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) Test(org.junit.Test)

Example 18 with ReactorGraphBuilder

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

the class CompletableReactorTest method parallel_processors_with_one_dead_branch_way.

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

        ReactorGraphBuilder graphBuilder = new ReactorGraphBuilder(this);

        Processor<DeadBranchPayload> idProcessor0 = graphBuilder.processor().forPayload(DeadBranchPayload.class).withHandler(new IdProcessor(0)::handle).withMerger((pld, id) -> {
            pld.getIdSequence().add(id);
            pld.setThreeStateStatus(ThreeStateStatus.A);
            return ThreeStateStatus.A;
        }).buildProcessor();

        Processor<DeadBranchPayload> idProcessor1 = graphBuilder.processor().forPayload(DeadBranchPayload.class).withHandler(new IdProcessor(1)::handle).withMerger((pld, id) -> {
            pld.getIdSequence().add(id);
            return pld.getThreeStateStatus();
        }).buildProcessor();

        Processor<DeadBranchPayload> idProcessor2 = graphBuilder.processor().forPayload(DeadBranchPayload.class).withHandler(new IdProcessor(2)::handle).withMerger((pld, id) -> {
            pld.getIdSequence().add(id);
            return Status.OK;
        }).buildProcessor();

        ReactorGraph<DeadBranchPayload> graph() {
            return graphBuilder.payload(DeadBranchPayload.class).handle(idProcessor0).mergePoint(idProcessor0).on(ThreeStateStatus.A).handle(idProcessor1).on(ThreeStateStatus.B).handle(idProcessor2).on(ThreeStateStatus.AB).handle(idProcessor1).on(ThreeStateStatus.AB).handle(idProcessor2).mergePoint(idProcessor1).on(ThreeStateStatus.A).complete().on(ThreeStateStatus.AB, ThreeStateStatus.B).merge(idProcessor2).mergePoint(idProcessor2).onAny().complete().coordinates().start(500, 100).proc(idProcessor0, 420, 210).proc(idProcessor1, 600, 420).proc(idProcessor2, 260, 420).merge(idProcessor0, 500, 320).merge(idProcessor1, 560, 510).merge(idProcessor2, 450, 540).complete(idProcessor1, 651, 595).complete(idProcessor2, 520, 660).buildGraph();
        }
    }
    val graph = new Config().graph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    CompletableReactor.Execution<DeadBranchPayload> result = reactor.submit(new DeadBranchPayload());
    DeadBranchPayload resultPayload = result.getResultFuture().get(10, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(0, 1), 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) Test(org.junit.Test)

Example 19 with ReactorGraphBuilder

use of ru.fix.completable.reactor.runtime.ReactorGraphBuilder 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 20 with ReactorGraphBuilder

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

the class CompletableReactorTest method single_processor.

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

        final ReactorGraphBuilder builder = new ReactorGraphBuilder(this);

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

        ReactorGraph buildGraph() {
            return builder.payload(SingleProcessorPayload.class).handle(idProcessor1).mergePoint(idProcessor1).onAny().complete().coordinates().start(226, 98).proc(idProcessor1, 261, 163).merge(idProcessor1, 300, 251).complete(idProcessor1, 308, 336).buildGraph();
        }
    }
    ;
    val graph = new Config().buildGraph();
    printGraph(graph);
    reactor.registerReactorGraph(graph);
    SingleProcessorPayload resultPayload = reactor.submit(new SingleProcessorPayload()).getResultFuture().get(10, TimeUnit.SECONDS);
    assertEquals(Arrays.asList(1), resultPayload.getIdSequence());
}
Also used : lombok.val(lombok.val) ReactorGraphBuilder(ru.fix.completable.reactor.runtime.ReactorGraphBuilder) Processor(ru.fix.completable.reactor.runtime.dsl.Processor) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)24 ReactorGraphBuilder (ru.fix.completable.reactor.runtime.ReactorGraphBuilder)24 lombok.val (lombok.val)23 Processor (ru.fix.completable.reactor.runtime.dsl.Processor)23 CompletableReactor (ru.fix.completable.reactor.runtime.CompletableReactor)13 Data (lombok.Data)10 Reactored (ru.fix.completable.reactor.api.Reactored)10 CompletableFuture (java.util.concurrent.CompletableFuture)8 TimeUnit (java.util.concurrent.TimeUnit)8 Before (org.junit.Before)8 SimpleProfiler (ru.fix.commons.profiler.impl.SimpleProfiler)8 ReactorGraph (ru.fix.completable.reactor.runtime.ReactorGraph)8 Assert.assertEquals (org.junit.Assert.assertEquals)7 MergePoint (ru.fix.completable.reactor.runtime.dsl.MergePoint)7 BigInteger (java.math.BigInteger)6 Semaphore (java.util.concurrent.Semaphore)3 TimeoutException (java.util.concurrent.TimeoutException)3 Accessors (lombok.experimental.Accessors)2 lombok.experimental.var (lombok.experimental.var)2 Subgraph (ru.fix.completable.reactor.runtime.dsl.Subgraph)2