2011-12-07 16:29:12 +01:00
|
|
|
/**
|
2012-01-19 18:21:06 +01:00
|
|
|
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
|
2011-12-07 16:29:12 +01:00
|
|
|
*/
|
|
|
|
|
package akka.remote
|
|
|
|
|
|
|
|
|
|
import akka.actor._
|
2011-12-13 01:09:05 +01:00
|
|
|
import akka.routing._
|
2011-12-07 16:29:12 +01:00
|
|
|
import com.typesafe.config._
|
|
|
|
|
import akka.config.ConfigurationException
|
|
|
|
|
|
2012-01-31 21:19:28 +01:00
|
|
|
case class RemoteScope(node: Address) extends Scope {
|
|
|
|
|
def withFallback(other: Scope): Scope = this
|
|
|
|
|
}
|
2011-12-07 16:29:12 +01:00
|
|
|
|
Bye-bye ReflectiveAccess, introducing PropertyMaster, see #1750
- PropertyMaster is the only place in Akka which calls
ClassLoader.getClass (apart from kernel, which might be special)
- all PropertyMaster methods (there are only three) take a ClassManifest
of what is to be constructed, and they verify that the obtained object
is actually compatible with the required type
Other stuff:
- noticed that I had forgotten to change to ExtendedActorSystem when
constructing Extensions by ExtensionKey (damn you, reflection!)
- moved Serializer.currentSystem into JavaSerializer, because that’s the
only one needing it (it’s only used in readResolve() methods)
- Serializers are constructed now with one-arg constructor taking
ExtendedActorSystem (if that exists, otherwise no-arg as before), to
allow JavaSerializer to do its magic; possibly necessary for others as
well
- Removed all Option[ClassLoader] signatures
- made it so that the ActorSystem will try context class loader, then
the class loader which loaded the class actually calling into
ActorSystem.apply, then the loader which loaded ActorSystemImpl
- for the second of the above I added a (reflectively accessed hopefully
safe) facility for getting caller Class[_] objects by using
sun.reflect.Reflection; this is optional an defaults to None, e.g. on
Android, which means that getting the caller’s classloader is done on
a best effort basis (there’s nothing we can do because a StackTrace
does not contain actual Class[_] objects).
- refactored DurableMailbox to contain the owner val and use that
instead of declaring that in all subclasses
2012-02-09 11:56:43 +01:00
|
|
|
class RemoteDeployer(_settings: ActorSystem.Settings, _pm: PropertyMaster) extends Deployer(_settings, _pm) {
|
2011-12-07 16:29:12 +01:00
|
|
|
|
2011-12-09 20:19:59 +01:00
|
|
|
override protected def parseConfig(path: String, config: Config): Option[Deploy] = {
|
2011-12-07 16:29:12 +01:00
|
|
|
import scala.collection.JavaConverters._
|
|
|
|
|
|
2011-12-13 01:09:05 +01:00
|
|
|
super.parseConfig(path, config) match {
|
|
|
|
|
case d @ Some(deploy) ⇒
|
|
|
|
|
deploy.config.getString("remote") match {
|
2012-01-20 14:29:50 +01:00
|
|
|
case AddressExtractor(r) ⇒ Some(deploy.copy(scope = RemoteScope(r)))
|
2011-12-13 01:09:05 +01:00
|
|
|
case str ⇒
|
|
|
|
|
if (!str.isEmpty) throw new ConfigurationException("unparseable remote node name " + str)
|
|
|
|
|
val nodes = deploy.config.getStringList("target.nodes").asScala
|
2012-01-31 21:19:28 +01:00
|
|
|
if (nodes.isEmpty || deploy.routerConfig == NoRouter) d
|
|
|
|
|
else Some(deploy.copy(routerConfig = RemoteRouterConfig(deploy.routerConfig, nodes)))
|
2011-12-13 01:09:05 +01:00
|
|
|
}
|
|
|
|
|
case None ⇒ None
|
|
|
|
|
}
|
2011-12-07 16:29:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|