SimpleDateFormat#format
принимает параметр Date
в качестве параметра. Вы можете получить Date
из Calendar
, вызвав его метод getTime
:
public static String format(GregorianCalendar calendar){
SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
fmt.setCalendar(calendar);
String dateFormatted = fmt.format(calendar.getTime());
return dateFormatted;
}
Также обратите внимание, что месяцы начинаются с 0, поэтому вы, вероятно, имели в виду:
int month = Integer.parseInt(splitDate[1]) - 1;
Закопать и узнать? Прикрепите отладчик на того ублюдка!
Я вижу, по крайней мере, следующие возможности:
И возможно, но почти наверняка не, следующее:
Но в любом случае, присоединение отладчика покажет Вам, является ли поток все еще там и зависло ли это действительно.
Мы помещаем Поток. Сон в после пару раз, когда база данных ушла и мы возвратились к файлам журналов на 3 ГБ, полным ошибок соединения с базой данных.
Я думал бы, что более оптимальный вариант будет состоять в том, чтобы сделать его так, чтобы Ваша система регистрации захватила дубликаты, так, чтобы это могло записать что-то как, "Предыдущее сообщение было повторено времена N".
Предположите, что я написал стандартную записку о том, как необходимо открыть соединение в прошлый момент и закрыть его при первой возможности, вместо того, чтобы охватить потенциально огромную функцию в способе, которым Вы сделали его (но возможно который является артефактом Вашего демонстративного кода, и Ваше приложение на самом деле записано правильно).
Когда Вы говорите, что это сообщает об ошибке, которую Вы описываете, Вы подразумеваете, что этот обработчик сообщает об ошибке? Причина это не ясно мне, состоит в том, что во фрагменте кода Вы говорите, что "Что-то пошло не так, как надо", но Вы не сказали это в своем описании; я не хотел бы, чтобы это было чем-то столь глупым, как исключение поймано где-то в другом месте, и код застревает где-нибудь кроме сна.
Вы попытались использовать Монитор. Импульс (гарантируют Ваш поток, использует управление потоком прежде, чем выполнить это) заставить поток делать что-то? Если это работает, то Вы оказываетесь перед необходимостью немного больше изучать свою логику поточной обработки.
Из кода Вы отправили, не ясно, что после того, как исключение выдается, система определенно может перезапустить - например, если исключение прибудет из doStuff (), то поток управления будет пасовать назад (после 10-минутного ожидания) к openConnection (), никогда не проходя closeConnection ().
Но поскольку другие сказали, просто присоединяют отладчик и находят, где это на самом деле.
Я никогда полностью выяснил то, что продолжалось, но это, казалось, было связано с ThreadInterruptedExceptions, бросаемым во время 10-минутного сна, таким образом, я изменился на код к:
private void ThreadWorkerFunction()
{
DateTime? timeout = null;
while (!_stop)
{
try
{
if (timeout == null || timeout < DateTime.Now)
{
openDatabaseConnections();
doStuff();
closeDatabaseConnections();
}
else
{
Thread.Sleep(1000);
}
}
catch (ThreadInterruptedException tiex)
{
log.Error("The worker thread was interrupted... ignoring.", tiex);
}
catch (Exception ex)
{
log.Error("Something went wrong.", ex);
timeout = DateTime.Now + TimeSpan.FromMinutes(10);
}
}
}
Кроме специфической ловли ThreadInterruptedException, это просто чувствует себя более безопасным, поскольку весь сон происходит в блоке попытки, таким образом, что-либо неожиданное, которое происходит, будет зарегистрировано. Я обновлю этот ответ, если я когда-нибудь узнаю больше.
Споткнувшийся на этом при поиске Потока. Моя собственная проблема сна. Это может или не может быть связано, но если Ваш doSomething () выдаст исключение, то closeDatabaseConnections () не произойдет, который имеет некоторый потенциал для утечек ресурсов.. Я вставил это наконец блок. Просто что-то для размышления о.
У меня была точно такая же проблема. Перемещение строки сна за пределы обработчика исключений устранило для меня проблему, например:
bool hadError = false;
try {
...
} catch (...) {
hadError = true;
}
if (hadError)
Thread.Sleep(...);
Прерывание потоков, похоже, не работает в контексте обработчика исключений.