【发布时间】:2018-03-21 08:49:50
【问题描述】:
我有一个由 vertx 创建的 UDP 服务器。
服务器的目的:它监听来自另一个服务的日志,然后根据消息做出以下动作之一:
1) 将消息保存到数据库
2)根据消息中的id从db中删除消息
3)更新数据库中的消息
我的代码是:
@AllArgsConstructor
public final class UdpServerVerticle extends AbstractVerticle {
private final Action action;
@Override
public void start() throws Exception {
final DatagramSocket socket = this.vertx.createDatagramSocket(new DatagramSocketOptions());
socket.listen(9000, "0.0.0.0", asyncRes -> {
if (asyncRes.succeeded()) {
socket.handler(packet -> {
final byte[] bytes = packet.data().getBytes(0, packet.data().length());
final String body = this.body(bytes);
this.action.choose(body);
});
} else {
System.out.println("ERROR");
}
});
}
@SneakyThrows
private String body(final byte[] bytes) {
return new String(bytes, "UTF-8");
}
}
动作类:
public final class DefaultAction implements Action {
private final ServerEvent onConnect;
private final ServerEvent onDisconnect;
private final ServerEvent onMatchBegin;
private final ServerEvent onMatchEnd;
@Autowired
public DefaultAction(@EventQualifier(event = EventTypes.CONNECT)final ServerEvent onConnect,
@EventQualifier(event = EventTypes.DISCONNECT)final ServerEvent onDisconnect,
@EventQualifier(event = EventTypes.MATCH_BEGIN)final ServerEvent onMatchBegin,
@EventQualifier(event = EventTypes.MATCH_END)final ServerEvent onMatchEnd) {
this.onConnect = onConnect;
this.onDisconnect = onDisconnect;
this.onMatchBegin = onMatchBegin;
this.onMatchEnd = onMatchEnd;
}
@Override
public void choose(final String body) {
if (this.diconnect(body)) {
this.onDisconnect.make(body);
} else if (this.connect(body)) {
this.onConnect.make(body);
} else if (this.gameBegin(body)) {
this.onMatchBegin.make(body);
} else if (this.gameOver(body)) {
this.onMatchEnd.make(body);
}
}
我非常了解 vertx(但我需要使用它)我知道 vertx 使用单线程来处理我的所有消息。我想将ServerEvent接口替换为
4个不同的verticles并使用event bus将我的消息传递给适当的verticle,因为阻塞主verticle线程(UDP服务器)不好。在我的情况下进行更换是否明智?
【问题讨论】: