java - 如何处理异步调用和传输信息
问题描述
所以我完全迷失了这个,这可能是显而易见的解决方案,或者我只是在尝试一些不可能的事情,但它就是这样。
我有两个类,一个用作 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
方法中使用响应并返回布尔值。有什么办法可以做到这一点,我应该怎么做?
解决方案
将结果存储在onPluginMessageReceived
ConcurrentHashMap 中,然后在其中查找值,doesReceiverHavePlayers
而不是进行阻塞调用。
像这样的东西:
ConcurrentHashMap<String, Integer> playerCounts = new ConcurrentHashMap<>();
void onPluginMessageReceived() {
playerCounts.put(subChannel, response);
}
boolean doesReceiverHavePlayers() {
return playerCounts.get(queueable.getReceiver()) > 0;
}
推荐阅读
- python - 如何修复 discord.ext.commands.errors.CommandNotFound: Command "image" is not found 错误?
- reactjs - Nextjs - 从 getServerSideProps 获取受保护的请求
- airflow - 在运算符中使用 dag_run.conf
- sqlite - django.db.utils.OperationalError:靠近“DUPLICATE”:语法错误
- python - 将数据从 aws s3 存储桶迁移到 GCS
- mysql - MySQL 归档数据的最佳实践
- javascript - 在订阅表单中打印多次错误
- javascript - Intersection Observer 在生产中的奇怪行为
- python - Python TK 如何检查输入是字符串还是数字?
- python-3.x - 没有这样的模块,即使我已经在 mac 上安装了它