вторник, 19 мая 2015 г.

DBUnit и PostgreSQL ENUM

Проблема 

В dataset.xml нельзя задать поля со своими типами данных, а именно перечислениями, при использовании стандартных настроек DBUnit.

Изначально при запуске тестов примерно таким способом
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-datasource.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
  DirtiesContextTestExecutionListener.class,
  DbUnitTestExecutionListener.class })
public abstract class AbstractDaoTest {


Мы будем получать сообщение о неизвестном типе

tablename.SIGN -  (Non-uppercase input column: sign) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.
Проблему вызывает колонка sign в таблице tablename тип данных которой задан как
CREATE TYPE ASTRO_SIGNS AS ENUM ('GENERAL', 'ARIES', 'TAURUS', 'GEMINI', 'CANCER', 'LEO', 'VIRGO', 'LIBRA', 'SCORPIO', 'SAGITTARIUS', 'CAPRICORN', 'AQUARIUS', 'PISCES');

Решение 

Junit

Для того чтобы  DBUnit начал понимать перечисления ему достаточно включить правильную DataTypeFactory. Для запуска тестов у нас используется конфигурация classpath:test-datasource.xml, в ней мы и настроим фабрику типов.

суббота, 21 февраля 2015 г.

Spring-Loaded в качестве альтернативы JRebel: Deploy "на лету"

Для чего?

Многие Java разработчики знают о JRebel и его ценнике в 365 мёртвых президентов в год за одно рабочее место. За эту немалую сумму мы получим решение старой проблемы экосистемы Enterprise Java: после любых изменений проект приходится пересобирать и разворачивать в контейнере. Eclipse частично решает эту проблему, компилируя и копируя в каталог /webapp/ только измененный классы, чем экономит время на сборку, но далее все равно приходится дожидаться повторного развертывания приложения (опция autodeploy у Tomcat), а это занимает в лучшем случае от 20 секунд. 

Что делает JRebel ? - При каждом обращении к классу проверяется наличие изменений в рабочем каталоге, если есть новый скомпилированный класс он загружается и используется вместо предыдущего с таким же именем. 

Что делает Spring Loaded? - Проверяет наличие изменений в используемых .class файлах каждую секунду, при их наличии загружает новый класс, преобразует все экземпляры класса к новому типу. Помимо незначительных изменений в методах, вы сможете удалять/добавлять/изменять методы, поля классов и конструкторы, добавлять и удалять значения в перечислениях.


Как это использовать?

Spring Loaded может работать с любым байткодом, вся теория использования сводится к одному примеру
Listing 1: Пример использования 
$ java -javaagent:/springloaded.jar -noverify SomeJavaClass

В качестве java agent’a мы используем дистрибутив Spring Loaded, noverify отключает проверку фалов .class, это поможет избежать задержек загрузки измененных классов, проверка локальных, скомпилированных стабильным компилятором, файлов лишена смысла.

На практике все не намного сложнее: наша цель - использование Spring Loaded при запуске приложений в контейнере Tomcat из Eclipse. 
Выбираем нужный сервер и двойным кликом открываем его конфигурацию 
Нам нужно добавить параметры запуска JVM, для этого выбираем Open launch configuration  
и дописываем к аргументами виртуальной машины параметры из первого примера (Листинг 1). 

При текущих настройках Eclipse инициализирует перезапуск приложения в контейнере после изменений в файлах проекта. Мы же собираемся подгружать изменения классов без перезапуска, поэтому отключим автоматический redeploy в Eclipse: на вкладке Modules выбираем нужное приложение и жмем Edit, отключаем опцию Auto reloading.
При желании можно подкрутить настройки публикации изменений (то есть копирования измененных файлов из проекта в рабочий каталог контейнера)





Результаты

Теперь попробуем изменить value у анотации @RequestMapping в любом контроллере и сохранить изменения в файле. В результате происходит загрузка измененного класса и обновление RequestMappingHandlerMapping новыми URL без переинициализации приложения. Демонстрировать изменения в методах смысла нет - это тривиальная задача по сравнению с переконфигурированием RequestMapping.


 Примечания

  • Текущая реализация не позволяет изменять без перезапуска иерархию наследования классов.
  • При использовании Reflection вы дожны самостоятельно следить за получением новых экземпляров.
  • Вы можете создать реализацию интерфейса ReloadEventProcessorPlugin и зарегистрировать его в SpringLoadedPreProcessor.registerGlobalPlugin(plugin), что бы отслеживать события изменений

пятница, 21 ноября 2014 г.

Свой Maven репозиторий

Предположим нам нужно обзавестись собственным Maven репозиторием для своих библиотек. Простейшим вариантом было бы установить Sonatype Nexus, но он достаточно требователен к ресурсам железа. 
Альтернативным вариантом может стать использование git и BitBucket  в качестве хостинга.

Будем использовать плагин http://synergian.github.io/wagon-git/index.html

понедельник, 3 ноября 2014 г.

Удобный деплой в OpenShift из Jenkins

Задача: 

Автоматизировать развертывание приложения на тестовом сервере, в данном случае OpenShift Tomcat 7 Gear.



В подходе используемом в OpenShift по умолчанию приложения заливаются на сервер путем push'a в репозитой, далее срабатывает hook на restart приложения. При использовании сервера непрерывной интеграции Jenkins этот метод совсем не удобен: во первых придется очень много скриптовать, а во вторых, мы не сможет получить результат развертывания (конечно можно парсить лог, но это как-то не комильфо).

Хочется использовать плагины Jenkins и деплоить war, получать результат развертывания, если  приложение зафейлилось при старте считать сборку нестабильной.

Внимание. Этот подход хорошо работает только на не масштабируемых приложениях, так как HAProxy будет считать инстанс не рабочим и не пустит в tomcat manager если в корневой контекст ничего не задеплоено. А при копировании gear'a openshift будет копировать заглушку а не ваше приложение.  

Как же это сделать?

четверг, 11 апреля 2013 г.

Общий интернет с кпк на Linux

Если вы в дали от wi-fi, вам грустно и одиноко, а у вас в кармане есть старенький кпк с Windows Mobile, три простые команды помогут вам соединить свою Llinux машину со всемирной сетью.



На кпк выбираем общий интернет по USB, нажимаем подключится и подключаем проводом к компьютеру.




среда, 10 апреля 2013 г.

Ручной выбор Master Browser в сетях Windows

Это еретический пост. В нем будет рассмотрена популярная проблема в Windows сетях: компьютеры не видят друг друга, хотя находятся в одной рабочей группе.
Для того что бы это починить достаточно на одном из постоянно включенных компьютеров в реестре установить значение




HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser\Parameters
"MaintainServerList"="Yes"
"IsDomainMaster"="True"
перезагрузить компьютер и перезапустить сеть.


А теперь как это работает?


четверг, 14 марта 2013 г.

Bitcoin с чего начать

Почему Bitcoin это круто?

  • биткоином никто не управляет
  • вас не найдут
  • все сделки проводятся публично
  • эмиссия ограничена алгоритмически
  • платежная  система в целом - шедевр, которым можно любоваться

Почему вам не стоит этим пользоваться?

  • вам не вернут деньги, потерянные по вашей оплошности
  • биткоины совсем не нравятся вашей налоговой инспекции
  • официальный клиент очень прожорлив и перегрузит IO вашего слабого компьютера при старте