I was having trouble with initializing an actor system on a remote IP address. I am using akka actors and the play! framework. The code and the remote actor system are both on the remote rackspace servers. When I try to create a remote actor system on the the other server it fails to bind to that IP address. I don't think it is a network or firewall issue because Rackspace says that they opened up all connections between servers. This is the error message I am getting:
[error] application -
! Internal server error, for request [POST /payment/] ->
java.lang.ExceptionInInitializerError: null
at Routes$$anonfun$routes$1$$anonfun$apply$3$$anonfun$apply$4.apply(routes_routing.scala:44) ~[classes/:na]
at Routes$$anonfun$routes$1$$anonfun$apply$3$$anonfun$apply$4.apply(routes_routing.scala:44) ~[classes/:na]
at play.core.Router$HandlerInvoker$$anon$3.call(Router.scala:1080) ~[play_2.9.1-2.0.1.jar:2.0.1]
at play.core.Router$Routes$class.invokeHandler(Router.scala:1255) ~[play_2.9.1-2.0.1.jar:2.0.1]
at Routes$.invokeHandler(routes_routing.scala:14) ~[classes/:na]
at Routes$$anonfun$routes$1$$anonfun$apply$3.apply(routes_routing.scala:44) ~[classes/:na]
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /172.17.100.232:2554
at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:298) ~[netty-3.3.0.Final.jar:na]
at akka.remote.netty.NettyRemoteServer.start(Server.scala:53) ~[akka-remote-2.0.2.jar:2.0.2]
at akka.remote.netty.NettyRemoteTransport.start(NettyRemoteSupport.scala:73) ~[akka-remote-2.0.2.jar:2.0.2]
at akka.remote.RemoteActorRefProvider.init(RemoteActorRefProvider.scala:95) ~[akka-remote-2.0.2.jar:2.0.2]
at akka.actor.ActorSystemImpl._start(ActorSystem.scala:568) ~[akka-actor-2.0.2.jar:2.0.2]
at akka.actor.ActorSystemImpl.start(ActorSystem.scala:575) ~[akka-actor-2.0.2.jar:2.0.2]
Caused by: java.net.BindException: Cannot assign requested address
at sun.nio.ch.Net.bind(Native Method) ~[na:1.6.0_26]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126) ~[na:1.6.0_26]
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59) ~[na:1.6.0_26]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.bind(NioServerSocketPipelineSink.java:140) ~[netty-3.3.0.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleServerSocket(NioServerSocketPipelineSink.java:92) ~[netty-3.3.0.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:66) ~[netty-3.3.0.Final.jar:na]
I am creating the remote actor system here:
object Payment extends Controller {
var goodies: AuthNetActorObject = null
val system = ActorSystem("RemoteCreation", ConfigFactory.load.getConfig("remotecreation"))
val myActor = system.actorOf(Props[authNetActor.AuthNetActorMain], name = "remoteActor")
...
}
Here is where i define remotecreation in my Application.conf file:
remotecreation{ #user defined name for the configuration
include "common"
akka {
actor{
#serializer{
# proto = "akka.serialization.ProtobufSerializer"
# daemon-create = "akka.serialization.DaemonMsgCreateSerializer"
#}
#serialization-bindings{
# "com.google.protobuf.GeneratedMessage" = proto
# "akka.remote.DaemonMsgCreate" = daemon-create
#}
deployment{
/remoteActor{ #Specifically has to be the name of the remote actor
remote="akka://[email protected]:2554"
# router = "round-robin"
# nr-of-instances = 10
# target {
# nodes = ["akka://[email protected]:2554", "akka://[email protected]:2554"]
# }
}
}
}
}
}
Here is my common.conf file that I include in the definition:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
transport = "akka.remote.netty.NettyRemoteTransport"
log-received-messages = on
log-sent-messages = on
log-remote-lifecycle-events = on
netty {
hostname = "172.17.100.232" #Broadcast IP address of remote system
port = 2554
log-received-messages = on
log-sent-messages = on
log-remote-lifecycle-events = on
}
}
}
It probably means that something else is using that port on that machine. Log into that machine and run
netstat -anp | grep 2554
as root and see that port is inLISTEN
status. If so the process ID will be in the last column.