Skip to content
This repository has been archived by the owner on Dec 18, 2022. It is now read-only.

Commit

Permalink
[#130] implement new master actor
Browse files Browse the repository at this point in the history
- modify spawnable interface
- fix master actor test failure
  • Loading branch information
ztkmkoo committed Sep 15, 2020
1 parent 2a31f83 commit 8212374
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 78 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public interface DssExceptionSpawnable extends DssExceptionAcceptable {
/**
* Create DssExceptionActorProperty from DssMasterActorProperty
*/
<E extends DssExceptionActorProperty, M extends DssMasterActorProperty> E createDssExceptionActorProperty(M masterProperty);
<M extends DssMasterActorProperty> DssExceptionActorProperty createDssExceptionActorProperty(M masterProperty);

/**
* spawn exception actor and set it
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public interface DssMasterActor extends DssActor<DssMasterCommand>, DssException
/**
* Get master property
*/
<M extends DssMasterActorProperty> M getDssMasterActorProperty();
DssMasterActorProperty getDssMasterActorProperty();

/**
* Get current master actor status
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public interface DssNetworkSpawnable extends DssNetworkAcceptable {
/**
* Create DssNetworkActorProperty from DssMasterActorProperty
*/
<P extends DssNetworkActorProperty, M extends DssMasterActorProperty> P createDssNetworkActorProperty(M masterProperty);
<M extends DssMasterActorProperty> DssNetworkActorProperty createDssNetworkActorProperty(M masterProperty);

/**
* spawn network actor and set it
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public interface DssResolverSpawnable extends DssResolverAcceptable {
/**
* Create DssResolverActorProperty from DssMasterActorProperty
*/
<P extends DssResolverActorProperty, M extends DssMasterActorProperty> P createDssResolverActorProperty(M masterProperty);
<M extends DssMasterActorProperty> DssResolverActorProperty createDssResolverActorProperty(M masterProperty);

/**
* spawn resolver actor and set it
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public interface DssServiceSpawnable extends DssServiceAcceptable {
/**
* Create DssServiceActorProperty list from DssMasterActorProperty
*/
<P extends DssServiceActorProperty, M extends DssMasterActorProperty> List<P> createDssServiceActorPropertyList(M masterProperty);
<M extends DssMasterActorProperty> List<DssServiceActorProperty> createDssServiceActorPropertyList(M masterProperty);

/**
* Create DssServiceActorResolvable from DssServiceActorProperty and service actor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,33 @@
*/
public class DssCommonActorUtils {

private static final String MSG_BEHAVIOR_CREATOR_NULL = "DssBehaviorCreator is null";
private static final String MSG_PROPERTY_NULL = "DssActorProperty is null";
private static final String MSG_ACTOR_NULL = "AbstractDssActor is null";
private static final String MSG_ACTOR_CONTEXT_NULL = "ActorContext is null";
private static final String MSG_BEHAVIOR_NULL = "Behavior is null";

private DssCommonActorUtils() {}

public static <C extends DssCommand, P extends DssCommand, T extends DssActorProperty> ActorRef<C> spawn(
AbstractDssActor<P> parent,
DssBehaviorCreator<C, T> creator,
T property,
String name) {
return spawn(parent, Objects.requireNonNull(creator).create(Objects.requireNonNull(property)), name);
return spawn(
parent,
Objects
.requireNonNull(creator, MSG_BEHAVIOR_CREATOR_NULL)
.create(Objects.requireNonNull(property, MSG_PROPERTY_NULL)),
name);
}

public static <C extends DssCommand, P extends DssCommand> ActorRef<C> spawn(
AbstractDssActor<P> parent,
Behavior<C> behavior,
String name) {
return Objects
.requireNonNull(Objects.requireNonNull(parent).getContext())
.spawn(Objects.requireNonNull(behavior), name);
.requireNonNull(Objects.requireNonNull(parent, MSG_ACTOR_NULL).getContext(), MSG_ACTOR_CONTEXT_NULL)
.spawn(Objects.requireNonNull(behavior, MSG_BEHAVIOR_NULL), name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,23 @@
import akka.actor.testkit.typed.javadsl.TestProbe;
import akka.actor.typed.ActorRef;
import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.AbstractBehavior;
import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive;
import io.github.ztkmkoo.dss.core.actor.enumeration.DssMasterActorStatus;
import io.github.ztkmkoo.dss.core.actor.property.DssMasterActorProperty;
import io.github.ztkmkoo.dss.core.message.DssCommand;
import io.github.ztkmkoo.dss.core.message.DssMasterCommand;
import io.github.ztkmkoo.dss.core.message.DssNetworkCommand;
import io.github.ztkmkoo.dss.core.message.DssResolverCommand;
import io.github.ztkmkoo.dss.core.actor.property.*;
import io.github.ztkmkoo.dss.core.message.*;
import io.github.ztkmkoo.dss.core.service.DssServiceGenerator;
import lombok.Builder;
import lombok.Getter;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -53,23 +55,13 @@ private static <T extends DssCommand, R extends T> R getProbeResponse(TestProbe
}

@Test
void spawnResolverActor() {
void initializeMasterActor() {
final ActorRef<DssMasterCommand> masterActor = newMasterActorRef();
final TestProbe<DssMasterCommand> probe = testKit.createTestProbe();
masterActor.tell(ResolverActorRefRequest.builder().sender(probe.getRef()).build());
masterActor.tell(new InitializeRequest(probe.getRef()));

final ResolverActorRefResponse response = getProbeResponse(probe, ResolverActorRefResponse.class);
assertNotNull(response.getActorRef());
}

@Test
void spawnNetworkActor() {
final ActorRef<DssMasterCommand> masterActor = newMasterActorRef();
final TestProbe<DssMasterCommand> probe = testKit.createTestProbe();
masterActor.tell(NetworkActorRefRequest.builder().sender(probe.getRef()).build());

final NetworkActorRefResponse response = getProbeResponse(probe, NetworkActorRefResponse.class);
assertNotNull(response.getActorRef());
final InitializeResponse response = getProbeResponse(probe, InitializeResponse.class);
assertNotNull(response);
}

@Test
Expand Down Expand Up @@ -107,21 +99,13 @@ private TestMasterActor(ActorContext<DssMasterCommand> context) {

@Override
public Receive<DssMasterCommand> createReceive() {
return newReceiveBuilder()
.onMessage(ResolverActorRefRequest.class, msg -> {
getLog().info("Receive: {}", msg);
final ActorRef<DssResolverCommand> resolver = spawnResolverActor(this);
msg.getSender().tell(ResolverActorRefResponse.builder().actorRef(resolver).build());
return Behaviors.same();
})
.onMessage(NetworkActorRefRequest.class, msg -> {
getLog().info("Receive: {}", msg);
final ActorRef<DssNetworkCommand> network = spawnNetworkActor(this);
msg.getSender().tell(NetworkActorRefResponse.builder().actorRef(network).build());
return Behaviors.same();
return masterReceiveBuilder(this)
.onMessage(InitializeRequest.class, msg -> {
initializeMasterActor(this);
Objects.requireNonNull(msg.getSender());
msg.getSender().tell(new InitializeResponse());
return this;
})
.onMessage(DssMasterCommand.StatusRequest.class, this::handlingStatusRequest)
.onMessage(DssMasterCommand.StatusUpdate.class, this::handlingStatusUpdate)
.build();
}

Expand All @@ -136,27 +120,38 @@ public ActorRef<DssResolverCommand> getResolverActor() {
}

@Override
public ActorRef<DssNetworkCommand> getNetworkActor() {
return null;
public void setResolverActor(ActorRef<DssResolverCommand> actorRef) {

}

@Override
public DssMasterActorProperty getProperty() {
public ActorRef<DssNetworkCommand> getNetworkActor() {
return null;
}

@Override
public Behavior<DssResolverCommand> createResolverActorBehavior() {
return Behaviors
.receive(DssResolverCommand.class)
.build();
public void setNetworkActor(ActorRef<DssNetworkCommand> actorRef) {

}

@Override
public Behavior<DssNetworkCommand> createNetworkActorBehavior() {
return Behaviors
.receive(DssNetworkCommand.class)
.build();
public DssMasterActorProperty getDssMasterActorProperty() {
return new DssMasterActorProperty() {
@Override
public int getBossThreadCount() {
return 0;
}

@Override
public int getWorkerThreadCount() {
return 0;
}

@Override
public List<DssServiceGenerator> getServiceGeneratorList() {
return null;
}
};
}

@Override
Expand All @@ -168,53 +163,111 @@ public DssMasterActorStatus getMasterActorStatus() {
public void setMasterActorStatus(DssMasterActorStatus status) {
this.status = status;
}
}

private static class ResolverActorRefRequest implements DssMasterCommand{
private static final long serialVersionUID = -6715113886545519228L;
@Override
public DssBehaviorCreator<DssExceptionCommand, DssExceptionActorProperty> getExceptionBehaviorCreator() {
return property -> Behaviors.setup(TestActor::new);
}

@Getter
private final ActorRef<DssMasterCommand> sender;
@Override
public <M extends DssMasterActorProperty> DssExceptionActorProperty createDssExceptionActorProperty(M masterProperty) {
return new DssExceptionActorProperty() {};
}

@Override
public ActorRef<DssExceptionCommand> getExceptionActor() {
return null;
}

@Override
public void setExceptionActor(ActorRef<DssExceptionCommand> actorRef) {

}

@Override
public DssBehaviorCreator<DssNetworkCommand, DssNetworkActorProperty> getNetworkBehaviorCreator() {
return property -> Behaviors.setup(TestActor::new);
}

@Override
public <M extends DssMasterActorProperty> DssNetworkActorProperty createDssNetworkActorProperty(M masterProperty) {
return new DssNetworkActorProperty() {
@Override
public int getBossThreadCount() {
return 1;
}

@Override
public int getWorkerThreadCount() {
return 1;
}
};
}

@Override
public DssBehaviorCreator<DssResolverCommand, DssResolverActorProperty> getResolverBehaviorCreator() {
return property -> Behaviors.setup(TestActor::new);
}

@Override
public <M extends DssMasterActorProperty> DssResolverActorProperty createDssResolverActorProperty(M masterProperty) {
return new DssResolverActorProperty() {};
}

@Override
public DssBehaviorCreator<DssServiceCommand, DssServiceActorProperty> getServiceBehaviorCreator() {
return property -> Behaviors.setup(TestActor::new);
}

@Override
public <M extends DssMasterActorProperty> List<DssServiceActorProperty> createDssServiceActorPropertyList(M masterProperty) {
return new ArrayList<>();
}

@Override
public <P extends DssServiceActorProperty> DssServiceActorResolvable<String> createDssServiceActorResolvable(P property, ActorRef<DssServiceCommand> actor) {
return null;
}

@Override
public Map<String, DssServiceActorResolvable<String>> getServiceActorMap() {
return null;
}

@Override
public void putServiceActorResolvable(String key, DssServiceActorResolvable<String> value) {

@Builder
public ResolverActorRefRequest(ActorRef<DssMasterCommand> sender) {
this.sender = sender;
}
}

private static class ResolverActorRefResponse implements DssMasterCommand {
private static final long serialVersionUID = 6219916186960923214L;
private static class TestActor<T extends DssCommand> extends AbstractBehavior<T> {

@Getter
private final ActorRef<DssResolverCommand> actorRef;
public TestActor(ActorContext<T> context) {
super(context);
}

@Builder
public ResolverActorRefResponse(ActorRef<DssResolverCommand> actorRef) {
this.actorRef = actorRef;
@Override
public Receive<T> createReceive() {
return null;
}
}

private static class NetworkActorRefRequest implements DssMasterCommand {
private static final long serialVersionUID = 249969752402472135L;
private static class InitializeRequest implements DssMasterCommand {
private static final long serialVersionUID = -6715113886545519228L;

@Getter
private final ActorRef<DssMasterCommand> sender;

@Builder
public NetworkActorRefRequest(ActorRef<DssMasterCommand> sender) {
public InitializeRequest(ActorRef<DssMasterCommand> sender) {
this.sender = sender;
}
}

private static class NetworkActorRefResponse implements DssMasterCommand {
private static final long serialVersionUID = -7299143779560419564L;

@Getter
private final ActorRef<DssNetworkCommand> actorRef;
private static class InitializeResponse implements DssMasterCommand {
private static final long serialVersionUID = -4705847872255308681L;

@Builder
public NetworkActorRefResponse(ActorRef<DssNetworkCommand> actorRef) {
this.actorRef = actorRef;
}
public InitializeResponse() { }
}
}

0 comments on commit 8212374

Please sign in to comment.