2015-05-06 17 views
5

Ben oluşturmak ve kaynakları olarak 2 aktörler, daha sonra bir birleştirme kavşak ile (Java DSL aylarında) akka akışı akışını çalıştırmak ve çalışıyorum sonra 1 lavabo:Akka akışına kaynak olarak çoklu aktörler nasıl eklenir?

Source<Integer, ActorRef> src1 = Source.actorRef(100, OverflowStrategy.backpressure()); 
    Source<Integer, ActorRef> src2 = Source.actorRef(100, OverflowStrategy.backpressure()); 
    Sink<Integer, BoxedUnit> sink = Flow.of(Integer.class).to(Sink.foreach(System.out::println)); 

    RunnableFlow<BoxedUnit> closed = FlowGraph.factory().closed(sink, (b, out) -> { 
     UniformFanInShape<Integer, Integer> merge = b.graph(Merge.<Integer>create(2)); 
     b.from(src1).via(merge).to(out); 
     b.from(src2).to(merge); 
    }); 

    closed.run(mat); 

sorum nasıl ben ActorRef başvurular edinebilirim edilir Onları mesaj göndermek için kaynak aktörler? 1 oyuncu durumunda, grafik oluşturucu kullanmazdım ve daha sonra .run() veya runWith() yöntemi ActorRef nesnesini döndürürdü. Ancak birçok kaynak aktörün durumunda ne yapmalı? Böyle bir akışı gerçekleştirmek mümkün mü?

+0

:

jrudolph tavsiyesine kullanarak, böyle aktörleri kullanmak başardı (gerçek kodda ben 2 ActorRefs listesi daha güzel bir şey yaptı) maddi değeri "kapalı" değerine getirilir ve daha sonra maddi değerleri birleştiren bir işlev sağlar. Böyle bir şey: 'kapalı (src1, src2, (actorRef1, actorRef2) -> SomethingContainingBothActorRefs, (b, s1, s2) -> ...)' – jrudolph

+0

Teşekkürler, jrudolph. – dev4ever44

cevap

6

Kişinin buna ihtiyacı olduğunda kendi sorumu yanıtlama. Sen erişmeniz gereken hangi unsurları geçmeleri gerekiyor

Source<Integer, ActorRef> src1 = Source.actorRef(100, OverflowStrategy.fail()); 
    Source<Integer, ActorRef> src2 = Source.actorRef(100, OverflowStrategy.fail()); 
    Sink<Integer, BoxedUnit> sink = Flow.of(Integer.class).to(Sink.foreach(System.out::println)); 

    RunnableFlow<List<ActorRef>> closed = FlowGraph.factory().closed(src1, src2, (a1, a2) -> Arrays.asList(a1, a2), (b, s1, s2) -> { 
     UniformFanInShape<Integer, Integer> merge = b.graph(Merge.<Integer>create(2)); 
     b.from(s1).via(merge).to(sink); 
     b.from(s2).to(merge); 
    }); 

    List<ActorRef> stream = closed.run(mat); 
    ActorRef a1 = stream.get(0); 
    ActorRef a2 = stream.get(1); 
İlgili konular