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