+74
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
@Name("solr")
@AutoCreate
public class SolrClient {
@Create
public void init() {
try {
server = startRemoteSolr();
} catch (Exception e) {
log.error(e, e);
}
}
public SolrServer startRemoteSolr() throws MalformedURLException, SolrServerException {
CommonsHttpSolrServer solr = new CommonsHttpSolrServer("http://localhost:8983/solr");
solr.setRequestWriter(new BinaryRequestWriter());
return solr;
}
}
Seam. Перевод для непричастного: на старте сайта вызывается метод startRemoteSolr(). Solr - это поисковый движок. Если он не запустится, на сайте не будет работать поиск. И если на запуске Solr будет ошибка, то в лог она попадёт просто как exception + stack trace.
Что не так в коде? Очевидно, его писали люди, не задумываясь об эксплуатации, что свойственно новичкам. А ведь устранение проблем в рабочем сайте - это приоритет номер один. Сама разработка сайта, сидя в удобном кресле с кашкой кофе - где-то сильно ниже.
Так вот, что не так?
1. При выводе ошибок надо писать - что это за ошибка. В данном случае: "Запуск поисковика неудался, ПОИСК НА САЙТЕ РАБОТАТЬ НЕ БУДЕТ." И уже потом - stack trace.
2. Если некая ошибка связана с ресурсами - сетевыми, или на файловой системе, в логе надо также описывать этот ресурс. Т.е. "Не удалось запустить клиент поисковика по адресу http://localhost:8983/solr". Что бы из логов сразу было видно, что порт указан правильно или нет, хост и тд.
Но выпускникам ВМК МГУ такие вещи неведомы, они слишком крутые что бы опускаться до таких мелочей. Чайники, хуле.
Запостил:
yvu,
12 Января 2011
должно падать туда, куда логгер сказал. может быть в лог-файл, в консоль, куда угодно
(видел даже случай особого извращения, когда логи пихались в БД. Вот весело было, когда соединение с базой не удавалось, получалась неочевидная рекурсия)
Надо а) в файл и б) настроить для файла ограничение по размеру через какой-нибудь roller.
Но это - производственная неизбежность, подстраховка. В трезвом уме сознательно писать в stdout/stderr не нужно.
UPD: хотя, оно может от реализации шелла зависеть.
Сервер запускается либо на старте ОС, либо скриптом, выкладывающем новую версию, либо просто скриптом, который, например, перезапускает все ноды. Их, допустим, 20. Запускаются они автоматически - скрипт заходит на каждую систему, выполняет там старт, и отваливается.