private ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(20);
я выполняю задание
public void run() {
if (queue.isEmpty()) return;
ArrayDeque<Profile> current = new ArrayDeque<Profile>();
this.queue.drainTo(current, 20);
MySQLStatement statement = this.wrapper.prepare();
while (!current.isEmpty()) {
if (statement.isClosed()) return;
Profile profile = current.poll();
statement.addBatch(profile.getId().toString(), ProfileBuilder.toJson(profile));
}
statement.executeBatchAsync();
}
с помощью ScheduledExecutorService
pool.scheduleAtFixedRate(new VerboseRunnable(runnable = new MySQLRunnable(this)), 250, 50, TimeUnit.MILLISECONDS);
MySQLRunnable перестает работать после некоторых запусков с полной очередью, но работает более или менее бесконечно, когда очередь пуста.
Сначала я подумал, что остановки могут быть из-за молча пойманного исключения, поэтому я добавил VerboseRunnable
public void run() {
try {
runnable.run();
} catch (Throwable e) {
System.err.println("Error in runnable!");
e.printStackTrace();
throw new RuntimeException(e);
}
}
Но все равно перестает запускаться. Также ScheduledFuture сообщает мне, что задача не выполнена и не отменена.
Любая помощь будет приятно.
this.wrapper.prepare()
? - person dcsohl   schedule 26.08.2015this.wrapper.prepare()
... потому что я не уверен на 100%. Насколько мне известно, я предполагаю, что вы извлекаете соединения из пула соединений... открытый оператор блокирует это соединение, и поэтому в определенный момент, когда вы запрашиваете новое соединение, оно просто зависает... поведение по умолчанию заключается в блокировке до тех пор, пока соединение не будет доступно (что обычно непродолжительно, если нет утечки). - person dcsohl   schedule 26.08.2015