2017-11-15 1 views
2

Bungee -> Bungee에서 플러그인 메시지를 보내서 정보를 요청하면 BungeeCord/Bukkit 플러그인 메시지 채널을 사용하여 플레이어에 대한 데이터 (특히 어떤 채팅 채널이 있는지)를 확인하려고합니다. 여기 내 문제가 있습니다. (플러그인 메시지의 형태로) BungeeCord 서버의 응답에 대해을 기다린 다음 수신되면 사용하십시오. Bukkit Plugin Messaging

나는 튜토리얼 here을 사용하지만, 플러그인 메시지가 번지 서버에서 받았습니다 때 onPluginMessageReceived 그렇게 notifyAll가 발생하지 않습니다, 발생하지 않기 때문에 서버는 충돌합니다. 여기

는 정보 요청에 대한 코드를입니다 :

public synchronized Object get(Player p, String... data) { 
     sendToBungeeCord(p,"get",data); 

     try { 
      this.wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     return obj.get(p); 
    } 

을 그리고 여기에 플러그인 메시지에 대한 코드를 받았습니다되고있다 :

@Override 
    public synchronized void onPluginMessageReceived(String channel, Player player, byte[] message) { 
     player.sendMessage("return"); 
     if (channel.equals("BungeeCord")) { 
      ByteArrayDataInput in = ByteStreams.newDataInput(message); 
      String action = in.readUTF(); 
      if (action.equals("get")) { 
       String dataType = in.readUTF(); 
       String id = in.readUTF(); 
       if (dataType.equals("channel")) { 
        obj.put(player,id); 
        this.notifyAll(); 
       } 
      } else if (action.equals("test")) { 
       player.sendMessage(in.readUTF()); 
      } 
     } 
    } 

할 수있는 방법이 있다면 wait없이 휴식을 보내고 (응답을 기다리는 동안 플러그인의 나머지 부분을 실행할 수 있습니다.) 제가 어떻게 그것에 대해 이해할 수있게 도와주세요.

답변

0

BungeeCord 응답을 기다리는 동안 주 서버 스레드를 차단해서는 안되며, 대신 다른 작업을 계속하도록해야합니다.

또한 수도꼭지 API 만 주 서버 스레드작동하도록 설계되어 있기 때문에이 통신 채널로 작업 할 때 비동기 아무것도 사용하지합니다. 다른 스레드에서 사용하려고하면 많은 버그/부작용이 서버에 나타날 수 있으며 이로 인해 플레이어 데이터가 손실되거나 특정 상황에서 서버가 손상 될 수도 있습니다. 당신은 당신이 그것을 가지고하지 때 때 BungeeCords는

  • 프로세스 응답의 결과에 대답을 기다리는 동안

    1. 서버를 차단하지 마십시오

      그래서 문제에 대한 솔루션은 다음이 될 것입니다 당신이 요청했습니다.