Skip to content
Snippets Groups Projects
Commit 7dc63c98 authored by POLITO Guillermo Andres's avatar POLITO Guillermo Andres
Browse files

- Added Scaladocs to NetworkEntityActor

- Extracted NetworkContainerActor into own file
parent 790ae87b
No related branches found
No related tags found
No related merge requests found
package fr.univ_lille.cristal.emeraude.n2s3.core.actors
import fr.univ_lille.cristal.emeraude.n2s3.core.NetworkContainer
import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{ActorCompanion, SinglePropsBuilder}
/**
* Actor companion of [[NetworkContainerActor]].
* It defines a way to create new [[NetworkContainerActor]] instances
*/
object NetworkContainerActor extends ActorCompanion{
/**
* Returns a props builder for a [[NetworkContainerActor]]
*/
def newPropsBuilder() = new SinglePropsBuilder[NetworkContainerActor]()
}
/**
* NetworkEntityActor that contains a NetworkContainer as NetworkEntity
*/
class NetworkContainerActor extends NetworkEntityActor(new NetworkContainer)
\ No newline at end of file
...@@ -6,17 +6,18 @@ package fr.univ_lille.cristal.emeraude.n2s3.core.actors ...@@ -6,17 +6,18 @@ package fr.univ_lille.cristal.emeraude.n2s3.core.actors
import akka.actor.{Actor, Props} import akka.actor.{Actor, Props}
import fr.univ_lille.cristal.emeraude.n2s3.core._ import fr.univ_lille.cristal.emeraude.n2s3.core._
import fr.univ_lille.cristal.emeraude.n2s3.core.actors.NetworkEntityActor.{ExplicitSenderRoutedMessage, ImplicitSenderRoutedMessage} import fr.univ_lille.cristal.emeraude.n2s3.core.actors.NetworkEntityActor.{CheckMailbox, ExplicitSenderRoutedMessage, ImplicitSenderRoutedMessage}
import fr.univ_lille.cristal.emeraude.n2s3.core.exceptions.{UnknownDestinationException, UnknownPathException} import fr.univ_lille.cristal.emeraude.n2s3.core.exceptions.{UnknownDestinationException, UnknownPathException}
import fr.univ_lille.cristal.emeraude.n2s3.support.actors import fr.univ_lille.cristal.emeraude.n2s3.support
import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{ActorCompanion, Message, PropsBuilder, SinglePropsBuilder} import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{Message, PropsBuilder}
import scala.collection.mutable import scala.collection.mutable
/** /**
* Companion object of NetworkContainerActor * Companion object of [[NetworkEntityActor]].
* Includes common messages used by [[NetworkEntityActor]] and a builder to instantiate actors.
*/ */
object NetworkEntityActor extends actors.ActorCompanion { object NetworkEntityActor extends support.actors.ActorCompanion {
/** /**
* Message used to add a child to the target NetworkContainer. * Message used to add a child to the target NetworkContainer.
...@@ -48,49 +49,19 @@ object NetworkEntityActor extends actors.ActorCompanion { ...@@ -48,49 +49,19 @@ object NetworkEntityActor extends actors.ActorCompanion {
case class SynchronizedRoutedMessage(to: Traversable[Any], message: Message, sender : NetworkEntityPath) case class SynchronizedRoutedMessage(to: Traversable[Any], message: Message, sender : NetworkEntityPath)
/** /**
* Create the PropsBuilder of NetworkEntityActor class * Message used when the limits of local messages processed is reached.
* * This one alone to resume immediately the messageQueue processing in case of there's no incoming messages
* @return new PropsBuilder
*/ */
def newPropsBuilder() = new NetworkEntityActorPropsBuilder private object CheckMailbox
}
/** /**
* Abstract representation of an actor that contains a NetworkEntity * Returns a PropsBuilder for a [[NetworkEntityActor]]
* This actor is used to make the interface between the NetworkEntity (e.g. neurons, neuron containers) it contains and the external system
*
* It may receive messages that it will treat itself or messages it will forward to it's children entities
* The latter handle two kind of messages :
* - ExplicitSenderRoutedMessage includes the actor where the response should be sent
* - ImplicitSenderRoutedMessage will send the message's response to de implicit sender set by Akka
*
* Other messages are processed by the actor itself
*
* This class keeps a queue of messages that are not yet processed.
*
* Each message generated by a local NetworkEntity is added to this queue in order to let the current entity
* finish processing before starting the following. However, in the case of local ask pattern, the message is instantly processed
* and the response can be returned immediately.
*
* Local ask should be avoided if possible
* In case of mutual local ask, the actor will be in state of deadlock
*
* For examples of usages, see @NetworkContainer
*/ */
def newPropsBuilder() = new NetworkEntityActorPropsBuilder
object NetworkContainerActor extends ActorCompanion{
def newPropsBuilder() = new SinglePropsBuilder[NetworkContainerActor]()
} }
/** /**
* mixin of NetworkContainer with NetworkEntityActor * Specialized PropsBuilder used to construct a NetworkEntityActor.
*/
class NetworkContainerActor extends NetworkEntityActor(new NetworkContainer)
/**
* Specialization of PropsBuilder used to construct NetworkEntityActor.
* This class allow to set the root entity
*/ */
class NetworkEntityActorPropsBuilder extends PropsBuilder { class NetworkEntityActorPropsBuilder extends PropsBuilder {
private var entity: NetworkEntity = _ private var entity: NetworkEntity = _
...@@ -104,28 +75,32 @@ class NetworkEntityActorPropsBuilder extends PropsBuilder { ...@@ -104,28 +75,32 @@ class NetworkEntityActorPropsBuilder extends PropsBuilder {
} }
/** /**
* specialization of NetworkEntityActor used to provide the root ReferenceableNetworkEntity in constructor parameter instead of specify it in mixin * Actor to interact with a network entity (e.g. neurons, neuron containers)
* This class is responsible for making the bridge between the actor and the content entity * Receives messages that it may treat itself or forward to it's children entities
* The latter handle two kind of messages :
* - [[ExplicitSenderRoutedMessage]] includes the actor where the response should be sent
* - [[ImplicitSenderRoutedMessage]] will send the message's response to de implicit sender set by Akka
*
* Other messages are processed by the actor itself.
* *
* @param entity is the root ReferenceableNetworkEntity of the actor * This class keeps a queue of messages that are not yet processed.
*
* Each message generated by a local NetworkEntity is added to this queue in order to let the current entity
* finish processing before starting the following. However, in the case of local ask pattern, the message is instantly processed
* and the response can be returned immediately.
*
* Local ask should be avoided if possible
* In case of mutual local ask, the actor will be in state of deadlock
*
* For examples of usages, see [[NetworkContainer]]
* @param entity is the root Networkentity contained by the actor
*/ */
class NetworkEntityActor(val entity : NetworkEntity) extends Actor { class NetworkEntityActor(val entity : NetworkEntity) extends Actor {
override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
println("[DEBUG] Restart Actor "+self+" : "+reason+(if(message.isDefined) " | "+message.get else ""))
super.preRestart(reason, message)
}
entity.container = this entity.container = this
// entity.setParent(this, this)
def resolvePath(target : Traversable[Any]) : NetworkEntity = {
entity.resolvePath(target)
}
/** /**
* Queue which contains next message to process * Queue which contains next message to process
*
* Each message are accompanied by the target NetworkEntity and the sender NetworkEntityReference * Each message are accompanied by the target NetworkEntity and the sender NetworkEntityReference
*/ */
private val messageQueue = mutable.Queue[(Message, NetworkEntity, NetworkEntityReference)]() private val messageQueue = mutable.Queue[(Message, NetworkEntity, NetworkEntityReference)]()
...@@ -135,11 +110,14 @@ class NetworkEntityActor(val entity : NetworkEntity) extends Actor { ...@@ -135,11 +110,14 @@ class NetworkEntityActor(val entity : NetworkEntity) extends Actor {
*/ */
private val maxMessageProcess = 10 private val maxMessageProcess = 10
/** override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
* Message used when the limits of local messages processed is reached. println("[DEBUG] Restart Actor " + self + " : " + reason + (if(message.isDefined) " | " + message.get else "" ))
* This one alone to resume immediately the messageQueue processing in case of there's no incoming messages super.preRestart(reason, message)
*/ }
private object CheckMailbox
def resolvePath(target : Traversable[Any]) : NetworkEntity = {
entity.resolvePath(target)
}
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment