From ce2ad2771b449c6a5d31f69069067799a556c6f2 Mon Sep 17 00:00:00 2001 From: Mirco Nasuti <mirco.nasuti@chuv.ch> Date: Mon, 5 Dec 2016 11:15:00 +0100 Subject: [PATCH] Trying to make it work --- pom.xml | 12 +++++ .../java/eu/hbp/mip/akka/ExperimentActor.java | 39 ++++++---------- .../java/eu/hbp/mip/akka/SimpleActor.java | 6 +++ .../java/eu/hbp/mip/akka/SpringExtension.java | 44 ++++++------------- .../mip/configuration/AkkaConfiguration.java | 6 ++- .../eu/hbp/mip/controllers/ExperimentApi.java | 18 ++++---- src/main/resources/application.conf | 14 +++++- 7 files changed, 72 insertions(+), 67 deletions(-) diff --git a/pom.xml b/pom.xml index 5af454e24..95258a4b9 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,8 @@ <javax-inject.version>1</javax-inject.version> <akka-actor.version>2.4.11</akka-actor.version> <akka-remote.version>2.4.11</akka-remote.version> + <spring-context.version>4.3.4.RELEASE</spring-context.version> + <protobuf-java.version>3.1.0</protobuf-java.version> </properties> <repositories> @@ -198,6 +200,16 @@ <artifactId>akka-remote_2.11</artifactId> <version>${akka-remote.version}</version> </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>${spring.version}</version> + </dependency> + <dependency> + <groupId>com.google.protobuf</groupId> + <artifactId>protobuf-java</artifactId> + <version>${protobuf-java.version}</version> + </dependency> </dependencies> <pluginRepositories> diff --git a/src/main/java/eu/hbp/mip/akka/ExperimentActor.java b/src/main/java/eu/hbp/mip/akka/ExperimentActor.java index c77bc66dd..f5bb666c7 100644 --- a/src/main/java/eu/hbp/mip/akka/ExperimentActor.java +++ b/src/main/java/eu/hbp/mip/akka/ExperimentActor.java @@ -1,15 +1,16 @@ package eu.hbp.mip.akka; -import akka.actor.Props; import akka.actor.UntypedActor; import akka.event.Logging; import akka.event.LoggingAdapter; -import akka.japi.Creator; import eu.hbp.mip.messages.external.QueryError; import eu.hbp.mip.messages.external.QueryResult; import eu.hbp.mip.model.Experiment; import eu.hbp.mip.repositories.ExperimentRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import java.util.Date; import java.util.UUID; @@ -17,54 +18,42 @@ import java.util.UUID; /** * Created by mirco on 30.11.16. */ + +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ExperimentActor extends UntypedActor { @Autowired private ExperimentRepository experimentRepository; - public static Props props(final UUID expUUID) { - return Props.create(new Creator<ExperimentActor>() { - private static final long serialVersionUID = 1L; - - @Override - public ExperimentActor create() throws Exception { - return new ExperimentActor(expUUID); - } - }); - } - LoggingAdapter log = Logging.getLogger(getContext().system(), this); - private final UUID expUUID; - - private ExperimentActor(UUID expUUID) { - this.expUUID = expUUID; - } @Override public void onReceive(Object message) throws Throwable { + UUID uuid = UUID.fromString(this.getSelf().path().name()); if (message instanceof QueryResult) { QueryResult queryResult = (QueryResult) message; - log.info("received query result for : " + expUUID.toString()); - Experiment experiment = experimentRepository.findOne(expUUID); + log.info("received query result for : " + uuid.toString()); + Experiment experiment = experimentRepository.findOne(uuid); if(experiment == null) { - log.error("Experiment with UUID="+expUUID+" not found in DB"); + log.error("Experiment with UUID="+uuid+" not found in DB"); return; } experiment.setResult(queryResult.data().get()); experiment.setFinished(new Date()); experimentRepository.save(experiment); - log.info("Experiment "+ expUUID +" updated (finished)"); + log.info("Experiment "+ uuid +" updated (finished)"); } else if (message instanceof QueryError) { QueryError queryError = (QueryError) message; log.warning("received query error"); - Experiment experiment = experimentRepository.findOne(expUUID); + Experiment experiment = experimentRepository.findOne(uuid); if(experiment == null) { - log.error("Experiment with UUID="+expUUID+" not found in DB"); + log.error("Experiment with UUID="+uuid+" not found in DB"); return; } experiment.setHasServerError(true); @@ -72,7 +61,7 @@ public class ExperimentActor extends UntypedActor { experimentRepository.save(experiment); experiment.setFinished(new Date()); experimentRepository.save(experiment); - log.info("Experiment "+ expUUID +" updated (finished)"); + log.info("Experiment "+ uuid +" updated (finished)"); } else { diff --git a/src/main/java/eu/hbp/mip/akka/SimpleActor.java b/src/main/java/eu/hbp/mip/akka/SimpleActor.java index c57edbf2a..3e5981047 100644 --- a/src/main/java/eu/hbp/mip/akka/SimpleActor.java +++ b/src/main/java/eu/hbp/mip/akka/SimpleActor.java @@ -4,10 +4,16 @@ import akka.actor.UntypedActor; import akka.event.Logging; import akka.event.LoggingAdapter; import eu.hbp.mip.messages.external.Methods; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; /** * Created by mirco on 30.11.16. */ + +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class SimpleActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); diff --git a/src/main/java/eu/hbp/mip/akka/SpringExtension.java b/src/main/java/eu/hbp/mip/akka/SpringExtension.java index fb6f585c7..5be844078 100644 --- a/src/main/java/eu/hbp/mip/akka/SpringExtension.java +++ b/src/main/java/eu/hbp/mip/akka/SpringExtension.java @@ -10,48 +10,32 @@ import org.springframework.context.ApplicationContext; * Created by mirco on 24.10.16. */ -/** - * An Akka Extension to provide access to Spring managed Actor Beans. - */ -public class SpringExtension extends - AbstractExtensionId<SpringExtension.SpringExt> { - - /** - * The identifier used to access the SpringExtension. - */ - public static SpringExtension SpringExtProvider = new SpringExtension(); - /** - * Is used by Akka to instantiate the Extension identified by this - * ExtensionId, internal use only. - */ +public class SpringExtension + extends AbstractExtensionId<SpringExtension.SpringExt> { + + public static final SpringExtension SPRING_EXTENSION_PROVIDER + = new SpringExtension(); + + private SpringExtension() + { + /* Private constructor for singleton */ + } + @Override public SpringExt createExtension(ExtendedActorSystem system) { return new SpringExt(); } - /** - * The Extension implementation. - */ public static class SpringExt implements Extension { private volatile ApplicationContext applicationContext; - /** - * Used to initialize the Spring application context for the extension. - * @param applicationContext - */ + public void initialize(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } - /** - * Create a Props for the specified actorBeanName using the - * SpringActorProducer class. - * - * @param actorBeanName The name of the actor bean to create Props for - * @return a Props that will create the named actor bean using Spring - */ public Props props(String actorBeanName) { - return Props.create(SpringActorProducer.class, - applicationContext, actorBeanName); + return Props.create( + SpringActorProducer.class, applicationContext, actorBeanName); } } } \ No newline at end of file diff --git a/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java b/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java index 5e104a2da..63a5905bf 100644 --- a/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java +++ b/src/main/java/eu/hbp/mip/configuration/AkkaConfiguration.java @@ -4,15 +4,17 @@ import akka.actor.ActorSystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import static eu.hbp.mip.akka.SpringExtension.SpringExtProvider; +import static eu.hbp.mip.akka.SpringExtension.SPRING_EXTENSION_PROVIDER; /** * Created by mirco on 24.10.16. */ @Configuration +@ComponentScan class AkkaConfiguration { @Autowired @@ -21,7 +23,7 @@ class AkkaConfiguration { @Bean public ActorSystem actorSystem() { ActorSystem system = ActorSystem.create("AkkaActorSystem"); - SpringExtProvider.get(system).initialize(applicationContext); + SPRING_EXTENSION_PROVIDER.get(system).initialize(applicationContext); return system; } diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index 2817519bb..24793c3d9 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -3,12 +3,10 @@ package eu.hbp.mip.controllers; import akka.actor.ActorRef; import akka.actor.ActorSelection; import akka.actor.ActorSystem; -import akka.actor.Props; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import eu.hbp.mip.akka.ExperimentActor; -import eu.hbp.mip.akka.SimpleActor; +import eu.hbp.mip.akka.SpringExtension; import eu.hbp.mip.configuration.SecurityConfiguration; import eu.hbp.mip.messages.external.MethodsQuery; import eu.hbp.mip.model.Experiment; @@ -76,7 +74,7 @@ public class ExperimentApi { private ExperimentRepository experimentRepository; @Autowired - private ActorSystem actorSystem; + public ActorSystem actorSystem; @Value("#{'${akka.woken-path:akka.tcp://woken@127.0.0.1:8088/user/entrypoint}'}") private String wokenPath; @@ -212,9 +210,11 @@ public class ExperimentApi { public ResponseEntity listAvailableMethodsAndValidations() throws IOException { LOGGER.info("List available methods and validations"); + LOGGER.info("Akka is trying to reach remote " + wokenPath); ActorSelection wokenActor = actorSystem.actorSelection(wokenPath); - ActorRef simpleActor = actorSystem.actorOf(Props.create(SimpleActor.class)); - wokenActor.tell(new MethodsQuery(), simpleActor); + ActorRef methodsManager = actorSystem.actorOf(SpringExtension.SPRING_EXTENSION_PROVIDER.get(actorSystem) + .props("simpleActor")); + wokenActor.tell(new MethodsQuery(), methodsManager); return ResponseEntity.ok().build(); } @@ -280,9 +280,11 @@ public class ExperimentApi { // this runs in the background. For future optimization: use a thread pool final eu.hbp.mip.messages.external.ExperimentQuery experimentQuery = experiment.computeQuery(); + LOGGER.info("Akka is trying to reach remote " + wokenPath); ActorSelection wokenActor = actorSystem.actorSelection(wokenPath); - ActorRef experimentActor = actorSystem.actorOf(Props.create(ExperimentActor.class, experiment.getUuid())); - wokenActor.tell(experimentQuery, experimentActor); + ActorRef experimentsManager = actorSystem.actorOf(SpringExtension.SPRING_EXTENSION_PROVIDER.get(actorSystem) + .props("experimentActor"), experiment.getUuid().toString()); + wokenActor.tell(experimentQuery, experimentsManager); } private void sendExaremeExperiment(Experiment experiment) { diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index ef1245468..8c6522166 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -1,13 +1,23 @@ akka { - loglevel = INFO + loglevel = DEBUG + log-config-on-start = on + debug { + autoreceive = on + lifecycle = on + unhandled = on + fsm = on + event-stream = on + } actor { provider = "akka.remote.RemoteActorRefProvider" } remote { + log-sent-messages = on + log-received-messages = on enabled-transports = ["akka.remote.netty.tcp"] netty.tcp { hostname = 127.0.0.1 # external (logical) hostname - port = 8088 # external (logical) port + port = 8089 # external (logical) port bind-hostname = 127.0.0.1 # internal (bind) hostname bind-port = 8088 # internal (bind) port -- GitLab