Feb. 9th, 2012
база данных имени Кота Шрёдингера
Feb. 9th, 2012 11:32 amУже несколько дней разбираюсь, какого хера наши селф-тесты не всегда проходят. Доковырялся до факта, что если в базу записать прямо локально в коде, а потом локально же прочитать, всё отлично, а если же читать не локально, а через запрос по rabbitMQ (а читаем потом, в моём конкретном случае, в том же сервере и в том же потоке (или нитке?), то записи находит через раз. А если и писать "через запрос", то и записывает в лучшем случае раз из 10. При этом все запросы приходят (у меня все логи записаны).
Теперь, исключительно истины ради, написал класс Health, в котором метод check(String checkName), который вызывает нужный чек. В чеке, разумеется, всё то же чтение той же базы. Как только агента, которому посылаем запрос, заставил выполнять чек перед собственно работой (то же самое чтение) - все тесты проходят. Стописцот раз. А убрать чек - и не проходят.
Для смеху добавлю - база postgres, если это что-то вообще значит.
Не думаю, что мне нужны советы по работе с хибернейтом, но если кто-то просветлён или вдруг постигло озарение, то было бы нехило.
П.С. Ещё обнаружил, что когда убираю задержки в тесте, между куском, который пишет и куском, который читает, то всё "хорошо". Дорогая редакция!!!
П.П.С. Дык небось драйвер-то опять находит какой-нибудь альтернативный "localhost", с ним и беседует вместо моей машинки. И все дела.
(В порядке психологической компенсации, я, кажется, понял, почему хаскель должен быть булев - берём топос, в нём топологию двойного отрицания, и если двойное отрицание оказывается монадой, то топос булев; и я могу доказать, что если всякая монада аппликативна, то двойное отрицание будет монадой. Примерно так.)
Теперь, исключительно истины ради, написал класс Health, в котором метод check(String checkName), который вызывает нужный чек. В чеке, разумеется, всё то же чтение той же базы. Как только агента, которому посылаем запрос, заставил выполнять чек перед собственно работой (то же самое чтение) - все тесты проходят. Стописцот раз. А убрать чек - и не проходят.
Для смеху добавлю - база postgres, если это что-то вообще значит.
Не думаю, что мне нужны советы по работе с хибернейтом, но если кто-то просветлён или вдруг постигло озарение, то было бы нехило.
П.С. Ещё обнаружил, что когда убираю задержки в тесте, между куском, который пишет и куском, который читает, то всё "хорошо". Дорогая редакция!!!
П.П.С. Дык небось драйвер-то опять находит какой-нибудь альтернативный "localhost", с ним и беседует вместо моей машинки. И все дела.
(В порядке психологической компенсации, я, кажется, понял, почему хаскель должен быть булев - берём топос, в нём топологию двойного отрицания, и если двойное отрицание оказывается монадой, то топос булев; и я могу доказать, что если всякая монада аппликативна, то двойное отрицание будет монадой. Примерно так.)
public class Health { private static Map<String, Runnable> todos = new ConcurrentHashMap<String, Runnable>(); public static void addChecker(String name, Runnable todo) { todos.put(name, todo); } public static void removeChecker(String name) { todos.remove(name); } public static void run(String name) { Runnable todo = todos.get(name); if (todo != null) todo.run(); } public static void check(String name) { try { run("name"); Log.debug("Health check '%s' passed.", name); } catch (RuntimeException re) { Log.error("Health check '%s' failed.", name, re); } } }