ru.java на livejournal

Январь 27, 2012

 

Вопрос по Spring

Есть например такая структурка

<bean id="A" class="Class1">
  <property name="B">
    <bean id="C" class="Class2">
    </bean>
  </property>
</bean>

Можно ли как-то в C получить ссылку на A не явно, иерархически?

ru.java на livejournal

Январь 26, 2012

 

MyBatis3

Может кто сталкивался, если через аннотации делать, можно ли как то динамически формировать ORDER BY
Что то вроде такого:
@Select("select 1 from dual order by #{order_by}")

Через xml-ки решается просто, но вот интересней было бы через нотации.

Java на habrahabr

Январь 26, 2012

 

JAVA / Multithreading in practice

Нашел как-то на stack overflow вопрос (link).
Need to create java CLI programm that searchs for specific files matched some pattern. Need to use multi-threading approach without using util.concurrent package and to provide good performance on parallel controllers.
Перевод
Нужно написать консольную программу, которая ищет файлы по какому-то паттерну. Программа должна быть многопоточная, но нельзя использовать пакет util.concurrent. Требуется добиться максимальной производительности.


В общем идея в принципе была не сложная. Т.к. по условию нельзя использовать util.concurrent, то надо реализовать свой пул потоков, плюс написать какие-то таски, которые в этом пуле потоков будут крутиться.
Так же я не был уверен в том, что при многопоточном использовании IO будет увеличение производительности.

ru.java на livejournal

Январь 23, 2012

 

Тематическая печатная периодика

Народ, а есть ли достойные печатные издания про/по/о Java, на которые можно оформить подписку?

ru.java на livejournal

Январь 22, 2012

 

Вопрос о JSP

У меня тут достаточно нестандартная ситуация: есть jsp страница, есть открывающий ее пользователь, со всеми своими реквестами и сессиями. Надо сгенерированную страницу не послать в браузер, а сохранить в виде сгенеренного html на сервере. Можно такое сделать какими-нибудь стандартными (или даже нестандартными) методами?

Блог о программировании

Январь 22, 2012

 

Про интерфейс: Map<K,V>

Недавно от товарища пришел вопрос на засыпку: "Почему в интерфейсe java.util.Map метод get в качестве ключа принимает Object, а метод put использует женерики?"

V get(Object key); V put(K key, V value);

Сходу ответить не смог, пришлось разбираться.
Сразу пришло на ум несколько гипотез:

  • раздолбайство
  • легаси-код
  • "так специально задумано"

Не смотря на то, что первые две гипотезы вполне правдоподобны, думаю самый интересный это третий вариант ("так специально задумано"). Если поискать в интернете,то можно найти следующее объяснение.

По "контракту" Map должен работать с ключами по следующему правилу:

key==null ? k==null : key.equals(k)

Легко видеть, что т.к. в при вызове метода key.equals(k) объекты key и k потенциально могут быть абсолютно разных классов, то в итоге мы не имеем право вводить ограничение на тип в сигнатуре метода.

Конечно большинство java-программистов знают, что если нужно переопределить метод equals, то по хорошему надо сделать проверку типа проверяемого объекта, но в жизни всякое случается...

В качестве примера к объяснению, в интернете можно встретить пример на списках.

Суть очень простая. Мы предполагаем, что списки равны тогда, когда равны все их элементы. При этом по большому счету не так уж и важно какой именно это список (ArrayList, LinkedList и т.д.).
В итоге если использовать список в качестве ключа, то возникнет следующая (вполне реальная) ситуация.

Map<LinkedList, Integer> m = new HashMap<LinkedList, Integer>(); LinkedList a = new LinkedList(); a.add("1"); a.add("2"); m.put(a, a.size());   // конечно здесь мы явно создаем ArrayList, // но впринципе нам может вернуться какой-то непонятный список // из какого-то непонятного метода: // например List b = doVeryStrangeMethod(); List b = new ArrayList(a); // Этот вызов метода нормально компилируется и вернет результат: System.out.println(m.get(b)); // А вот этот вызов приведет к ошибке компиляции, т.к. put с generic-ом // m.put(b, b.size());

P.S.: Лично я в жизни не сталкивался с ситуацией, когда нужно было использовать список в качестве ключа.

Java на habrahabr

Январь 22, 2012

 

JAVA / Обработка клиентов сервера на ScheduledThreadPoolExecutor

Ниже я опишу один из возможных вариантов обработки клиентов на сервере с использованием ScheduledThreadPoolExecutor. Примеры включены.

Отличие от конкурентной модели


В отличии от модели работы, где на каждого клиента выделяется личный поток, у ThreadPoolExecutor есть несколько весомых, на мой взгляд преимуществ: вместо одного потока на клиента, используется ровно столько потоков, сколько Вы укажете — меньше висит спящих потоков (по моему опыту, более 95% времени потоки клиентов спят); меньше конкуренция кода; обычно код понятнее и проще.

Я не претендую на правильность реализации или использования ScheduledThreadPoolExecutor, и буду рада, если меня поправят и скажут, что я делаю всё не так, и как надо делать всё на самом деле.

Java на habrahabr

Январь 20, 2012

 

JAVA / [Из песочницы] Из Басры в Рим. Преобразовываем арабские числа в римские

Доброе время суток, Хабраюзер.

Разрабатывая в основном для платформы J2ME, я всегда старался вносить какие то изюминки в свои проекты. Так, однажды, мне понадобилось выделить пункты меню.

Стандартное решение, через тире или пронумеровав их, использовать не очень хотелось, но другие варианты тогда у меня отсутствовали. Обдумывая как бы лучше оформить эти пункты, я случайно наткнулся на свою старую школьную тетрадку по истории, в которой пункты были пронумерованы с использованием римских цифр. Бинго!

Стоит признаться, на то время моих познаний в римских цифрах хватало только для подсчета до второго-третьего десятка. Что вообще то для нумерации пунктов должно было хватить. Но как любой программист, захотелось иметь готовое решение, которое смогло бы переводить любые целые десятичные арабские числа в эквивалентные им римские.

Java на habrahabr

Январь 19, 2012

 

JAVA / JMock и EasyMock: сравнение и howto в примерах и не только

Практически ни для кого не секрет, что при тестировании кода, использующего какие-то внешние компоненты, часто применяют подход mock-объектов. Для тех, кто всё же о нём не знает, кратко поясню: это такие объекты, которые имеют тот же интерфейс, что и используемые компоненты, но их поведение полностью задаётся в тесте, и их использование позволяет избежать поднятия полной инфраструктуры, необходимой приложению для запуска. Что ещё более важно, можно легко и непринуждённо проконтролировать, что код вызывал те или иные методы у mock-объекта с теми или иными аргументами.

В этой статье я проведу сравнительный анализ двух распространённых в Java библиотек для работы с mock'ами: EasyMock и JMock. Для осознания достаточно базового знания JUnit, а после прочтения этой статьи у вас будет весьма хорошее представление о том, как пользоваться обеими этими библиотеками.

Java на habrahabr

Январь 19, 2012

 

JAVA / Hibernate Cache. Практика

Итак, в продолжение предыдущей статьи я попробую на реальных ситуациях рассказать о проблемах, которые возникали у меня при работе в реальных проектах.

Миграционные скрипты

Пожалуй, одной из наиболее частых проблем при работе с кешем в моем приложении является необходимость накатывать миграционные скрипты на работающий сервер. Ведь если эти скрипты запускаются не через фабрику сессий работающего сервера, то кеш этой фабрики никак не узнает об изменениях, которые делаются в базу. Следовательно, получаем проблему несовместимости данных. Для решения этой проблемы есть несколько путей:
  • Рестарт сервера — самый простой и, обычно, самый не приемлемый способ;
  • Очистка кеша через определенные механизмы — пожалуй самый оптимальный по простоте и надежности метод. Этот метод можно вынести, например в JMX, на веб страничку или другой интерфейс и вызывать при необходимости. Гибкость метода в том, что пишется это один раз, а используется сколько угодно и где угодно. В случае, если Ваш провайдер кеша — EHCache и класс провайдер — SingletonEhCacheProvider, то Ваш код может выглядеть так:
    public String dumpKeys() { String regions[] = CacheManager.getInstance().getCacheNames(); StringBuilder allkeys = new StringBuilder(); String newLine = System.getProperty("line.separator"); for (String region : regions) { Ehcache cache = CacheManager.getInstance().getEhcache(region); allkeys.append(toSomeReadableString(cache.getKeys())); allkeys.append(newLine); } return allkeys.toString(); }
    Естественно что этот код должен выполняться в том же процессе что и хибернейт, статистику которого Вы хотите отследить. Подробней можно прочитать тут. Того же можно добиться используя фабрику сессий.
  • Запуск миграционных скриптов, используя фабрику сессий работающего сервера. Это похоже на второй метод, с той лишь разницей, что мы не очищаем кеш, а пропускаем все миграционные скрипты через существующую фабрику. Таким образом все необходимые кеши обновляться сами. Этот метод рационально использовать в случае если кеш большой и дешевле его обновлять нежели создавать по новой;

  •  
    << < 1 из 76 > >>