Java Akka将消息分组到池中

Java Akka将消息分组到池中,java,java-8,akka,Java,Java 8,Akka,我试图理解AKKA 2.10,特别是Java(没有Scala)。我知道并发模式等在Scala中更具表现力,但我希望我的示例能够在Java中工作 特别是我有几个演员产生信息。“面包商”生产面包,“面包商”生产面包,“沙拉商”生产沙拉。我现在有一个汉堡包,它接收“信息”,即培根、面包圈、沙拉。我想把2条面包圈信息、1条培根信息和10条沙拉信息合并成一个汉堡。作为参与者,如何在Akka Java中最好地实现这一点 public class Burger extends UntypedActor {

我试图理解AKKA 2.10,特别是Java(没有Scala)。我知道并发模式等在Scala中更具表现力,但我希望我的示例能够在Java中工作

特别是我有几个演员产生信息。“面包商”生产面包,“面包商”生产面包,“沙拉商”生产沙拉。我现在有一个汉堡包,它接收“信息”,即培根、面包圈、沙拉。我想把2条面包圈信息、1条培根信息和10条沙拉信息合并成一个汉堡。作为参与者,如何在Akka Java中最好地实现这一点

public class Burger extends UntypedActor {

    private final LoggingAdapter LOG = Logging.getLogger(context().system(), this);

    @Override
    public void onReceive(Object message) throws Exception {
        if(message instanceof Bacon){
            LOG.info("Received Bacon");
            //Possibly add to a queue?
        }
        else if(message instanceof BreadRoll){
            LOG.info("Received BreadRoll");
            //Possibly add to a queue?
        }
        else if(message instanceof Salad){
            LOG.info("Received Salad");
            //Possibly add to a queue?
        }

    }
}

典型的Java开发人员心态是将它们添加到一个队列中,然后运行另一个任务,拾取2个面包卷、1个汉堡和10个沙拉,制作一个汉堡,然后将它们放在另一个参与者的面前。然而,这意味着我控制了并发性,但我假设这不是akka的重点?阿克卡在这里如何帮助我?我正在阅读FSM actors等概念,但现在我很清楚如何应用这些概念,因此一些示例代码答案将非常有用。

我将声明一些包含所需数量的变量;然后,当消息到达时,我会增加它们,然后我会检查我是否能做一个汉堡。当条件满足时,记住减去所需的值,这样即使配料以随机顺序到达,参与者也可以正常工作:

public class Burger extends UntypedActor {

    private static int NEEDED_SALAD = 10;
    private static int NEEDED_BREAD = 2;
    private static int NEEDED_BACON = 1;

    private final LoggingAdapter LOG = Logging.getLogger(context().system(), this);
    private int bread, bacon, salad; 

    @Override
    public void onReceive(Object message) throws Exception {
        if(message instanceof Bacon){
            bacon ++;
        }
        else if(message instanceof BreadRoll){
            bread ++;
        }
        else if(message instanceof Salad){
            salad ++;
        }

        if (salad >= NEEDED_SALAD && bread >= NEEDED_BREAD && bacon >= NEEDED_BACON) {
            salad -= NEEDED_SALAD;
            bread -= NEEDED_BREAD;
            bacon -= NEEDED_BACON;

            // and sends message to (or spawns) another actor
        }
    }
}

Burger消息包含培根、面包圈、沙拉等其他对象的实例,所以我需要保留三个列表。我不确定这对记忆的影响。如果我一直收到数以百万计的培根实例(但没有足够的面包卷),那么我大概是在用掉那么多内存吧?更好的策略是在另一个参与者/线程中准备一个汉堡,而主接收方可能在一个有界缓冲区类型的实体中积累这些对象?是的,如果它接收到数百万条Bacon消息,并且您需要存储所有消息,那么在将消息添加到列表时,它迟早会抛出OutOfMemory异常。如果您不关心丢失消息,那么有界缓冲区可能是一个解决方案;否则,您可以设置一个集群,其大小与预期的消息量相对应,这样参与者的每个实例将只接收总消息的一小部分。@CalmStorm如果您需要保留对所有培根的引用,即使您可能永远不会得到面包卷,再多的线索或任何诡计也救不了你。这与Akka无关,甚至与编程语言无关,这是计算的一个简单事实。