Santoash, It is certainly possible, but it is confusing. I think what is probably happening is that you are passing an ActorRef in a message to the ClusterSingleton. When you create the actor in your local system (even if it is configured for remoting), you can't then send that actorref in a message to the remote cluster node actor. (Well, you can, but the remote system won't have any way to communicate with the ActorRef you sent.) Instead, you need for the ClusterSingleton to create an ActorSelection that references your local actor.
You could do this two ways, but only one actually works. First, you could send a message to the ClusterSingleton with the hostname, port and path of your local actor, and then the ClusterSingleton could create an ActorSelection by looking up the actor remotely. Alternatively, you would think you can have the actor on your local node send a message to the ClusterSingleton, and then reply to the actor as "sender()". As I said above, if you send the ActorRef in a message to the ClusterSingleton, it won't work. But, if you reference ```sender``` from the ClusterSingleton, the ```sender``` ActorRef should contain the remote actor path, and you'll be able to send messages back. Unfortunately, that second method doesn’t work. For some reason (I’m still trying to decide whether it is a bug), when you’re inside of a cluster actor and you look at the path of a sender, and that sender is a remote actor, the cluster actor will replace the remote actor’s system name with its own system name. When it tries to send the message back, it makes it back to the host, but it “dead letters” there because there’s no system by that name. Here’s an example from my experience: I was using actor.router.Listeners, where you can listen to the gossip() of an actor by sending it a message like Listen(self). When I tried to send that message to an actor on a remote cluster, it didn't work. Like you, I saw that the path for the ActorRef of “self” didn’t contain the host/port/path info, even though that actor was created using a system configured for remoting. So, instead, I tried this: ``` case object ListenToMe // inside the actor created in the “RemoteSystem” system clusterActor ! ListenToMe ``` and then, the cluster actor looked like this: ``` class ClusterActor extends Actor with Listeners { def receive = listenerManagement orElse { case ListenToMe => { val mySender = sender() log(“Cluster actor got ListenToMe from “ + mySender.path) self ! Listen(mySender) } ... } } ``` When I did this, the log message showed that mySender.path was akka.tcp://ClusterSystem@127.0.0.1:2552/user/remoteactor. The host and port were correct, but the system name should have been RemoteSystem, not ClusterSystem. That didn’t work. This is what I ended up doing: ``` case class ListenToMe(system:String, host:String, port:Int, name:String) // inside the actor created in the “RemoteSystem” system clusterActor ! ListenToMe(“RemotingSystem”, “127.0.0.1”, 2552, “remoteactor”) ``` and then, the cluster actor looked like this: ``` class ClusterActor extends Actor with Listeners { def receive = listenerManagement orElse { case ListenToMe(system, host, port, name) => { val selection = context.actorSelection(s"akka.tcp://$system@$host:$port/user/$name") selection ! Identify(name) } case ActorIdentity(_, Some(ref)) => { self ! akka.routing.Listen(ref) } ... } } ``` That worked. So, using “sender” in the cluster system didn’t work, but getting an ActorSelection from the full path, and then using the Identify message and ActorIdentity response did give me the right ActorRef. Note: I could have just used the ActorSelection and sent messages using it, but I wanted to use Listeners, and the Listen message requires an ActorRef. Brandon Hudgeons On Wednesday, April 30, 2014 9:58:13 AM UTC-5, Santoash Rajaram wrote: > > I have a cluster singleton that I use with ClusterSingletonProxy and it > works really well. I am trying to find out, if its possible to "reply" to > messages from ClusterSingleton. When I try to reply to messages in the > singleton, the messages always end up in the node where the singleton is > located. I was hoping it would actually send a message back to the actor in > a remote node. when I try to print the actor's path, I don't see the > hostName in it either. Im running both nodes on the same machine (locally > using -Dakka.remote.netty.tcp.hostname=127.0.0.1). When I tried to log > the ${sender.path} from the singleton, I see something like > this: akka://myactorsystem/user/coordinator. I was expecting to see > hostName and port there as well. But I don't see that there. > > Two questions: > > 1) Should I be able to reply to messages from ClusterSingleton? > 2) If not, how can I respond to messages from the singleton? > > > Any pointers here would be greatly appreciated! Thanks! > -- >>>>>>>>>> Read the docs: http://akka.io/docs/ >>>>>>>>>> Check the FAQ: >>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html >>>>>>>>>> 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 akka-user+unsubscr...@googlegroups.com. To post to this group, send email to akka-user@googlegroups.com. Visit this group at http://groups.google.com/group/akka-user. For more options, visit https://groups.google.com/d/optout.