use of actor4j.core.messages.ActorMessage in project actor4j-core by relvaner.
the class ActorStrategyOnFailure method oneForAll_directive_stop.
protected void oneForAll_directive_stop(ActorCell cell) {
if (!cell.isRoot()) {
ActorCell parent = system.cells.get(cell.parent);
if (parent != null) {
Iterator<UUID> iterator = parent.children.iterator();
while (iterator.hasNext()) {
UUID dest = iterator.next();
if (!dest.equals(cell.id))
system.sendAsDirective(new ActorMessage<>(null, INTERNAL_STOP, parent.id, dest));
}
cell.stop();
}
} else
cell.stop();
}
use of actor4j.core.messages.ActorMessage in project actor4j-core by relvaner.
the class ActorStrategyOnFailure method oneForAll_directive_restart.
protected void oneForAll_directive_restart(ActorCell cell, Exception reason) {
if (!cell.isRoot()) {
ActorCell parent = system.cells.get(cell.parent);
if (parent != null) {
Iterator<UUID> iterator = parent.children.iterator();
while (iterator.hasNext()) {
UUID dest = iterator.next();
if (!dest.equals(cell.id))
system.sendAsDirective(new ActorMessage<>(reason, INTERNAL_RESTART, parent.id, dest));
}
cell.preRestart(reason);
}
} else
cell.preRestart(reason);
}
use of actor4j.core.messages.ActorMessage in project actor4j-core by relvaner.
the class StatelessActorFeature method test.
@Test(timeout = 10000)
public void test() {
ActorSystem system = new ActorSystem();
system.setParallelismFactor(2);
CountDownLatch testDone = new CountDownLatch(system.getParallelismMin() * system.getParallelismFactor());
ActorGroup group = new ActorGroupSet();
system.setAlias(system.addActor(() -> new StatelessActor(group) {
protected boolean first = true;
@Override
public void receive(ActorMessage<?> message) {
logger().debug(String.format("from thread %s of actor %s%n", Thread.currentThread().getName(), self()));
if (first) {
testDone.countDown();
first = false;
}
}
}, system.getParallelismMin() * system.getParallelismFactor()), "instances");
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
system.sendViaAlias(new ActorMessage<Object>(null, 0, system.SYSTEM_ID, null), "instances");
}
}, 0, 50);
system.start();
try {
testDone.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
system.shutdownWithActors(true);
}
use of actor4j.core.messages.ActorMessage in project actor4j-core by relvaner.
the class PrimarySecondaryActorFeature method test.
@Test(timeout = 2000)
public void test() {
ActorSystem system = new ActorSystem();
CountDownLatch testDone = new CountDownLatch(system.getParallelismMin() * system.getParallelismFactor());
AtomicBoolean primaryReceivedFromSystem = new AtomicBoolean(false);
AtomicInteger secondaryReceived = new AtomicInteger(0);
AtomicBoolean primaryReceived = new AtomicBoolean(false);
ConcurrentActorGroup group = new ConcurrentActorGroup();
UUID primary = system.addActor(() -> new PrimaryActor("primary", group, "instances", (id) -> () -> new SecondaryActor(group, id) {
@Override
public void receive(ActorMessage<?> message) {
if (message.source == primary) {
secondaryReceived.incrementAndGet();
testDone.countDown();
} else if (message.source == system.SYSTEM_ID)
publish(message);
}
}, system.getParallelismMin() * system.getParallelismFactor() - 1) {
@Override
public void preStart() {
super.preStart();
group.addAll(hub.getPorts());
}
@Override
public void receive(ActorMessage<?> message) {
if (message.source == system.SYSTEM_ID) {
primaryReceivedFromSystem.set(true);
publish(message);
} else if (message.tag == 101) {
primaryReceived.set(true);
testDone.countDown();
}
}
});
system.start();
system.send(new ActorMessage<>(null, 0, system.SYSTEM_ID, primary));
system.send(new ActorMessage<>(null, 101, system.SYSTEM_ID, group.peek()));
try {
testDone.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
assertTrue(primaryReceivedFromSystem.get());
assertEquals(3, secondaryReceived.get());
assertTrue(primaryReceived.get());
system.shutdownWithActors(true);
}
use of actor4j.core.messages.ActorMessage in project actor4j-core by relvaner.
the class PersistenceFeature method test.
@Test(timeout = 10000)
public void test() {
CountDownLatch testDone = new CountDownLatch(2);
ActorSystem system = new ActorSystem();
AtomicBoolean first = new AtomicBoolean(true);
UUID id = system.addActor(() -> new PersistentActor<MyState, MyEvent>("example") {
@Override
public void receive(ActorMessage<?> message) {
MyEvent event1 = new MyEvent("I am the first event!");
MyEvent event2 = new MyEvent("I am the second event!");
saveSnapshot(null, null, new MyState("I am a state!"));
persist((s) -> logger().debug(String.format("Event: %s", s)), (e) -> logger().error(String.format("Error: %s", e.getMessage())), event1, event2);
if (first.getAndSet(false))
tell(null, Actor.RESTART, self());
}
@Override
public void recover(String json) {
if (!Recovery.isError(json)) {
logger().debug(String.format("Recovery: %s", json));
Recovery<MyState, MyEvent> obj = Recovery.convertValue(json, new TypeReference<Recovery<MyState, MyEvent>>() {
});
logger().debug(String.format("Recovery: %s", obj.toString()));
if (first.get())
assertEquals("{\"state\":{}}", json);
else {
assertEquals("I am a state!", obj.state.title);
assertTrue(obj.events.size() == 2);
assertEquals("I am the first event!", obj.events.get(0).title);
assertEquals("I am the second event!", obj.events.get(1).title);
}
testDone.countDown();
} else
logger().error(String.format("Error: %s", Recovery.getErrorMsg(json)));
}
@Override
public UUID persistenceId() {
/* e.g. https://www.uuidgenerator.net/ */
return UUID.fromString("60f086af-27d3-44e9-8fd7-eb095c98daed");
}
});
// Drop database
MongoClient client = new MongoClient("localhost", 27017);
client.dropDatabase("actor4j-test");
client.close();
system.persistenceMode("localhost", 27017, "actor4j-test");
system.start();
system.sendWhenActive(new ActorMessage<Object>(null, 0, system.SYSTEM_ID, id));
try {
testDone.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
system.shutdownWithActors(true);
}
Aggregations