Онлайн проекта Masterjava.
Вместо включения всех модулей в главный аггрегатор, сделал еще 2 аггрегатных модуля 2го уровня:
webиservices
ВНИМАНИЕ! после патча
- проверьте правильность структуры проекта
- сделайте
mvn clean install - удалите пустые корневые каталоги
srcиupload(git не работает с каталогами) - переименуйте модули idea (
Shift+F6), если отличаются от имени модуля Maven
ВНИМАНИЕ! перед накаткой патча создайте в папке web проекта каталог \common-web\src, иначе патч промахивается.
- Thymeleaf: natural templates
- Thread-safe TemplateEngine.process
- Добавил проверку на отсутствие выбранного файла
Вопрос: если в загружаем большой файл, то он придет частями? В этом случае используем
req.getParts()и у каждой части можно получить InputStream. А как все части файла собрать вместе и получить итоговый InputStream, который уже можно передать StAX-процессору?
Part это одно поле формы и на части уже не бъется. В @MultipartConfig можно через аттрибуты задать лимит fileSizeThreshold, когда входящий поток будет сохраняться в файле. Все происходит внизу Multipart API, InputStream из мы получаем также: filePart.getInputStream()
- JAXB creating context and marshallers cost
- Именование private static референсных изменяемых объектов
- Пример для сборки
upload + mail-service + зависимостииз корня проекта:
mvn -pl services\mail-service,web\upload -am install
mvn dependency:tree
mvn project-info-reports:dependencies
mvn project-info-reports:dependency-convergence
mvn clean install
mvn -DincludeScope=runtime dependency:copy-dependencies
java -jar jar-hell.jar .
java -jar jhades-standalone-report.jar path/to/war/webapp.war
mvn dependency:analyze
- Перенес подключение
logback-test.xmlизparent-webвparent(он используется в JUnit тестах, которые могут быть в любом модуле)- Добавил в корень проекта
config_templatesс копией конфигурации. Общие файлы конфигурации заданы в maven parent как в<masterjava.config>/apps/masterjava/config/</masterjava.config>. Нужно у себя в корне диска создать этот каталог и положить в него содержимоеconfig_templates
UPDATE: c Maven 3.3.1 в переменной ${maven.multiModuleProjectDirectory} храниться рутовый каталог многомодульного проекта. Те мы можем создавать config и хранить его прямо в нашем репозитории (вместо config_templates) с путем
<masterjava.config>${maven.multiModuleProjectDirectory}/config/</masterjava.config>
Если в корне проекта сделать каталог .mvn, то эта переменная работает при сборке из зависимых модулей.
- Lightweight JDBC helper library
- Библиотеки для работа с JDBC
- MyBatis, MyBatis tutorial (CRUD)
- Commons DbUtils, доработка commons-dbutils
- jDBI sample
Cохранил конфигурацию Tomcat
context.xml, в котором конфигурируетсяjdbc/masterjava. Ее надо будет положить в ${TOMCAT_HOME}/conf
- Class Loader HOW-TO
- Библиотеки vs Frameworks и Tomcat Common Lib. Memory Leaks.
- Никита Сальников-Тарновский — Утечки памяти
ВНИМАНИЕ! перед накаткой патча создайте в корне проекта каталоги persist\src\main и persist\src\test, иначе патч промахивается.
- Postgresql enum advantages/disadvantages
- ALTER Enum types since 9.1
- Simple EntityMapper with
@Columnsupport
- в модуле upload сохранить всех импортированных пользователей в базе (записи просто добавляются в таблицу
users). Делать вставку группами (chunk) в batch моде. Количестово пользователей в chunk принимать с UI как параметр - сделать отображение первых 20 пользователей в модуле webapp
- добавить в таблицу
usersуникальный индекс наemailи вставлять в базу только новых пользователей. Результат импорта: пользователи, уже присутствующие в базе (POSTGRES: INSERT ON CONFLICT)
-
сделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: email пользователей, уже присутствующие в базе и диапазоны (начальный-конечный email) в чанке, если обработка чанка закончилась с ошибкой (
InterruptedException / ExecutionException) + причина отказа для пользователя/диапазона. -
дополнительный материал:
- 1: при вставке вам помогут JDBI аннотации
@BindBeanи@BatchChunkSize - 2: чтобы при Batch вставке не нагружать базу вызовами
nextvalможно id генерить самостоятельно (используяALTER SEQUENCE). - 3: без
@GetGeneratedKeysрезультатint[]в insertBatch возвращается с тем же размером, что иList<User>. Значение 0 в возвращаемом массиве означает, что запись не вставилась.


