如何处理异步调用和传输信息



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

我有两个类,一个用作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;
}
}

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

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

类似这样的东西:

ConcurrentHashMap<String, Integer> playerCounts = new ConcurrentHashMap<>();
void onPluginMessageReceived() {
playerCounts.put(subChannel, response);
}

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

最新更新