I am really struggling with this one. I tried to follow the (quite 
fragmented) examples about the cluster singleton pattern (for akka 2.2.3) 
and I came up with the following code to play around with it:

import org.scalatest.{Matchers, WordSpecLike}
import akka.actor._
import akka.testkit.TestKit
import akka.cluster.Cluster
import akka.contrib.pattern.ClusterSingletonManager
import com.typesafe.config.ConfigFactory
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}

class ClusterSingletonSpec extends TestKit(ActorSystem("SingletonTest")) 
with WordSpecLike with Matchers {

  val ports = "2551" :: "2552" :: "2553" :: "2554" :: Nil
  val systems = ports.map(new SingletonSystem(_))

  "the cluster singleton" should {
    "be reachable using actor selection" in {
      new SingletonSystem("2555") {

        Cluster(system).registerOnMemberUp {
          import system.dispatcher

          // let's wait for the singleton to be created...
          Thread.sleep(5000)

          val timeout = 5.seconds

          val resolved = Future.sequence(
            ("2555" :: ports).map(
              port =>
                
system.actorSelection(s"akka.tcp://[email protected]:$port/user/singleton/singletonService").resolveOne(timeout).map(Some(_)).recover
 
{
                  case e =>
                    println(s"Ooops: $e")
                    None
                }
            )
          ).map(_.flatten)

          println(Await.result(resolved, 10 seconds))
        }
      }
      // let's sit on this for a little while
      Thread.sleep(20000)
    }
  }
}

class SingletonSystem(name: String, port: String) extends 
TestKit(ActorSystem(name,
  
ConfigFactory.parseString(s"akka.remote.netty.tcp.port=$port").withFallback(ConfigFactory.parseString(SingletonSystem.cfg))))
 
{

  def this(port: String) = this("SingletonSystem", port)

  def this() = this("0")

  Cluster(system).registerOnMemberUp {
    system.actorOf(ClusterSingletonManager.props(
      singletonProps = _ ⇒ Props[SingletonService],
      singletonName = "singletonService",
      terminationMessage = PoisonPill,
      role = None),
      name = "singleton")
  }
}

class SingletonService extends Actor {
  println("Service created")

  import context.dispatcher

  context.system.scheduler.schedule(500 milliseconds, 500 milliseconds, 
self, "I am the service")

  def receive: Actor.Receive = {
    case msg => println(s"Service received: $msg")
  }
}

object SingletonSystem {
  val cfg = """akka {
              |
              |  loglevel = INFO
              |
              |  cluster {
              |    seed-nodes = [
              |      "akka.tcp://[email protected]:2551",
              |      "akka.tcp://[email protected]:2552"
              |      ]
              |
              |    auto-down-unreachable-after = 10s
              |
              |    min-nr-of-members = 2
              |  }
              |
              |  actor.provider = "akka.cluster.ClusterActorRefProvider"
              |
              |  remote {
              |    log-remote-lifecycle-events = off
              |    netty.tcp {
              |      hostname = "127.0.0.1"
              |      port = 0
              |    }
              |  }
              |}
            """.stripMargin
}

The problem is that it doesn't work at all: the singleton doesn't even get 
created and the log shows (among others) the following lines:

[INFO] [01/15/2014 10:50:01.512] 
[SingletonSystem-akka.actor.default-dispatcher-19] 
[akka://SingletonSystem/user/singleton] ClusterSingletonManager state 
change [Start -> BecomingOldest]
[INFO] [01/15/2014 10:50:01.886] 
[SingletonSystem-akka.actor.default-dispatcher-2] 
[akka://SingletonSystem/user/singleton] ClusterSingletonManager state 
change [Start -> Younger]
[INFO] [01/15/2014 10:50:02.529] 
[SingletonSystem-akka.actor.default-dispatcher-19] 
[akka://SingletonSystem/user/singleton] Retry [1], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:03.545] 
[SingletonSystem-akka.actor.default-dispatcher-8] 
[akka://SingletonSystem/user/singleton] Retry [2], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:04.566] 
[SingletonSystem-akka.actor.default-dispatcher-7] 
[akka://SingletonSystem/user/singleton] Retry [3], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:05.586] 
[SingletonSystem-akka.actor.default-dispatcher-18] 
[akka://SingletonSystem/user/singleton] Retry [4], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:06.484] 
[SingletonSystem-akka.actor.default-dispatcher-19] 
[akka://SingletonSystem/user/singleton] ClusterSingletonManager state 
change [Start -> Younger]
[INFO] [01/15/2014 10:50:06.605] 
[SingletonSystem-akka.actor.default-dispatcher-3] 
[akka://SingletonSystem/user/singleton] Retry [5], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:06.614] 
[SingletonSystem-akka.actor.default-dispatcher-6] 
[akka://SingletonSystem/user/singleton] ClusterSingletonManager state 
change [Start -> Younger]
[INFO] [01/15/2014 10:50:06.669] 
[SingletonSystem-akka.actor.default-dispatcher-20] 
[akka://SingletonSystem/user/singleton] ClusterSingletonManager state 
change [Start -> Younger]
[INFO] [01/15/2014 10:50:07.626] 
[SingletonSystem-akka.actor.default-dispatcher-16] 
[akka://SingletonSystem/user/singleton] Retry [6], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:08.646] 
[SingletonSystem-akka.actor.default-dispatcher-5] 
[akka://SingletonSystem/user/singleton] Retry [7], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:09.665] 
[SingletonSystem-akka.actor.default-dispatcher-8] 
[akka://SingletonSystem/user/singleton] Retry [8], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:10.686] 
[SingletonSystem-akka.actor.default-dispatcher-16] 
[akka://SingletonSystem/user/singleton] Retry [9], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:11.706] 
[SingletonSystem-akka.actor.default-dispatcher-3] 
[akka://SingletonSystem/user/singleton] Retry [10], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:12.726] 
[SingletonSystem-akka.actor.default-dispatcher-16] 
[akka://SingletonSystem/user/singleton] Retry [11], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:13.746] 
[SingletonSystem-akka.actor.default-dispatcher-20] 
[akka://SingletonSystem/user/singleton] Retry [12], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:14.766] 
[SingletonSystem-akka.actor.default-dispatcher-3] 
[akka://SingletonSystem/user/singleton] Retry [13], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:15.785] 
[SingletonSystem-akka.actor.default-dispatcher-17] 
[akka://SingletonSystem/user/singleton] Retry [14], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:16.806] 
[SingletonSystem-akka.actor.default-dispatcher-3] 
[akka://SingletonSystem/user/singleton] Retry [15], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:17.825] 
[SingletonSystem-akka.actor.default-dispatcher-6] 
[akka://SingletonSystem/user/singleton] Retry [16], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:18.846] 
[SingletonSystem-akka.actor.default-dispatcher-19] 
[akka://SingletonSystem/user/singleton] Retry [17], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:19.866] 
[SingletonSystem-akka.actor.default-dispatcher-2] 
[akka://SingletonSystem/user/singleton] Retry [18], sending HandOverToMe to 
[None]
[INFO] [01/15/2014 10:50:20.885] 
[SingletonSystem-akka.actor.default-dispatcher-17] 
[akka://SingletonSystem/user/singleton] Retry [19], sending HandOverToMe to 
[None]

And my println statements:

Ooops: akka.actor.ActorNotFound: Actor not found for: 
ActorSelection[Actor[akka://SingletonSystem/]/user/singleton/singletonService]
Ooops: akka.actor.ActorNotFound: Actor not found for: 
ActorSelection[Actor[akka.tcp://[email protected]:2551/]/user/singleton/singletonService]
Ooops: akka.actor.ActorNotFound: Actor not found for: 
ActorSelection[Actor[akka.tcp://[email protected]:2553/]/user/singleton/singletonService]
Ooops: akka.actor.ActorNotFound: Actor not found for: 
ActorSelection[Actor[akka.tcp://[email protected]:2552/]/user/singleton/singletonService]
Ooops: akka.actor.ActorNotFound: Actor not found for: 
ActorSelection[Actor[akka.tcp://[email protected]:2554/]/user/singleton/singletonService]
List()

I can't figure out what I'm doing wrong. Is it because I'm running in a 
single JVM? If so, is this a bug?

I appreciate any help, I've been banging my head against this for two days 
with no luck.

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: http://akka.io/faq/
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to