2012-12-14 1 views
0

저는 Java 기반의 Bukkit 플러그인을 사용하고 있습니다 (30 분마다 사용자에게 전달할 업데이트를 웹 API에 쿼리합니다). (이 문제는별로 중요하지 않지만 주목할만한 문제입니다.)한 번에 몇 번 변경되지만 모든 항목이 반복되도록하는 개체 배열을 반복하려면 어떻게해야합니까?

public ApiMessenger() 
{   
    TASK_ID = Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin,new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if(Bukkit.getOnlinePlayers().length > 0) 
      { 
       ApiMessenger.fetchPlayerItems(Bukkit.getOnlinePlayers(),true); 
      } 
     } 
    }, 20*60*30, 20*60*30); 
} 

API가 한 번에, 기껏해야 30 명의 사용자를 받아 들일 것입니다 그러나 다음은

는 API에 모든 사용자를 전달하는 잘 작동 기존의 방법입니다.

따라서 한 번에 30 명 이상의 사용자가있는이 플러그인을 사용하는 서버는 나머지 사용자는 무시되므로 한 번에 모든 사용자를 제출할 수 없습니다.

내가 알아 내려고하는 것은 어떤 종류의 설정으로 타임 스탬프 형식으로 모든 사용자를 저장할 수 있으므로 위의 ApiMessenger 메서드는 어떤 사용자가 전송되었는지 기억하고 가장 먼저 업데이트를 기다리는 사람들.

사용자가 가입/탈퇴 할 때 제거/추가를 관리 할 수 ​​있지만 가장 큰 문제는 먼저 30 명의 사용자 그룹이 전송 될 때 업데이트 할 수있는 정렬 된 데이터 구조를 만드는 것입니다.

오케스트레이션 방식으로 반복 할 수있는 구조를 만드는 데 Java의 데이터 형식을 사용할지 알 수 없습니다.

+5

이것은 매우 모호합니다. 코드를 작성하거나 요구 사항을보다 명확하게 논의해야한다고 생각합니다. "사용자가 마지막으로 쿼리 한 시간"은 아무나 다른 사람에게 아무런 의미가 없습니다. – thatidiotguy

+4

이상적으로, 로그 오프 한 사용자는 로그 오프 할 때 제거해야하며 주기적으로 제거해야합니다. 그러나 귀하의 특정 요구 사항을 모르겠다 ... 목록을 정렬하는 대신 필요할 때 목록을 정렬하는 것이 좋습니다. – jmrodrigg

+0

위의 두 가지 내용에 동의합니다. 이렇게하는 가장 좋은 방법은 일종의 리스너를 사용하여 제거 로그를 실행하고 해당 마스터 목록을 업데이트 한 다음 주기적 폴링을 마스터 목록에 대해 확인하는 것처럼 보입니다. – Charles

답변

1

대기열 사용을 고려 했습니까? 당신은 자바 here에서 그것을 읽을 수 있습니다. 플레이어가 로그온하면 처리 할 플레이어 대기열에 플레이어를 추가하기 만하면됩니다. 그런 다음 목록에서 30 개 항목을 팝하여 처리하십시오. 이러한 사용자를 대기열의 맨 뒤로 밀어 넣을 수 있습니다. 플레이어가 로그 오프하면 대기열에서 제거하거나 대기열 처리시 온라인 상태인지 확인할 수 있습니다. 내가 올바르게 이해하면 문제 해결에 도움이 될 것입니다!

+0

정말 고맙습니다. –

관련 문제