定期サンプリングとスナップショット
loaded chunk を走査してトップ候補だけを保持し、Web からは再計算済みデータを返す設計です。高速応答の要です。
Lightweight "where is the server heavy" sampler for the WebDataServer.
com.example.rankingplugin.webweb/ServerLagService.javaclassLightweight "where is the server heavy" sampler for the WebDataServer. Design goals: - Keep requests fast (serve precomputed snapshots). - Keep sampling cheap (only scan loaded chunks, top-N selection). - Provide actionable info: hot chunk coordinates, entity/tile counts, and a few top block-entities.
WebDataServer から参照される軽量ラグ解析サービスで、loaded chunk を安価に走査しつつ、原因を人が読める形へ整形して返す役を持っています。小さく見えて設計意図が濃いクラスです。
ServerLagServicerecomputeSyncscoreChunkcomputeChunkDetailsSyncbuildTopSourcesFlathandleLagChunkshandleChunkDetailshandleSourcesrecordCommandloaded chunk を走査してトップ候補だけを保持し、Web からは再計算済みデータを返す設計です。高速応答の要です。
entity 数、tile entity、hopper、spawner、container などを重み付けして「何が重いか」を人向けに見せます。
一覧、詳細、ソース内訳の 3 系統を WebDataServer から叩かれます。API 形式を変えるときはここを見ます。
プレイヤー/サーバコマンドを短時間窓で記録し、ラグ原因候補へ混ぜ込みます。利用者にとって説明可能性の高い部分です。
recomputeSyncscoreChunkbuildTopSourcesFlat毎リクエストで全チャンクを走査せず、周期更新で結果だけ差し替えるのがこのサービスの設計です。
一覧で気になった chunk をさらに掘る流れです。詳細計算だけは都度生成されるため、重くしすぎない工夫が必要です。
recordCommandpurgeOldCmdEventsbuildCommandCountsbuildSourcesItems単に chunk の中身を見るだけでなく、直前コマンドも原因候補へ添えることで運用判断を助けます。
このクラス内で直接見つかる主な Web ルート/項目名です。
| Signature | 説明 | 主要呼び出し |
|---|---|---|
public ServerLagService(JavaPlugin plugin, Gson gson, String serverId) | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 | requireNonNull → getConfig → getInt → getLong → clampInt → clampLong |
| Name | Visibility | Kind | 説明 |
|---|---|---|---|
| ServerLagService | public | コンストラクタ | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 |
| handleLagChunks | public | メソッド | 入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。 |
| handleChunks | public | メソッド | Compat alias: earlier patches called this handler as handleChunks(). |
| handleChunkDetails | public | メソッド | 入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。 |
| handleSources | public | メソッド | 入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。 |
| shutdown | public | メソッド | WebDataServer 停止時に呼ぶ(バックグラウンドスレッド停止)。 |
| recomputeSync | private | メソッド | recomputeSync の主要処理を担当します。 |
| scoreChunk | private | メソッド | scoreChunk の主要処理を担当します。 |
| computeChunkDetailsSync | private | メソッド | computeChunkDetailsSync の主要処理を担当します。 |
| safeEntities | private | メソッド | safeEntities の主要処理を担当します。 |
| safeTileEntities | private | メソッド | safeTileEntities の主要処理を担当します。 |
| onPlayerCommand | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onServerCommand | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| recordCommand | private | メソッド | recordCommand の主要処理を担当します。 |
| purgeOldCmdEvents | private | メソッド | purgeOldCmdEvents の主要処理を担当します。 |
| buildTopSourcesFlat | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| buildCommandCounts | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| buildSourcesPayload | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| buildSourcesItems | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| classifyCommand | private | メソッド | classifyCommand の主要処理を担当します。 |
| parseIntSafe | private | メソッド | 入力テキストや設定値を解析して内部表現へ変換します。 |
| clampInt | private | メソッド | clampInt の主要処理を担当します。 |
| clampLong | private | メソッド | clampLong の主要処理を担当します。 |
| buildTopEntities | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| key | private | メソッド | key の主要処理を担当します。 |
public ServerLagService(JavaPlugin plugin, Gson gson, String serverId)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
JavaPlugin pluginGson gsonString serverIdなし
public String handleLagChunks(Request req, Response res)入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
Request reqResponse resなし
public String handleChunks(Request req, Response res)Compat alias: earlier patches called this handler as handleChunks().
Request reqResponse resなし
public String handleChunkDetails(Request req, Response res)入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
Request reqResponse resなし
public String handleSources(Request req, Response res)入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
Request reqResponse resなし
public void shutdown()WebDataServer 停止時に呼ぶ(バックグラウンドスレッド停止)。
なし
private void recomputeSync()recomputeSync の主要処理を担当します。
なし
private ChunkCandidate scoreChunk(Chunk c)scoreChunk の主要処理を担当します。
Chunk cなし
private ChunkDetailsSnapshot computeChunkDetailsSync(String worldName, int cx, int cz)computeChunkDetailsSync の主要処理を担当します。
String worldNameint cxint czなし
private Entity[] safeEntities(Chunk c)safeEntities の主要処理を担当します。
Chunk cなし
private BlockState[] safeTileEntities(Chunk c)safeTileEntities の主要処理を担当します。
Chunk cなし
public void onPlayerCommand(PlayerCommandPreprocessEvent e)イベント発生時の分岐と後続処理を担当します。
PlayerCommandPreprocessEvent eなし
public void onServerCommand(ServerCommandEvent e)イベント発生時の分岐と後続処理を担当します。
ServerCommandEvent eなし
private void recordCommand(String raw)recordCommand の主要処理を担当します。
String rawなし
private void purgeOldCmdEvents(long now)purgeOldCmdEvents の主要処理を担当します。
long nowなし
private List<Map<String, Object>> buildTopSourcesFlat()表示用または出力用のデータを組み立てます。
なし
private Map<String, Integer> buildCommandCounts()表示用または出力用のデータを組み立てます。
なし
private Map<String, Object> buildSourcesPayload(String updatedAt)表示用または出力用のデータを組み立てます。
String updatedAtなし
private List<Map<String, Object>> buildSourcesItems()表示用または出力用のデータを組み立てます。
なし
private String classifyCommand(String root)classifyCommand の主要処理を担当します。
String rootなし
private static int parseIntSafe(String s, int def)入力テキストや設定値を解析して内部表現へ変換します。
String sint defなし
private static int clampInt(int v, int min, int max)clampInt の主要処理を担当します。
int vint minint maxなし
private static long clampLong(long v, long min, long max)clampLong の主要処理を担当します。
long vlong minlong maxなし
private static List<String> buildTopEntities(ChunkCandidate c)表示用または出力用のデータを組み立てます。
ChunkCandidate cなし
private static String key(String world, int cx, int cz)key の主要処理を担当します。
String worldint cxint czなし
ServerLagService → requireNonNull → getConfig → getInt → getLong → clampIntonPlayerCommand → getMessage → recordCommand → startsWith → substringonServerCommand → getCommand → recordCommandhandleChunkDetails → type → queryParams → parseIntSafe → toJson → formathandleChunks → handleLagChunkshandleLagChunks → type