revert TimerScheduler eingebaut. Funktionalität komplett fertig
This commit is contained in:
egor.rutkowski 2024-07-02 21:35:25 +02:00
parent f9c07cebd9
commit 4366a22761
3 changed files with 129 additions and 101 deletions

View File

@ -6,16 +6,12 @@ import akka.actor.typed.javadsl.AbstractBehavior;
import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive; import akka.actor.typed.javadsl.Receive;
import akka.actor.typed.javadsl.*;
import java.time.Duration;
import java.util.Objects; import java.util.Objects;
import java.util.logging.Logger; import java.util.logging.Logger;
public class Actor extends AbstractBehavior<Actor.Message> { public class Actor extends AbstractBehavior<Actor.Message> {
//TODO: Wartezeit bei der Operation
//Timer für die Berechnung
final TimerScheduler<Message> timer;
//Zurückgegebener String & Integer von der linken Seite //Zurückgegebener String & Integer von der linken Seite
String leftString; String leftString;
int leftInt; int leftInt;
@ -31,8 +27,6 @@ public class Actor extends AbstractBehavior<Actor.Message> {
Expression expression; Expression expression;
public interface Message{} public interface Message{}
public record Compute() implements Message{}
public record PrintAndEvaluate(Expression expression) implements Message{} public record PrintAndEvaluate(Expression expression) implements Message{}
//Antwort von dem linken Kind //Antwort von dem linken Kind
@ -41,14 +35,13 @@ public class Actor extends AbstractBehavior<Actor.Message> {
//Antwort von dem rechten Kind //Antwort von dem rechten Kind
public record RightResponse(String string, int wert) implements Message{} public record RightResponse(String string, int wert) implements Message{}
private Actor(ActorContext<Message> context, String name, TimerScheduler<Message> timer){ private Actor(ActorContext<Message> context, String name){
super(context); super(context);
this.name = name; this.name = name;
this.timer = timer;
} }
public static Behavior<Actor.Message> create(String name){ public static Behavior<Actor.Message> create(String name){
return Behaviors.setup(context -> Behaviors.withTimers(timers -> new Actor(context, name, timers))); return Behaviors.setup(context -> new Actor(context, name));
} }
@Override @Override
@ -57,7 +50,6 @@ public class Actor extends AbstractBehavior<Actor.Message> {
.onMessage(PrintAndEvaluate.class, this::onPrintAndEvaluate) .onMessage(PrintAndEvaluate.class, this::onPrintAndEvaluate)
.onMessage(LeftResponse.class, this::onLeftResponse) .onMessage(LeftResponse.class, this::onLeftResponse)
.onMessage(RightResponse.class, this::onRightResponse) .onMessage(RightResponse.class, this::onRightResponse)
.onMessage(Compute.class, this::onComputeMessage)
.build(); .build();
} }
@ -91,36 +83,32 @@ public class Actor extends AbstractBehavior<Actor.Message> {
} }
Logger logger = Logger.getLogger(Actor.class.getName()); Logger logger = Logger.getLogger(Actor.class.getName());
//Antwort von dem rechten Kind. Wenn beide Seiten geantwortet haben, wird eine Sekunde gewartet und dann das Ergebnis
//berechnet in Compute()
private Behavior<Message> onLeftResponse(LeftResponse response){ private Behavior<Message> onLeftResponse(LeftResponse response){
this.leftString = response.string; this.leftString = response.string;
this.leftInt = response.wert; this.leftInt = response.wert;
if(this.rightString != null){ if(this.rightString != null){
this.timer.startSingleTimer(new Compute(),Duration.ofSeconds(1)); if(operationString.equals("+")){
logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt + rightInt));
} else if (operationString.equals("-")) {
logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt - rightInt));
}else{
logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt * rightInt));
}
} }
return this; return this;
} }
//Antwort von dem rechten Kind. Wenn beide Seiten geantwortet haben, wird eine Sekunde gewartet und dann das Ergebnis
//berechnet in Compute()
private Behavior<Message> onRightResponse(RightResponse response){ private Behavior<Message> onRightResponse(RightResponse response){
this.rightString = response.string; this.rightString = response.string;
this.rightInt = response.wert; this.rightInt = response.wert;
if(this.leftString != null){ if(this.leftString != null){
this.timer.startSingleTimer(new Compute(),Duration.ofSeconds(1)); if(operationString.equals("+")){
} logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt + rightInt));
return this; } else if (operationString.equals("-")) {
} logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt - rightInt));
}else{
private Behavior<Message> onComputeMessage(Compute response){ logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt * rightInt));
if(operationString.equals("+")){ }
logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt + rightInt));
} else if (operationString.equals("-")) {
logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt - rightInt));
}else{
logger.info("(" + leftString + operationString + rightString + ") Wert: " + (leftInt * rightInt));
} }
return this; return this;
} }

View File

@ -28,10 +28,11 @@ public class AkkaMainSystem extends AbstractBehavior<AkkaMainSystem.Create> {
private Behavior<Create> onCreate(Create command) { private Behavior<Create> onCreate(Create command) {
//#create-actors //#create-actors
Expression expression = Expression.generateExpression(6, 9); Expression expression = Expression.generateExpression(6, 9);
Expression testExp = Expression.generateExpression(4,9);
ActorRef<Actor.Message> computer = this.getContext().spawn(Actor.create("Rechner"), "Rechner"); ActorRef<Actor.Message> computer = this.getContext().spawn(Actor.create("Rechner"), "Rechner");
computer.tell(new Actor.PrintAndEvaluate(expression)); computer.tell(new Actor.PrintAndEvaluate(testExp));
//Vergleich mit dem Output der Berechnung //Vergleich mit dem Output der Berechnung
System.out.println("SOLL: "+expression+ " Wert:" +expression.eval() + " Runtime: " + expression.runtime()); System.out.println("SOLL: "+testExp.toString()+ " Wert:" +testExp.eval() + " Runtime: " + testExp.runtime());
return this; return this;
} }
} }

View File

@ -2,17 +2,15 @@ package com.example;
import akka.actor.typed.ActorRef; import akka.actor.typed.ActorRef;
import akka.actor.typed.Behavior; import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.*; 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 java.time.Duration;
import java.util.Objects; import java.util.Objects;
public class SubActor extends AbstractBehavior<SubActor.Message> { public class SubActor extends AbstractBehavior<SubActor.Message> {
//TODO: Wartezeit bei den Operationen
//Timer, um bei den Berechnungen eine Sekunde lang zu warten
TimerScheduler<Message> timer;
Expression expression; Expression expression;
//Zeichen für die Operation (Add, Sub, Mul) welche benutzt wird //Zeichen für die Operation (Add, Sub, Mul) welche benutzt wird
@ -49,16 +47,12 @@ public class SubActor extends AbstractBehavior<SubActor.Message> {
//Antwort von dem rechten Kind //Antwort von dem rechten Kind
public record RightResponse(String string, int wert) implements Message{ } public record RightResponse(String string, int wert) implements Message{ }
//Nachricht an sich selbst, um nach einer Sekunde Wartezeit das Ergebnis zu berechnen private SubActor(ActorContext<SubActor.Message> context){
public record Compute() implements Message{}
private SubActor(ActorContext<SubActor.Message> context, TimerScheduler<Message> timer){
super(context); super(context);
this.timer = timer;
} }
public static Behavior<SubActor.Message> create(){ public static Behavior<SubActor.Message> create(){
return Behaviors.setup(context -> Behaviors.withTimers(timers -> new SubActor(context,timers))); return Behaviors.setup(context -> new SubActor(context));
} }
@Override @Override
@ -68,7 +62,6 @@ public class SubActor extends AbstractBehavior<SubActor.Message> {
.onMessage(SubPrintAndEvaluate.class, this::onSubPrintAndEvaluate) .onMessage(SubPrintAndEvaluate.class, this::onSubPrintAndEvaluate)
.onMessage(LeftResponse.class, this::onLeftResponse) .onMessage(LeftResponse.class, this::onLeftResponse)
.onMessage(RightResponse.class, this::onRightResponse) .onMessage(RightResponse.class, this::onRightResponse)
.onMessage(Compute.class, this::onComputeMessage)
.build(); .build();
} }
@ -107,7 +100,7 @@ public class SubActor extends AbstractBehavior<SubActor.Message> {
return this; return this;
} }
//Nachricht von dem SubActor, von welchem dieser SubActor erstellt wurde, wird verarbeitet. //Nachricht von einem SubActor wird verarbeitet.
//Dabei wird seine Referenz in oberActor gespeichert. //Dabei wird seine Referenz in oberActor gespeichert.
public Behavior<Message> onSubPrintAndEvaluate(SubPrintAndEvaluate message){ public Behavior<Message> onSubPrintAndEvaluate(SubPrintAndEvaluate message){
this.oberActor = message.sender; this.oberActor = message.sender;
@ -148,7 +141,57 @@ public class SubActor extends AbstractBehavior<SubActor.Message> {
this.leftString = response.string; this.leftString = response.string;
this.leftInt = response.wert; this.leftInt = response.wert;
if(this.rightString != null){ if(this.rightString != null){
timer.startSingleTimer(new Compute(), Duration.ofSeconds(1)); if(oberActor != null){
//side == true bedeutet, dass dieser Actor das linke Kind ist und es wird LeftResponse geschickt
if(side == true){
if(operationString.equals("+")){
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}else {
if(operationString.equals("+")){
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}
}else{
if(side == true){
if(operationString.equals("+")){
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}else {
if(operationString.equals("+")){
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}
}
} }
return this; return this;
} }
@ -157,62 +200,58 @@ public class SubActor extends AbstractBehavior<SubActor.Message> {
this.rightString = response.string; this.rightString = response.string;
this.rightInt = response.wert; this.rightInt = response.wert;
if(this.leftString != null){ if(this.leftString != null){
timer.startSingleTimer(new Compute(), Duration.ofSeconds(1)); if(oberActor != null){
//side == true bedeutet, dass dieser Actor das linke Kind ist und es wird LeftResponse geschickt
if(side == true){
if(operationString.equals("+")){
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}else {
if(operationString.equals("+")){
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}
}else {
if(side == true){
if(operationString.equals("+")){
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}else {
if(operationString.equals("+")){
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
}else{
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}
}
} }
return this; return this;
} }
private Behavior<Message> onComputeMessage(Compute response) {
if (oberActor != null) {
//side == true bedeutet, dass dieser Actor das linke Kind ist und es wird LeftResponse geschickt
if (side == true) {
if (operationString.equals("+")) {
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
} else {
oberActor.tell(new LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
} else {
if (operationString.equals("+")) {
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
} else {
oberActor.tell(new RightResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}
} else {
if (side == true) {
if (operationString.equals("+")) {
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
} else {
initial.tell(new Actor.LeftResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
} else {
if (operationString.equals("+")) {
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt + rightInt));
} else if (operationString.equals("-")) {
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt - rightInt));
} else {
initial.tell(new Actor.RightResponse("(" + leftString + operationString + rightString + ")",
leftInt * rightInt));
}
}
}
return this;
}
} }