private ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(20);
ScheduledExecutorService - задача прекращает работу
Я бегу задача
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()' делает? – dcsohl
@dcsohl Закрытие утверждений - хорошая идея, это, скорее всего, решение. Но почему задача перестает работать, если я их не закрываю? – Jofkos
Вот почему я спросил, что делает 'this.wrapper.prepare()' ... ... потому что я не уверен на 100%. Мое предположение, основываясь на моих знаниях, заключается в том, что вы подключаете соединения из пула соединений ... открытый оператор является блокировкой этого соединения, и поэтому в определенный момент, когда вы запрашиваете новое соединение, оно просто зависает ... поведение по умолчанию заключается в блокировке до тех пор, пока соединение не будет доступно (что обычно не долго, если нет утечки). – dcsohl