english | блог | контакт
Wed, 20 Nov 2013 @ 13:25

Spring, Lifecycle, destroy-методы

java spring

Сегодня обнаружили великолепный нюанс: если в spring ApplicationContext не закрывать контекст руками и при этом не зарегистрировать shutdown hook (registerShutdownHook), то он, очевидно, не закроется и все Lifecycle бины, естественно, не будут остановлены, destroy-методы не будут вызваны.
Кстати, в destroy-методах логгирование через slf4j, log4j и прочие логгеры не работает - они скорее всего уже успели закрыться в своих shutdown-хуках.

Thu, 16 May 2013 @ 16:40

Date object reuse vs new instance creation

java premature optimization

Вкратце:
new Date(...) работает практически в 2 раза быстрее, чем reusableDateObject.setTime(...) при условии, что объект никуда не уходит из метода (jdk1.7.0_17, core i5-2430m, 1g heap, pargc).
Но картина резко меняется, если хранить объект между вызовами метода.
читать дальше

Thu, 23 Aug 2012 @ 14:43

Lucene 3.6, AttributeSource.getAttributeImplsIterator()

java lucene

Наступил случайно на то, что AttributeSource.getAttributeImplsIterator() не thread-safe. Суть можно выразить следующим образом:

thread1 {
  save1 = AttributeSource.getAttributeImplsIterator
  // что вызывает getCurrentState() и ждёт пока итератор не будет подготовлен
}
thread2 {
  save2 = AttributeSource.getAttributeImplsIterator
  // getCurrentState() возвращает ссылку currentState[0],
  // в которой может содержаться не до конца сформированный список для итератора,
  // где некоторые State могут даже содержать attribute == null
}

Sun, 24 Jun 2012 @ 14:38

Итерация по массиву против списка

java performance

Сравнил производительность итерирования по массиву против ArrayList-а. 8-кратное превосходство в скорости в некоторых задачах решает.
читать дальше

Wed, 20 Jul 2011 @ 09:42

Фильтрация Map-ов

collections java

При невнимательном чтении документации, можно, как это сделал я, наступить на грабли с вариантом:

org.apache.commons.collections.
   MapUtils.transformedMap(originalMap, keyTransformer, valueTransformer)

К сожалению он декорирует только добавление новых элементов. А старые остаются "как есть". Конечно, можно прогнать через трансформацию все старые значения (например, через putAll), но можно полениться и использовать Google collections, которые делают именно то, что от них ожидается:
com.google.common.collect.Maps.filterKeys(originalMap, keyPredicate)
com.google.common.collect.Maps.filterValues(originalMap, valuePredicate)
com.google.common.collect.Maps.filterEntries(originalMap, entryPredicate)

Wed, 11 May 2011 @ 15:33

Ещё один способ конфигурирования контекста в Spring 3.0

java spring

Случайно наткнулся. В spring 3.0 появилась такая штука как AnnotationConfigApplicationContext и AnnotationConfigWebApplicationContext. В соответствии с названиями позволяют конфигурировать контекст не в виде XML-файла, а с помощью аннотаций и методов класса, возвращающих готовые бины.

IntelliJ IDEA в версии 10.0.3 их пока не понимает (навигация между бинами отсутствует), зато пользователи сред не понимающих XML-конфигурацию, наверное, наслаждаются валидацией на уровне java-синтаксиса.

документация на офсайте

Thu, 28 Oct 2010 @ 16:12

ThreadPoolExecutor и очередь задач

concurrency java

"Совершенно случайно" наткнулся и поправил очень старый баг в приложении. Содержание можно выразить следующими строчками:

void submitTask(ThreadPoolExecutor executorService, Runnable task) {
  executorService.submit(task);
}
boolean checkTaskInQueue(ThreadPoolExecutor executorService, Runnable task) {
  // а вот тут - баг:
  return executorService.getQueue().contains(task);
}

Не зная, ни за что не заподозрил бы сие строки. Ан нет, авторы даже в javadoc предостерегают от обращений к ThreadPoolExecutor.getQueue(), т.к. он хранит не засабмиченные объекты, а обёртки со ссылками на них.

Mon, 30 Aug 2010 @ 14:24

Inner-классы и фабрики

java

Мне нравится использовать double-brace инициализацию: это удобно и быстро.

Сегодня, после очередной умной книжки, задумался. И в голову пришёл относительно синтетический, но возможный пример:

  • имеем некий DAO, который вызывает некий Callback
  • callback сохраняет в себе Connection (для удобства, например) и возвращает результат работы как список Map-ов
  • map-ы инстанциируются как inner-классы

  • В результате имеем потенциальную утечку соединений на время жизни результатов запроса.

    Ниже "проверочный код".
    читать дальше

    Sun, 01 Aug 2010 @ 08:22

    Реализации SSH-протокола

    java

    Чуть больше года назад (когда я ещё вспахивал на ниве PHP) я писал таск для ANT, который ходил по SSH на удалённый сервер и производил там некоторые действия.

    В то время я использовал jSch.

    Сегодня, немного погуглив, обнаружил проект Ganymed SSH-2 for Java. В прошлом году проект был скорее мёртв, чем жив (последнее обновление в 2006 году), однако в этом году автор вернулся.

    Оба проекта распространяются под BSD-подобной лицензией. Работают с протоколом SSH2, поддерживают авторизацию по ключу, исполнение команд, передачу файлов (джентльменский набор) и многое другое.

    Первый проект отличается живостью, однако, у автора есть плохой девиз "лучшая документация - исходный код".

    Второй проект отлично документирован (особенно на фоне первого), но активность пока оставляет желать лучшего.

    Не смотря на то, что я тоже знаю о самодокументируемом коде, примеры такого кода я видел только в книгах и их (примеров) объёмы были далеки от 100кб+. На сегодня мой выбор - Ganymed SSH-2.

    Thu, 29 Jul 2010 @ 15:42

    Вариант реализации задержки

    java не делай так

    Я думал, таких шедевров в природе не существует, но вот он:

    public String waiter(){
    /*применяется специально для claim.card
     при выборке данных из веб страницы
    (поток выборки данных опережает поток записи этих данных
     на веб интерфейс)*/
               
        Date d = new Date();
        String s="zero";
        int g=0;
        for (int u=0;u<10000;u++){
            for(int t=0;t<9999;t++){
                    g++;
            }
        }
        logProductivity(d, "waiter");
        return s;
    }
    

    Страницы: 1 2 3 4