首页 > 解决方案 > 如何处理异步调用和传输信息

问题描述

所以我完全迷失了这个,这可能是显而易见的解决方案,或者我只是在尝试一些不可能的事情,但它就是这样。

我有两个类,一个用作 e listener 类,第二个是处理队列的类(我将只包含相关代码)。

处理程序类:

public void check() {
    for (Queueable queueable : queue) {
        if (!doesReceiverHavePlayers(queueable)) continue;
 
    }
}

private boolean doesReceiverHavePlayers(Queueable queueable) {
    ByteArrayDataOutput out = ByteStreams.newDataOutput();
    out.writeUTF("PlayerCount");
    out.writeUTF(queueable.getReceiver());

    Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
    player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
       
    return /*response*/ > 0;   
}

监听类:

@Override
public void onPluginMessageReceived(String channel, @NotNull Player player, byte[] message) {
    if (!channel.equals("BungeeCord")) return;
    ByteArrayDataInput in = ByteStreams.newDataInput(message);
    String subChannel = in.readUTF();

    switch (subChannel) {
        case "PlayerCount":
            int response = in.readInt();

            break;
    }
}

check方法每 5 秒调用一次,并doesReceiverHavePlayers从某个服务器请求玩家计数以查看其上是否有玩家,但“响应”到达侦听器类onPluginMessageReceived方法。但正如您所看到的,我试图在doesReceiverHavePlayers方法中使用响应并返回布尔值。有什么办法可以做到这一点,我应该怎么做?

标签: javaasynchronousbukkit

解决方案


将结果存储在onPluginMessageReceivedConcurrentHashMap 中,然后在其中查找值,doesReceiverHavePlayers而不是进行阻塞调用。

像这样的东西:

ConcurrentHashMap<String, Integer> playerCounts = new ConcurrentHashMap<>();

void onPluginMessageReceived() {
    playerCounts.put(subChannel, response);
}


boolean doesReceiverHavePlayers() {
    return playerCounts.get(queueable.getReceiver()) > 0;
}


推荐阅读