Java 如何处理AKKA中的共享资源

Java 如何处理AKKA中的共享资源,java,akka,Java,Akka,我试图实现Akka,但有一个我无法回答的问题 正如在Akka中一样,没有任何东西是共享的,但是当我在下面的示例中谈到共享资源时,我想了解如何在Akka中处理它 我有一个历史记录表,其中列出了每个客户的触发器列表。如果Triggerd在一天内触发,则不应在同一天为同一客户再次触发另一个触发器 此问题可以应用于共享资源的任何问题,另一个问题是代理密钥生成。要共享的任何内容,请将其放在参与者中。这使得它线程安全,并以可控的方式供每个人访问 Scala示例: object Messages {

我试图实现Akka,但有一个我无法回答的问题

正如在Akka中一样,没有任何东西是共享的,但是当我在下面的示例中谈到共享资源时,我想了解如何在Akka中处理它

我有一个历史记录表,其中列出了每个客户的触发器列表。如果Triggerd在一天内触发,则不应在同一天为同一客户再次触发另一个触发器


此问题可以应用于共享资源的任何问题,另一个问题是代理密钥生成。

要共享的任何内容,请将其放在参与者中。这使得它线程安全,并以可控的方式供每个人访问

Scala示例:

object Messages {

    case class AddCustomer(customerId: Int)
    case class Trigger(customerId: Int)
    case object ResetDay

}

class HistoryTable extends Actor {

    def receive = 
        case Trigger(customerId) => {
            context.child(customerId).get ! Trigger(customerId)
        }
        case AddCustomer(customerId) => {
            context.actorOf(
                Props(new Customer),
                customerId) // Name of child
        }
        case ResetDay => {
            context.children.foreach{
                child => child ! ResetDay
            }
        }
    }

}

class Customer extends Actor {

    var triggered = false

    def receive = 
        case Trigger(customerId) => {
            if (!triggered) {
                trigger()
                triggered = true
            }
        }
        case ResetDay => {
            triggered = false
        }
    }

    def trigger(): Unit = {
        // Do something
    }

}
编辑:添加了java版本:

public class Messages {

    public static class AddCustomer {
        private final int customerId;
        public AddCustomer(int customerId) { this.customerId = customerId; }
        pulic getCustomerId(): int { return customerId; }
    }

    public static class Trigger {
        private final int customerId;
        public Trigger(int customerId) { this.customerId = customerId; }
        pulic getCustomerId(): int { return customerId; }
    }

    public static class ResetDay { }

}

public class HistoryTable extends UntypedActor {

    public void onReceive(Object message) throws Exception { 
        if (message instanceof Trigger) {
            int customerId = ((Trigger) message).customerId;
            getContext().getChild(customerId).tell(
                Trigger(customerId),
                getSelf);
        } else if (message instanceof AddCustomer) {
            int customerId = ((AddCustomer) message).customerId;
            getContext().actorOf(
                Props.create(Customer.class),
                customerId); // Name of child
        } else if (message instanceof ResetDay) {
            for (ActorRef child : getContext().getChildren()) {
                child.tell(ResetDay, getSelf());
            }
        } else {
            unhandled(message);
        }
    }

}

public class Customer extends UntypedActor {

    private boolean triggered = false;

    public void onReceive(Object message) throws Exception { 
        if (message instanceof Trigger) {
            if (!triggered) {
                trigger();
                triggered = true;
            }
        } else if (message instanceof ResetDay) {
            triggered = false;
        } else {
            unhandled(message);
        }
    }

    private void trigger() {
        // Do something
    }

}

提问:由于这段代码将在不同的节点上运行,这如何保证同一个触发器不会再次触发。@阿比吉特,我不明白你所说的“节点”是什么意思。多角色系统?集群?线程?无论如何一旦客户第一次收到触发器,他会将“Trigger”变量设置为true,因此下次收到触发器时,他不会调用“Trigger”方法。您可以添加更多不同的触发器,我只插入了一个作为示例。这取决于调度程序。有一种情况是,同一个参与者生活在不同的dispatchers线程中,并且具有不同的状态。。。