如何处理异步呼叫和传输信息

时间:2020-10-17 15:34:28

标签: java asynchronous bukkit

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

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

处理程序类:

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;
    }
}

每5秒钟调用check方法,doesReceiverHavePlayers向特定服务器请求玩家计数,以查看是否有玩家,但是“响应”到达侦听器类{{ 1}}方法。但是如您所见,我正在尝试在onPluginMessageReceived方法中使用response并返回布尔值。我有什么办法可以做到这一点,我应该怎么做?

1 个答案:

答案 0 :(得分:0)

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

类似这样的东西:

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

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


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