Added more consumer configuration.

This commit is contained in:
Robin Kupper
2011-04-28 12:13:13 +02:00
parent 28b85c07e1
commit 70d8f55f5d
3 changed files with 60 additions and 34 deletions

View File

@@ -13,7 +13,10 @@ public class Config {
public final String url;
public final String user;
public final String password;
public final int delay;
public final int delayBetweenRuns;
public final int minCountPerRun;
public final int maxCountPerRun;
public final int maxTimePerRun;
public final boolean useBukkitScheduler;
public final int keepLogDays;
public final boolean dumpDeletedLog;
@@ -65,8 +68,19 @@ public class Config {
subkeys = config.getKeys("consumer");
if (subkeys == null)
subkeys = new ArrayList<String>();
if (!subkeys.contains("delay"))
config.setProperty("consumer.delay", 6);
if (!subkeys.contains("delayBetweenRuns")) {
if (subkeys.contains("delay")) {
config.setProperty("consumer.delayBetweenRuns", config.getInt("consumer.delay", 6));
config.removeProperty("consumer.delay");
} else
config.setProperty("consumer.delayBetweenRuns", 6);
}
if (!subkeys.contains("minCountPerRun"))
config.setProperty("consumer.minCountPerRun", 100);
if (!subkeys.contains("maxCountPerRun"))
config.setProperty("consumer.maxCountPerRun", 1000);
if (!subkeys.contains("maxTimePerRun"))
config.setProperty("maxTimePerRun", 100);
if (!subkeys.contains("useBukkitScheduler"))
config.setProperty("consumer.useBukkitScheduler", true);
subkeys = config.getKeys("clearlog");
@@ -122,7 +136,10 @@ public class Config {
url = "jdbc:mysql://" + config.getString("mysql.host") + ":" + config.getString("mysql.port") + "/" + config.getString("mysql.database");
user = config.getString("mysql.user");
password = config.getString("mysql.password");
delay = config.getInt("consumer.delay", 6);
delayBetweenRuns = config.getInt("consumer.delayBetweenRuns", 6);
minCountPerRun = config.getInt("consumer.minCountPerRun", 100);
maxCountPerRun = config.getInt("consumer.maxCountPerRun", 1000);
maxTimePerRun = config.getInt("consumer.maxTimePerRun", 100);
useBukkitScheduler = config.getBoolean("consumer.useBukkitScheduler", true);
keepLogDays = config.getInt("clearlog.keepLogDays", -1);
if (keepLogDays*86400000L > System.currentTimeMillis())

View File

@@ -206,42 +206,51 @@ public class Consumer extends TimerTask implements Runnable
return;
Statement state = null;
BlockRow b; KillRow k; String table;
int count = 0;
if (getQueueSize() > 1000)
log.info("[LogBlock Consumer] Queue overloaded. Size: " + getQueueSize());
try {
conn.setAutoCommit(false);
state = conn.createStatement();
final long start = System.currentTimeMillis();
while (count < 1000 && !bqueue.isEmpty() && (System.currentTimeMillis() - start < 100 || count < 100)) {
b = bqueue.poll();
if (b == null)
continue;
table = config.tables.get(b.worldHash);
state.execute("INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) SELECT now(), playerid, " + b.replaced + ", " + b.type + ", " + b.data + ", '" + b.x + "', " + b.y + ", '" + b.z + "' FROM `lb-players` WHERE playername = '" + b.name + "'", Statement.RETURN_GENERATED_KEYS);
if (b.signtext != null) {
final ResultSet keys = state.getGeneratedKeys();
if (keys.next())
state.execute("INSERT INTO `" + table + "-sign` (id, signtext) values (" + keys.getInt(1) + ", '" + b.signtext + "')");
else
log.severe("[LogBlock Consumer] Failed to get generated keys");
} else if (b.ca != null) {
final ResultSet keys = state.getGeneratedKeys();
if (keys.next())
state.execute("INSERT INTO `" + table + "-chest` (id, intype, inamount, outtype, outamount) values (" + keys.getInt(1) + ", " + b.ca.inType + ", " + b.ca.inAmount + ", " + b.ca.outType + ", " + b.ca.outAmount + ")");
else
log.severe("[LogBlock Consumer] Failed to get generated keys");
int count = 0;
if (!bqueue.isEmpty()) {
while (count < config.maxCountPerRun && !bqueue.isEmpty() && (System.currentTimeMillis() - start < config.maxTimePerRun || count < config.minCountPerRun)) {
b = bqueue.poll();
if (b == null)
continue;
table = config.tables.get(b.worldHash);
state.execute("INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) SELECT now(), playerid, " + b.replaced + ", " + b.type + ", " + b.data + ", '" + b.x + "', " + b.y + ", '" + b.z + "' FROM `lb-players` WHERE playername = '" + b.name + "'", Statement.RETURN_GENERATED_KEYS);
if (b.signtext != null) {
final ResultSet keys = state.getGeneratedKeys();
if (keys.next())
state.execute("INSERT INTO `" + table + "-sign` (id, signtext) values (" + keys.getInt(1) + ", '" + b.signtext + "')");
else
log.severe("[LogBlock Consumer] Failed to get generated keys");
} else if (b.ca != null) {
final ResultSet keys = state.getGeneratedKeys();
if (keys.next())
state.execute("INSERT INTO `" + table + "-chest` (id, intype, inamount, outtype, outamount) values (" + keys.getInt(1) + ", " + b.ca.inType + ", " + b.ca.inAmount + ", " + b.ca.outType + ", " + b.ca.outAmount + ")");
else
log.severe("[LogBlock Consumer] Failed to get generated keys");
}
count++;
if (count % 100 == 0)
conn.commit();
}
count++;
conn.commit();
}
conn.commit();
while (!kqueue.isEmpty() && count < 1000 && (System.currentTimeMillis() - start < 100 || count < 100)) {
k = kqueue.poll();
if (k == null)
continue;
state.execute("INSERT INTO `" + config.tables.get(k.worldHash) + "-kills` (date, killer, victim, weapon) SELECT now(), playerid, (SELECT playerid FROM `lb-players` WHERE playername = '" + k.victim + "'), " + k.weapon + " FROM `lb-players` WHERE playername = '" + k.killer + "'");
if (!kqueue.isEmpty()) {
while (count < config.maxCountPerRun && !kqueue.isEmpty() && (System.currentTimeMillis() - start < config.maxTimePerRun || count < config.minCountPerRun)) {
k = kqueue.poll();
if (k == null)
continue;
state.execute("INSERT INTO `" + config.tables.get(k.worldHash) + "-kills` (date, killer, victim, weapon) SELECT now(), playerid, (SELECT playerid FROM `lb-players` WHERE playername = '" + k.victim + "'), " + k.weapon + " FROM `lb-players` WHERE playername = '" + k.killer + "'");
count++;
if (count % 100 == 0)
conn.commit();
}
conn.commit();
}
conn.commit();
} catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock Consumer] SQL exception", ex);
} finally {

View File

@@ -132,16 +132,16 @@ public class LogBlock extends JavaPlugin
if (config.logKills)
pm.registerEvent(Type.ENTITY_DAMAGE, lbEntityListener, Priority.Monitor, this);
if (config.useBukkitScheduler) {
if (getServer().getScheduler().scheduleAsyncRepeatingTask(this, consumer, config.delay * 20, config.delay * 20) > 0)
if (getServer().getScheduler().scheduleAsyncRepeatingTask(this, consumer, config.delayBetweenRuns * 20, config.delayBetweenRuns * 20) > 0)
log.info("[LogBlock] Scheduled consumer with bukkit scheduler.");
else {
log.warning("[LogBlock] Failed to schedule consumer with bukkit scheduler. Now trying schedule with timer.");
timer = new Timer();
timer.scheduleAtFixedRate(consumer, config.delay*1000, config.delay*1000);
timer.scheduleAtFixedRate(consumer, config.delayBetweenRuns * 1000, config.delayBetweenRuns * 1000);
}
} else {
timer = new Timer();
timer.scheduleAtFixedRate(consumer, config.delay*1000, config.delay*1000);
timer.scheduleAtFixedRate(consumer, config.delayBetweenRuns * 1000, config.delayBetweenRuns * 1000);
log.info("[LogBlock] Scheduled consumer with timer.");
}
log.info("Logblock v" + getDescription().getVersion() + " enabled.");