我正在使用新的Akka IO并遵循此tutorial(这是一个简单的服务器 - 客户端应用程序)。我的服务器actor系统代码如下所示:
// create the sever system
ActorSystem tcpServerSystem = ActorSystem.create("tcp-server-system");
// create the tcp actor
final ActorRef tcpServer = Tcp.get(tcpServerSystem).manager();
// create the server actor;
ActorRef serverActor = tcpServerSystem.actorOf(new Props(ServerActor.class).withRouter(new RoundRobinRouter(5)), "server");
// tell the tcp server to use an actor for listen connection on;
final List<Inet.SocketOption> options = new ArrayList<Inet.SocketOption>();
options.add(TcpSO.reuseAddress(true));
tcpServer.tell(TcpMessage.bind(serverActor, new InetSocketAddress("127.0.0.1", 12345), 10, options),
serverActor);
ServerActor 类它只是一个普通的演员,在 onReceive 上执行以下操作:
logger.info("Received: " + o);
if (o instanceof Tcp.Connected){
connectionActor = getSender();
connectionActor.tell(TcpMessage.register(getSelf()), getSelf());
ByteStringBuilder byteStringBuilder = new ByteStringBuilder();
byteStringBuilder.putBytes("Hello Worlds".getBytes());
connectionActor.tell(TcpMessage.write(byteStringBuilder.result()), getSelf());
}
我正在尝试使用netcat测试服务器actor并且具有这种“奇怪”行为:只有连接到服务器的第一个客户端才接收从服务器发送的消息。 nexts客户端可以连接到服务器但不接收消息。同样在调试模式下,服务器角色没有获得 Tcp.Connected 消息(第一个连接的客户端除外),因此注册消息无法发送到客户端,尽管下一个客户端可以连接
答案 0 :(得分:1)
这是2.2-M1里程碑中的一个已知问题,其中问题是TcpListener没有在选择器上注册AcceptInterest,除非它到达配置的BatchAcceptLimit,导致它没有被通知新的接受,如果那里只有一些未决的连接。
它已被修复,将成为下一个里程碑版本的一部分。