【问题标题】:Multiple vertx instances vs action in the same veticle多个顶点实例与同一个 veicle 中的动作
【发布时间】: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服务器)不好。在我的情况下进行更换是否明智?

【问题讨论】:

    标签: java vert.x


    【解决方案1】:

    您误解了 VertX 的工作原理。它是多线程的,但具有线程亲和性,这与单线程不同。

    根据您的建议,这就是要走的路。将你的每一个动作放入一个单独的 Verticle 中,并使用 EventBus 与它们进行通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多