From 0255b8da674e98fbc60ea38c77d83595754e5cf7 Mon Sep 17 00:00:00 2001 From: gkislin Date: Mon, 16 Oct 2017 23:58:15 +0300 Subject: [PATCH 001/126] Add lesson01 --- doc/lesson01.md | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 doc/lesson01.md diff --git a/doc/lesson01.md b/doc/lesson01.md new file mode 100644 index 0000000..52cee43 --- /dev/null +++ b/doc/lesson01.md @@ -0,0 +1,79 @@ +# Первое занятие: многопоточность. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Вступление. Многопоточность и параллельность. +![Concurrent vs Parallel](https://joearms.github.io/images/con_and_par.jpg) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Структура памяти Java. Ленивая инициализация. +> В видео в `LazySingleton` ошибка: должно быть как в коде проекта `instance == null` + +### Структура памяти: куча, стек, permanent/metaspace + - JVM изнутри - оптимизация и профилирование. + - Stack and Heap + - Дополнительно: + - Из каких частей состоит память java процесса. + - Permanent область памяти + - Java thread stack + - Размер Java объектов + +### Ленивая инициализация +- Реализация Singleton в JAVA +- Double checked locking +- Initialization-on-demand holder idiom +- Подводные камни Singleton + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Реализация многопоточности в Java +- Параллелизм в Java +- Монитор (синхронизация) +- Compare-and-swap +- Java Memory Model +- Синхронизация потоков +- Обзор java.util.concurrent.* +- Как работает ConcurrentHashMap +- Справочник по синхронизаторам java.util.concurrent.* +- Использование ThreadLocal переменных +- Николай Алименков — Прикладная многопоточность +- Can thread switching happen in the synchronized block? + +#### Tproger: Многопоточное программирование в Java 8 +- 1. Параллельное выполнение кода с помощью потоков +- 2. Синхронизация доступа к изменяемым объектам +- 3. Атомарные переменные и конкурентные таблицы + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Реализация многопоточной отправки писем. Execution Framework +> правка к видео: `22: completionService.submit(..)` + +### ![](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Все изменения в проекте будут делаться на основе патчей +#### Скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... + +---------------------------- + +### Ресурсы (основы) +- Intuit, Потоки выполнения. Синхронизация +- Алексей Владыкин, Основы многопоточность в Java +- Виталий Чибриков, Java. Многопоточность +- Computer Science Center, курс Параллельное программирование +- Юрий Ткач, курс Advanced Java - Concurrency +- Головач, курс Java Multithreading + +--- +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Задание первого занятия + +Вычекать этот проект: +```git clone https://github.com/JavaOPs/masterjava.git``` + +- Применить оптимизацию к MatrixUtil.singleThreadMultiply +- Реализовать метод `MatrixUtil.concurrentMultiply`, позволяющий многопоточно перемножать квадратные матрицы N*N. +- Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`. +- Добиться того, чтобы на матрице 1000*1000 многопоточная реализация была быстрее однопоточной + +----- +## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW1 +- не делайте 1000 000 тасок, лучше их сделать крупнее +- у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно +- наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply3`). Мои результаты: +``` +Benchmark (matrixSize) Mode Cnt Score Error Units +MatrixBenchmark.singleThreadMultiplyOpt 1000 ss 100 837,867 ± 25,530 ms/op +MatrixBenchmark.concurrentMultiply2 1000 ss 100 394,294 ± 21,657 ms/op +MatrixBenchmark.concurrentMultiply3 1000 ss 100 186,827 ± 11,882 ms/op +``` \ No newline at end of file From 1d16bd4099b4dd5f45503e16598793152b879d0d Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 17 Oct 2017 00:03:04 +0300 Subject: [PATCH 002/126] Update lesson01 --- doc/lesson01.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lesson01.md b/doc/lesson01.md index 52cee43..9a969df 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -1,5 +1,10 @@ # Первое занятие: многопоточность. +- **Не стоит стремится прочитать все ссылки урока, их можно использовать как справочник. Гораздо важнее пройти основной материал урока и сделать Домашнее Задание** +- **Обязательно посмотри правила работы с патчами на проекте** +- **Делать Apply Patch лучше по одному, непосредственно перед видео на эту тему, а при просмотре видео сразу отслеживать все изменения кода проекта по изменению в патче (`Version Control->Local Changes-> Ctrl+D`)** +- **Код проекта обновляется и не всегда совпадает с видео (можно увидеть как развивался проект). Изменения в проекте указываю после соответствующего патча.** + ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Вступление. Многопоточность и параллельность. ![Concurrent vs Parallel](https://joearms.github.io/images/con_and_par.jpg) From 430ad8cf12eeae0b5fef2e9e436de1f30a7a4ddb Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 24 Oct 2017 00:35:27 +0300 Subject: [PATCH 003/126] Add lesson02 --- doc/lesson02.md | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 doc/lesson02.md diff --git a/doc/lesson02.md b/doc/lesson02.md new file mode 100644 index 0000000..a62a300 --- /dev/null +++ b/doc/lesson02.md @@ -0,0 +1,89 @@ +# Онлайн проекта Masterjava. +- **Не стоит стремится прочитать все ссылки урока, их можно впоследствии использовать как справочник. Гораздо важнее сделать Домашнее Задание** +- **Обязательно посмотри правила работы с патчами на проекте (совпадают с проектом Topjava)** +- **Делать Apply Patch лучше по одному, непосредственно перед видео на эту тему, а при просмотре видео сразу отслеживать все изменения кода проекта по изменению в патче** +- **Код проекта обновляется и не всегда совпадает с видео (можно увидеть как развивался проект). Изменения в проекте указываю после соответствующего патча.** +- 42 IntelliJ IDEA Tips and Tricks + +## Материалы занятия (скачать все патчи можно через Download папки patch) +![image](https://cloud.githubusercontent.com/assets/13649199/18330295/5f2ca214-7560-11e6-8e1e-c0494f798c37.png) + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1.1 Вступление. Разбор домашнего задания HW1 +#### 2_1_HW1_singleThreadMultiplyOpt.patch +#### 2_2_HW1_concurrentMultiply.patch +- Сравнение EE и Spring в комментариях +- Java array thread-safety + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1.2 [Еще одна реализация умножения, parallel() и ForkJoinPool](https://drive.google.com/file/d/0B9Ye2auQ_NsFT0FYaUdaenVMT1k) +#### 2_3_HW1_concurrentMultiply2.patch +> `Callable / executor.invokeAll` в `concurrentMultiply2` поменял на `Runnable / CountDownLatch` + +- [Fork/Join Framework в Java 7](https://habrahabr.ru/post/128985/) +- [Java Parallel Streams Are Bad for Your Health](https://zeroturnaround.com/rebellabs/java-parallel-streams-are-bad-for-your-health/) +- [Custom thread pool in Java 8 parallel stream](https://stackoverflow.com/a/21172732/548473) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Java Microbenchmark JMH (от Алексея Шипилева) +#### 2_4_JMH_Benchmark.patch +#### 2_5_JMH_main_jar.patch + +> Сделал forks=10 для большой точности измерений и убрал лишние измерения + +- JMH - Java Microbenchmark Harness, Java Performance Tuning Guide +- idea-jmh-plugin, Exception while trying to acquire a JMH lock +- Maven latest dependency version + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Формат XML. Создание схемы XSD. +#### 2_6_xml_scheme.patch +- История создания. XML формат и технологии, XML +- Attribute vs Element. +- sequence/ choice/ all/ group. Define referring to Another XML Element +- Справочник по XML + +## Работа с XML в Java + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. JAXB, JAXP +#### 2_7_JAXB.patch +> - Добавил в `maven-surefire-plugin` UTF-8 +> - Убрал лишний `synchronized` в `JaxbParser.marshal()` (уже есть в `JaxbMarshaller.marshal()`) +> - Сделал загрузку ресурсов используя context class loader +> - Different ways of loading a file as an InputStream + +- Работа с XML в Java. +- DOM, SAX +- JAXP: вспомогательный слой над SAX и DOM API +- JAXB, JAXP, Xerces, Xalan +- Валидации XML + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. StAX +#### 2_8_StAX.patch +- [Java XML API: выбираем правильно. StAX: работаем с удовольствием](https://habrahabr.ru/post/339716/) +- StAX: XMLStreamReader, XMLEventReader + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. XPath +#### 2_9_XPath.patch +- XPath: Java XPath API +- Примеры XPath + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. XSLT +#### 2_10_Xslt.patch +- Преобразование XSLT, Default XSLT output +- XSLT, XSL + - XSL Transformations (XSLT) +- Дополнительно + - [What kind of language is XSLT?](https://www.ibm.com/developerworks/xml/library/x-xslt) + - [Saxon: Anatomy of an XSLT processor](http://www.ibm.com/developerworks/library/x-xslt2/) + +## Домашнее задание +- 1: Изменить XML схему: + - 1.1 добавить проекты. Имеют название (нарпимер `topjava, masterjava`) и описание + - 1.2 добавить группы. Они имеют название и тип (`REGISTERING/CURRENT/FINISHED`) и принадлежат проекту. Например проект `topjava`, группы `topjava01`,`topjava02`, .. + - 1.3 сделать `User.email` аттрибутом. + - 1.4 реализовать принадлежность участников разным группам (`Admin` состоит в группах `topjava07, topjava08, masterjava01`) +- 2: Дополнить xml тестовыми данными. +- 3: Реализовать класс `MainXml`, которые принимает параметром имя проекта в тестовом xml и выводит отсортированный список его участников (использовать JAXB). + +#### Optional +- 4: Сделать реализацию `MainXml` через StAX (выводить имя/email) +- 5: Из списка участников сделать html таблицу (имя/email). Реализация- любая. +- 6: Вывести через XSLT преобразование html таблицу с группами заданного проекта + - [XSLT param](http://stackoverflow.com/questions/1667454/xsl-transformation-in-java-with-parameters) From 92426ff4b5d155c4d15cd492e5ef128f634a76a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 30 Oct 2017 00:17:56 +0300 Subject: [PATCH 004/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index a62a300..7ee4766 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -37,7 +37,7 @@ - История создания. XML формат и технологии, XML - Attribute vs Element. - sequence/ choice/ all/ group. Define referring to Another XML Element -- Справочник по XML +- Лекции по XML ## Работа с XML в Java From 0dcac0cb3f1df3f8317ac329904e8cf9f04a13be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 30 Oct 2017 15:34:11 +0300 Subject: [PATCH 005/126] Update lesson02.md --- doc/lesson02.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/lesson02.md b/doc/lesson02.md index 7ee4766..27361ba 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -87,3 +87,9 @@ - 5: Из списка участников сделать html таблицу (имя/email). Реализация- любая. - 6: Вывести через XSLT преобразование html таблицу с группами заданного проекта - [XSLT param](http://stackoverflow.com/questions/1667454/xsl-transformation-in-java-with-parameters) + +## Замечания: +- 1: Не используйте IDREFб где можно сделать обычную вложенность, принятую в структурах +- 2: Попробуйте сделать минимальное количестово XML на одного юзера (их много) +- 3: Используйте StaxStreamProcessor! Добавляйте туде утильные методы. +- 4: Постарайтесь оптимизировать реализацию определения "находится ли пользователь в проекте". Не делать сложность (N пользователей * M групп)! From d663dd7ad17631322a519f7328162b24f716d322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 30 Oct 2017 15:34:26 +0300 Subject: [PATCH 006/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 27361ba..aaab979 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -89,7 +89,7 @@ - [XSLT param](http://stackoverflow.com/questions/1667454/xsl-transformation-in-java-with-parameters) ## Замечания: -- 1: Не используйте IDREFб где можно сделать обычную вложенность, принятую в структурах +- 1: Не используйте IDREF, где можно сделать обычную вложенность, принятую в структурах - 2: Попробуйте сделать минимальное количестово XML на одного юзера (их много) - 3: Используйте StaxStreamProcessor! Добавляйте туде утильные методы. - 4: Постарайтесь оптимизировать реализацию определения "находится ли пользователь в проекте". Не делать сложность (N пользователей * M групп)! From 6d5480d897a09c96c39525cda211e8b9dfc1a286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 30 Oct 2017 15:34:40 +0300 Subject: [PATCH 007/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index aaab979..f7acfe2 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -89,7 +89,7 @@ - [XSLT param](http://stackoverflow.com/questions/1667454/xsl-transformation-in-java-with-parameters) ## Замечания: -- 1: Не используйте IDREF, где можно сделать обычную вложенность, принятую в структурах +- 1: Не используйте IDREF, где можно сделать обычную вложенность, принятую в структурах XML - 2: Попробуйте сделать минимальное количестово XML на одного юзера (их много) - 3: Используйте StaxStreamProcessor! Добавляйте туде утильные методы. - 4: Постарайтесь оптимизировать реализацию определения "находится ли пользователь в проекте". Не делать сложность (N пользователей * M групп)! From 104103212f4ae6aec22f772ba95c2ff48e6eb9a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 30 Oct 2017 15:35:28 +0300 Subject: [PATCH 008/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index f7acfe2..c3e713f 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -90,6 +90,6 @@ ## Замечания: - 1: Не используйте IDREF, где можно сделать обычную вложенность, принятую в структурах XML -- 2: Попробуйте сделать минимальное количестово XML на одного юзера (их много) +- 2: Попробуйте сделать минимальное количестово XML текста на одного юзера (пользователей много, экономим) - 3: Используйте StaxStreamProcessor! Добавляйте туде утильные методы. - 4: Постарайтесь оптимизировать реализацию определения "находится ли пользователь в проекте". Не делать сложность (N пользователей * M групп)! From 57b7e3f18bbbe321f39d3dd802c18b6479d05d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 30 Oct 2017 15:35:56 +0300 Subject: [PATCH 009/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index c3e713f..95fcead 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -91,5 +91,5 @@ ## Замечания: - 1: Не используйте IDREF, где можно сделать обычную вложенность, принятую в структурах XML - 2: Попробуйте сделать минимальное количестово XML текста на одного юзера (пользователей много, экономим) -- 3: Используйте StaxStreamProcessor! Добавляйте туде утильные методы. +- 3: Используйте StaxStreamProcessor! Добавляйте туда и используйте утильные методы. - 4: Постарайтесь оптимизировать реализацию определения "находится ли пользователь в проекте". Не делать сложность (N пользователей * M групп)! From 11777b142fd979663e680619210ec256213fa609 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 31 Oct 2017 02:54:09 +0300 Subject: [PATCH 010/126] Add lesson03 --- doc/lesson03.md | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 doc/lesson03.md diff --git a/doc/lesson03.md b/doc/lesson03.md new file mode 100644 index 0000000..2310068 --- /dev/null +++ b/doc/lesson03.md @@ -0,0 +1,125 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия (скачать все патчи можно через Download папки patch)](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFSGFQZ2I0V2pmbXM) + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW2 +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Scheme, j2html, JAXB +#### 3_1_HW2_schema.patch +- xs:ID restriction + +#### 3_2_HW2_JAXB.patch +> - убрал второй параметр xmlName (всегда `payload.xml`) +> - в `parseByJaxb` сделал закрытие `InputStream` сразу после обработки +> - сделал методы статическими +> - вместо вложенного стрима для групп юзера сделал пересечение коллекций `Collections.disjoint` +> - результат JAXB также вывожу в HTML (в ДЗ только в Optional) +> - в `j2html` вместо `setAttribute` сделал `attr` + +- Тагир Валеев. StreamEx + странности Stream API +- StreamEx примеры +- Java HTML5 builder + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Optional: StAX +#### 3_3_HW2_StAX.patch +> - зарефакторил в `StaxStreamProcessor` `doUntil()` и `getAttribute()` +> - константы вставил в код +> - вместо вложенного цикла для групп юзера сделал пересечение коллекций `Collections.disjoint` и для маскирования пустых групп `Strings.nullToEmpty` + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. StAX refactoring: startElement + JAXB +#### 3_4_StAX_refactoring.patch +- [Java XML API: выбираем правильно. StAX: работаем с удовольствием](https://habrahabr.ru/post/339716/) +- [StAX + JAXB](http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html) + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Optional: XSLT +#### 3_5_HW2_xslt.patch +> В `groups.xsl` добавил явный namespace. Теперь при создании xPath IDEA делает автодополнения + +- XSL Transformation in Java with parameters +- Test Cases for XSLT support in browsers + +## Затяние 3 +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Обзор Guava](https://drive.google.com/open?id=0B9Ye2auQ_NsFeFB5a29JQ2tRNHM) +- [The Top 20 Most Popular Java Libraries](https://dzone.com/articles/the-top-100-java-libraries-in-2016-after-analyzing) +- [Guava Wiki](https://github.com/google/guava/wiki) + - [Apache Commons](https://commons.apache.org/) + - [Spring Boot cache providers](http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html#_supported_cache_providers) +- [Release 21.0: Java 8!](https://github.com/google/guava/wiki/Release21) +- [118 слайдов от Егора Чернышева](https://www.slideshare.net/echernyshev/guava-41982734) + + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. Монады. flatMap +- Функторы, аппликативные функторы и монады в картинках +- Монады в Java 8 + - Куср Сoursera по функциональному программированию +- Three Monad laws. +- What's Wrong in Java 8 Monads + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. SOA и Микросервисы + - Сервис-ориентированная архитектура как повышение абстракции производства ПО + - What is service-oriented architecture? + - Современное представление (SOA): Микросервисы + - Микросервисы (Microservices) + - Доклад Кирилла Толкачёва и Александра Тарасова про микросервисы + - Минск: Микросервисы - Огонь, Вода и Медные трубы + - Слайды + - CQRS + - Event Sourcing, + - CQRS + Event Sourcing, + - Event-Sourcing+CQRS example application + - Интеграция через несколько ДБ. + - Гибридные решения для эффективного хранения данных. + - PgBouncer + - Microservices with Spring, Микросервисная архитектура, Spring Cloud и Docker + - Microservices demo + - Spring Cloud Netflix + - Netflix + - Service Discovery: Eureka + - Circuit Breaker: Hystrix + - Load Balancer: Ribbon + - Declarative REST Client: Feign + - External Configuration: Archaius + - Gateway, Router and Filter: Zuul + - Metrics: Spectator, Servo, and Atlas + - RxJava with Spring MVC + - ReactiveX + - RxJava: Reactive Extensions for the JVM + - Справичник + - microservice in spring.io + - Building microservices with Spring Boot – part 1 + - Building microservices with Spring Boot – part 2 + - Deploying Spring Boot-based microservices with Docker – part 3 + - Developing Microservices With Spring Boot + - Webinar: Building "Bootiful" Microservices with Spring Boot + - Managing your Microservices on Heroku with Netflix's Eureka + - Платформы + - A comparison of Microservices Frameworks + - Lagom, Play Framework + - Микросервисе в обзоре Zeroturnaround + - Spring 5: Functional Web Framework + - Apache Camel for Micro­service Architectures + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Многомодульный Maven проект +#### 3_5_multimodule.patch +- Maven на topjava. Snapshot. The Reactor. +- maven module inheritance vs aggregation +- Расширение кругозора: + - Антон Архипов, Евгений Борисов, Барух Садогурский — Maven vs Gradle vs SBT + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW3 +- Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. + +**Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `import`.** + +![image](https://cloud.githubusercontent.com/assets/13649199/23876457/ab01ff0a-084e-11e7-964f-49c90579fac9.png) + +- Учитывая, что web модулей в проекте предполагается много, измените структуру, чтобы не дублировать `maven-war-plugin` (и другие общие зависимости war модулей). +- Проверьте, что проект собирается! + +#### Optional +- Реализовать простую форму заргузки файла `payload.xml` в модуле `import` (через StAX) и вывод в html импортированных пользователей (имя/email/flag) + - для отображения взять любой шаблон (JSP, [Thymeleaf](http://www.concretepage.com/thymeleaf/java-thymeleaf-example-getting-started-with-thymeleaf), ...) + - загрузку сделать через любую реализацию (Servlet 3.х предпочтительнее): + - Commons FileUpload + - Tomcat fileupload copied and package renamed + - Java EE 6 Tutorial: fileupload example + - Servlet 3.0's FileUpload Sample \ No newline at end of file From 8d103550869d894636119d078e1761f17977c0c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 31 Oct 2017 03:01:56 +0300 Subject: [PATCH 011/126] Update lesson03.md --- doc/lesson03.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 2310068..44de4fa 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -1,13 +1,13 @@ # Онлайн проекта Masterjava. -## [Материалы занятия (скачать все патчи можно через Download папки patch)](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFSGFQZ2I0V2pmbXM) +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFSGFQZ2I0V2pmbXM) (скачать все патчи можно через Download папки patch) ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW2 ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Scheme, j2html, JAXB -#### 3_1_HW2_schema.patch +#### Apply 3_1_HW2_schema.patch - xs:ID restriction -#### 3_2_HW2_JAXB.patch +#### Apply 3_2_HW2_JAXB.patch > - убрал второй параметр xmlName (всегда `payload.xml`) > - в `parseByJaxb` сделал закрытие `InputStream` сразу после обработки > - сделал методы статическими @@ -20,18 +20,18 @@ - Java HTML5 builder ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Optional: StAX -#### 3_3_HW2_StAX.patch +#### Apply 3_3_HW2_StAX.patch > - зарефакторил в `StaxStreamProcessor` `doUntil()` и `getAttribute()` > - константы вставил в код > - вместо вложенного цикла для групп юзера сделал пересечение коллекций `Collections.disjoint` и для маскирования пустых групп `Strings.nullToEmpty` ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. StAX refactoring: startElement + JAXB -#### 3_4_StAX_refactoring.patch +#### Apply 3_4_StAX_refactoring.patch - [Java XML API: выбираем правильно. StAX: работаем с удовольствием](https://habrahabr.ru/post/339716/) - [StAX + JAXB](http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html) ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Optional: XSLT -#### 3_5_HW2_xslt.patch +#### Apply 3_5_HW2_xslt.patch > В `groups.xsl` добавил явный namespace. Теперь при создании xPath IDEA делает автодополнения - XSL Transformation in Java with parameters @@ -99,14 +99,14 @@ - Apache Camel for Micro­service Architectures ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Многомодульный Maven проект -#### 3_5_multimodule.patch +#### Apply 3_5_multimodule.patch - Maven на topjava. Snapshot. The Reactor. -- maven module inheritance vs aggregation +- Maven module inheritance vs aggregation - Расширение кругозора: - Антон Архипов, Евгений Борисов, Барух Садогурский — Maven vs Gradle vs SBT ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW3 -- Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. +- Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. `Matrix + Benchmark` перенести в модуль `test`. **Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `import`.** @@ -122,4 +122,4 @@ - Commons FileUpload - Tomcat fileupload copied and package renamed - Java EE 6 Tutorial: fileupload example - - Servlet 3.0's FileUpload Sample \ No newline at end of file + - Servlet 3.0's FileUpload Sample From d7663ace11c4039e380b7106759232994bc98565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 31 Oct 2017 03:05:24 +0300 Subject: [PATCH 012/126] Update lesson03.md --- doc/lesson03.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 44de4fa..f88f298 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -106,7 +106,9 @@ - Антон Архипов, Евгений Борисов, Барух Садогурский — Maven vs Gradle vs SBT ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW3 -- Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. `Matrix + Benchmark` перенести в модуль `test`. +- Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. + - `Matrix + Benchmark` перенести в модуль `test`. + - Схемы XML/XSD в модуль `import` **Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `import`.** From c535c67e56344e6c0e7f306a108cfcb2b15d1150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 3 Nov 2017 18:14:14 +0300 Subject: [PATCH 013/126] Update lesson03.md --- doc/lesson03.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index f88f298..63303d7 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -112,6 +112,11 @@ **Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `import`.** +WAR модули: +- **`mail-service`** - модуль отсылки почты. Транспорт: JAX-WS, JAX-RS, JMX, AKKA +- **`import`** - модуль импорта payload.xml. Заргузка и многопоточночная вставка в DB +- **`webapp`** - веб-интерфейс для отсылки почты пользователям из DB. Клиент модуля `mail-service` + ![image](https://cloud.githubusercontent.com/assets/13649199/23876457/ab01ff0a-084e-11e7-964f-49c90579fac9.png) - Учитывая, что web модулей в проекте предполагается много, измените структуру, чтобы не дублировать `maven-war-plugin` (и другие общие зависимости war модулей). From c205737dbf551270728030b8a5c4909b7142d8ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 01:48:13 +0300 Subject: [PATCH 014/126] Update lesson03.md --- doc/lesson03.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 63303d7..937f967 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -110,11 +110,11 @@ - `Matrix + Benchmark` перенести в модуль `test`. - Схемы XML/XSD в модуль `import` -**Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `import`.** +**Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `upload`.** WAR модули: - **`mail-service`** - модуль отсылки почты. Транспорт: JAX-WS, JAX-RS, JMX, AKKA -- **`import`** - модуль импорта payload.xml. Заргузка и многопоточночная вставка в DB +- **`upload`** - модуль загрузки payload.xml. Заргузка и многопоточночная вставка в DB - **`webapp`** - веб-интерфейс для отсылки почты пользователям из DB. Клиент модуля `mail-service` ![image](https://cloud.githubusercontent.com/assets/13649199/23876457/ab01ff0a-084e-11e7-964f-49c90579fac9.png) From 339e3769d82058b7b7374e68a11502e4aad22b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 02:18:40 +0300 Subject: [PATCH 015/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 937f967..d12bb97 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -108,7 +108,7 @@ ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW3 - Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. - `Matrix + Benchmark` перенести в модуль `test`. - - Схемы XML/XSD в модуль `import` + - Схемы XML/XSD в модуль `upload` **Внимание: название модуля `export` в видео и картинке идеологически неверно. В коде и патчах переименовал в `upload`.** From 6073bde254afde01b3ee1ca42023fc7f18037bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 12:01:23 +0300 Subject: [PATCH 016/126] Update lesson03.md --- doc/lesson03.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index d12bb97..61d9375 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -130,3 +130,6 @@ WAR модули: - Tomcat fileupload copied and package renamed - Java EE 6 Tutorial: fileupload example - Servlet 3.0's FileUpload Sample + +## Замечания: +- 1: имя артифакта `artifactId` как и пакеты называть только lowercase. Обычно используют "-" как разделитель слов. From 70b56d3eca568ffda6570123dcecba221e3366d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 12:54:21 +0300 Subject: [PATCH 017/126] Update lesson03.md --- doc/lesson03.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index 61d9375..5fb6cc9 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -133,3 +133,4 @@ WAR модули: ## Замечания: - 1: имя артифакта `artifactId` как и пакеты называть только lowercase. Обычно используют "-" как разделитель слов. +- 2: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. From bce219249852fefadbc49e94ea14fe82bdaaaa0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 13:01:02 +0300 Subject: [PATCH 018/126] Update lesson03.md --- doc/lesson03.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index 5fb6cc9..21b7ba5 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -134,3 +134,4 @@ WAR модули: ## Замечания: - 1: имя артифакта `artifactId` как и пакеты называть только lowercase. Обычно используют "-" как разделитель слов. - 2: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. +- 3: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. From faf1be0fb2e8879384c9aad9d5079046eb5d633e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 13:41:39 +0300 Subject: [PATCH 019/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 21b7ba5..c6660f2 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -123,7 +123,7 @@ WAR модули: - Проверьте, что проект собирается! #### Optional -- Реализовать простую форму заргузки файла `payload.xml` в модуле `import` (через StAX) и вывод в html импортированных пользователей (имя/email/flag) +- Реализовать простую форму заргузки файла `payload.xml` в модуле `import` (через StAX) и отобразить импортированных пользователей (имя/email/flag) - для отображения взять любой шаблон (JSP, [Thymeleaf](http://www.concretepage.com/thymeleaf/java-thymeleaf-example-getting-started-with-thymeleaf), ...) - загрузку сделать через любую реализацию (Servlet 3.х предпочтительнее): - Commons FileUpload From f296a530d32f85f0d370633a7f3d5cb65cb83571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 13:42:30 +0300 Subject: [PATCH 020/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index c6660f2..d751dc4 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -123,7 +123,7 @@ WAR модули: - Проверьте, что проект собирается! #### Optional -- Реализовать простую форму заргузки файла `payload.xml` в модуле `import` (через StAX) и отобразить импортированных пользователей (имя/email/flag) +- Реализовать простую форму заргузки файла `payload.xml` в модуле `upload` (через StAX) и отобразить загруженных пользователей (имя/email/flag) - для отображения взять любой шаблон (JSP, [Thymeleaf](http://www.concretepage.com/thymeleaf/java-thymeleaf-example-getting-started-with-thymeleaf), ...) - загрузку сделать через любую реализацию (Servlet 3.х предпочтительнее): - Commons FileUpload From b046664c73107a9633f91e1782efcf3dffe3f51a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 13:45:14 +0300 Subject: [PATCH 021/126] Update lesson03.md --- doc/lesson03.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index d751dc4..f0a187e 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -135,3 +135,4 @@ WAR модули: - 1: имя артифакта `artifactId` как и пакеты называть только lowercase. Обычно используют "-" как разделитель слов. - 2: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. - 3: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. +- 4: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! From 1404bc0276d2434fa7c2a23530f4ce919bcd162d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 22:57:48 +0300 Subject: [PATCH 022/126] Update lesson03.md --- doc/lesson03.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index f0a187e..4254e2e 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -133,6 +133,7 @@ WAR модули: ## Замечания: - 1: имя артифакта `artifactId` как и пакеты называть только lowercase. Обычно используют "-" как разделитель слов. -- 2: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. -- 3: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. -- 4: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! +- 2: имя каталога модуля делайте такое же, как и `artifactId`: [Project Directories Should Match the Artifact ID](http://blog.sonatype.com/2011/01/maven-tip-project-directories-and-artifact-ids/) +- 3: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. +- 4: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. +- 5: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! From 95071e4abc740343d6560922e7d6ead3e5aa9328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 22:59:15 +0300 Subject: [PATCH 023/126] Update lesson03.md --- doc/lesson03.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 4254e2e..cb36078 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -132,8 +132,7 @@ WAR модули: - Servlet 3.0's FileUpload Sample ## Замечания: -- 1: имя артифакта `artifactId` как и пакеты называть только lowercase. Обычно используют "-" как разделитель слов. -- 2: имя каталога модуля делайте такое же, как и `artifactId`: [Project Directories Should Match the Artifact ID](http://blog.sonatype.com/2011/01/maven-tip-project-directories-and-artifact-ids/) +- 1: имя артифакта `artifactId` как и пакеты называть только в lowercase. Обычно используют "-" как разделитель слов. Имя каталога модуля лучше делать тоже самое: [Project Directories Should Match the Artifact ID](http://blog.sonatype.com/2011/01/maven-tip-project-directories-and-artifact-ids/) - 3: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. - 4: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. - 5: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! From 876217363c7378d8422705e8c8b9a10b1b8e8c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Nov 2017 22:59:37 +0300 Subject: [PATCH 024/126] Update lesson03.md --- doc/lesson03.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index cb36078..cd806ec 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -133,6 +133,6 @@ WAR модули: ## Замечания: - 1: имя артифакта `artifactId` как и пакеты называть только в lowercase. Обычно используют "-" как разделитель слов. Имя каталога модуля лучше делать тоже самое: [Project Directories Should Match the Artifact ID](http://blog.sonatype.com/2011/01/maven-tip-project-directories-and-artifact-ids/) -- 3: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. -- 4: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. -- 5: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! +- 2: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. +- 3: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. +- 4: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! From 6003f7ba1a89ab61b331cb56c1a21346b5b433c3 Mon Sep 17 00:00:00 2001 From: gkislin Date: Mon, 6 Nov 2017 01:41:56 +0300 Subject: [PATCH 025/126] fix --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 95fcead..1e73e4d 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -75,7 +75,7 @@ ## Домашнее задание - 1: Изменить XML схему: - - 1.1 добавить проекты. Имеют название (нарпимер `topjava, masterjava`) и описание + - 1.1 добавить проекты. Имеют название (например `topjava, masterjava`) и описание - 1.2 добавить группы. Они имеют название и тип (`REGISTERING/CURRENT/FINISHED`) и принадлежат проекту. Например проект `topjava`, группы `topjava01`,`topjava02`, .. - 1.3 сделать `User.email` аттрибутом. - 1.4 реализовать принадлежность участников разным группам (`Admin` состоит в группах `topjava07, topjava08, masterjava01`) From c26203882d4eb834ee64b0e41d9b873f15a8cae2 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 7 Nov 2017 01:45:29 +0300 Subject: [PATCH 026/126] Add lesson04 --- doc/lesson04.md | 131 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 doc/lesson04.md diff --git a/doc/lesson04.md b/doc/lesson04.md new file mode 100644 index 0000000..52438f0 --- /dev/null +++ b/doc/lesson04.md @@ -0,0 +1,131 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия (скачать все патчи можно через Download папки patch)](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFVDNRNHpGU2NmcEk) + +### Fix: переименовал модуль `import(export)` в `upload` +#### 4_0_rename_upload.patch + + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW3 + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Структура многомодульного проекта +#### 4_1_HW3_pom_structure.patch +> Вместо включения всех модулей в главный аггрегатор, сделал еще 2 аггрегатных модуля 2го уровня: `web` и `services` + +**ВНИМАНИЕ! после патча** + - проверьте правильность структуры проекта + - сделайте `mvn clean install` + - удалите пустые корневые каталоги `src` и `upload` (git не работает с каталогами) + - переименуйте модули idea (`Shift+F6`), если отличаются от имени модуля Maven + +![structure](https://user-images.githubusercontent.com/11200258/32416643-928c4e34-c25d-11e7-832d-0f72dc1f8760.png) + +#### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Вопрос: как разбивать приложение на модули](https://drive.google.com/open?id=0B9Ye2auQ_NsFTm5FX1ZZeTFpYU0) +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Реализация модуля `upload`: Thymeleaf и Upload +**ВНИМАНИЕ! перед накаткой патча создайте в папке `web` проекта каталог `\common-web\src`, иначе патч промахивается.** +#### 4_2_HW3_thymeleaf_upload.patch +- Thymeleaf: natural templates + - Thymeleaf 3 migration guide + - th:include и th:replace + - Tutorial + - URL Syntax + - Java Thymeleaf Example +- [Thread-safe TemplateEngine.process](http://stackoverflow.com/a/23007118/548473) + +#### 4_3_HW3_upload_servlet3.patch +> - Реализовал парсинг через StAX+JAXB +> - Добавил проверку на отсутствие выбранного файла + +- [File upload using Servlet 3.0 API](http://www.ewebtutorials.com/file-upload-using-servlet-3-0-api-in-java.html) + +---------------- +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Maven. Поиск и разрешение конфликтов зависимостей](https://drive.google.com/file/d/0B9Ye2auQ_NsFbFFpWWFzRWE3ekU) +- Maven options: -pl upload -am install, -h, -X +- Maven transitive dependencies +- Project Info Reports Plugin +- Disable blacklisted repository warnings +``` +mvn dependency:tree +mvn project-info-reports:dependencies +``` +#### 4_4_dependencies.patch + +- Разрешение конфликтов в транзитивных зависимостях +- Dependency hell +``` +mvn project-info-reports:dependency-convergence +``` +#### 4_5_fix_convergence.patch +#### 4_6_enforcer.patch +- Maven Enforcer Plugin +``` +mvn clean install +mvn -DincludeScope=runtime dependency:copy-dependencies +``` +- jar-hell.zip +``` +java -jar jar-hell.jar . +``` +- jHades, [Downloads WAR Duplicate Classes](http://jhades.github.io/downloads.html) +``` +java -jar jhades-standalone-report.jar path/to/war/webapp.war +``` +``` +mvn dependency:analyze +``` +- Analyze used and declared; used and undeclared; unused and declared + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Подключаем логирование с общими настройкам +#### 4_7_logging.patch +> - Перенес подключение `logback-test.xml` из `parent-web` в `parent` (он используется в JUnit тестах, которые могут быть в любом модуле) +> - Добавил в корень проекта `config_templates` с копией конфигурации. +Общие файлы конфигурации заданы в maven parent как в `/apps/masterjava/config/`. +**Нужно у себя в корне диска создать этот каталог и положить в него содержимое `config_templates`** + +- Добавление зависимостей логирования +- logback.xml Example +- Справочник: + - Topjava: логирование. + - Владимир Красильщик: Что надо знать о логировании прагматичному Java‑программисту + - Java Logging: история кошмара + - Ведение лога приложения + - Log4j, Logback + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5.Библиотеки и фреймворки для работы с JDBC. + +### Выбор lightweight JDBC helper library +- Lightweight JDBC helper library +- Библиотеки для работа с JDBC +- MyBatis, MyBatis tutorial (CRUD) +- Commons DbUtils, доработка commons-dbutils +- jDBI sample + - JDBI + - JDBI tutorial (Dropwizard JDBI) + - [Combining Spring Boot and JDBI](https://www.sitepoint.com/combining-spring-boot-and-jdbi) + +### Tomcat Class Loader. Memory Leeks +#### 4_8_context.patch +> Cохранил конфигурацию Tomcat `context.xml`, в котором конфигурируется `jdbc/masterjava`. **Ее надо будет положить в ${TOMCAT_HOME}/conf** + +- Class Loader HOW-TO +- Библиотеки vs Frameworks и Tomcat Common Lib. Memory Leaks. +- Никита Сальников-Тарновский — Утечки памяти + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. Модуль `persist` +**ВНИМАНИЕ! перед накаткой патча создайте в корне проекта каталоги `persist\src\main` и `persist\src\test`, иначе патч промахивается.** +#### 4_9_persist.patch +- Postgresql enum advantages/disadvantages +- ALTER Enum types since 9.1 +- Simple EntityMapper with `@Column` support + +### Домашнее задание +- в модуле **upload** сохранить всех импортированных пользователей в базе (записи просто добавляются в таблицу `users`). Делать вставку группами (chunk) в [batch моде](http://jdbi.org/sql_object_api_batching/). Количестово пользователей в chunk принимать с UI как параметр +- сделать отображение первых 20 пользователей в модуле **webapp** +- добавить в таблицу `users` уникальный индекс на `email` и вставлять в базу только новых пользователей. Результат импорта: пользователи, уже присутствующие в базе ([POSTGRES: INSERT ON CONFLICT](https://habrahabr.ru/post/264281/)) + +#### Optional +- cделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: пользователи, уже присутствующие в базе и диапазоны (начальный-конечный `email`) в чанке, +если его обработка закончилась с ошибкой + причина отказа в импорте для каждого пользователя/диапазона. +- дополнительный материал: + - [Speed up insertion performance in PostgreSQL](http://stackoverflow.com/a/12207237/548473) + - [COPY — копировать данные между файлом и таблицей](https://postgrespro.ru/docs/postgrespro/9.6/sql-copy) From afa6865e2e7ef19ae35fa4a61e9f7787f8157ee1 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 7 Nov 2017 01:49:58 +0300 Subject: [PATCH 027/126] Update lesson04 --- doc/lesson04.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 52438f0..8113b91 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -118,13 +118,13 @@ mvn dependency:analyze - ALTER Enum types since 9.1 - Simple EntityMapper with `@Column` support -### Домашнее задание +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW4 - в модуле **upload** сохранить всех импортированных пользователей в базе (записи просто добавляются в таблицу `users`). Делать вставку группами (chunk) в [batch моде](http://jdbi.org/sql_object_api_batching/). Количестово пользователей в chunk принимать с UI как параметр - сделать отображение первых 20 пользователей в модуле **webapp** - добавить в таблицу `users` уникальный индекс на `email` и вставлять в базу только новых пользователей. Результат импорта: пользователи, уже присутствующие в базе ([POSTGRES: INSERT ON CONFLICT](https://habrahabr.ru/post/264281/)) -#### Optional -- cделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: пользователи, уже присутствующие в базе и диапазоны (начальный-конечный `email`) в чанке, +### Optional +- сделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: пользователи, уже присутствующие в базе и диапазоны (начальный-конечный `email`) в чанке, если его обработка закончилась с ошибкой + причина отказа в импорте для каждого пользователя/диапазона. - дополнительный материал: - [Speed up insertion performance in PostgreSQL](http://stackoverflow.com/a/12207237/548473) From ef69a44244c36895135518a57f09f17d7d241764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 8 Nov 2017 01:11:40 +0300 Subject: [PATCH 028/126] Update lesson04.md --- doc/lesson04.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 8113b91..d0e0832 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -40,7 +40,10 @@ ---------------- ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Maven. Поиск и разрешение конфликтов зависимостей](https://drive.google.com/file/d/0B9Ye2auQ_NsFbFFpWWFzRWE3ekU) -- Maven options: -pl upload -am install, -h, -X +- Пример для сборки `upload + mail-service + зависимости` из **кореня проекта**: +``` + mvn -pl services\mail-service,web\upload -am install +``` - Maven transitive dependencies - Project Info Reports Plugin - Disable blacklisted repository warnings From 328a784a461838bf3f72d6d5441a745c86ef92ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 8 Nov 2017 01:13:21 +0300 Subject: [PATCH 029/126] Update lesson04.md --- doc/lesson04.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index d0e0832..ec3fa81 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -40,7 +40,7 @@ ---------------- ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Maven. Поиск и разрешение конфликтов зависимостей](https://drive.google.com/file/d/0B9Ye2auQ_NsFbFFpWWFzRWE3ekU) -- Пример для сборки `upload + mail-service + зависимости` из **кореня проекта**: +- Пример для сборки `upload + mail-service + зависимости` из **корня проекта**: ``` mvn -pl services\mail-service,web\upload -am install ``` From b0880365f7186990ec984334669d66698caff1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 8 Nov 2017 01:49:27 +0300 Subject: [PATCH 030/126] Update lesson04.md --- doc/lesson04.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index ec3fa81..9b7a39e 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -33,7 +33,6 @@ - [Thread-safe TemplateEngine.process](http://stackoverflow.com/a/23007118/548473) #### 4_3_HW3_upload_servlet3.patch -> - Реализовал парсинг через StAX+JAXB > - Добавил проверку на отсутствие выбранного файла - [File upload using Servlet 3.0 API](http://www.ewebtutorials.com/file-upload-using-servlet-3-0-api-in-java.html) From 57d3231ace21f2c271c1109e073e340456b38274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 8 Nov 2017 02:30:20 +0300 Subject: [PATCH 031/126] Update lesson04.md --- doc/lesson04.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lesson04.md b/doc/lesson04.md index 9b7a39e..46d4fd2 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -37,6 +37,10 @@ - [File upload using Servlet 3.0 API](http://www.ewebtutorials.com/file-upload-using-servlet-3-0-api-in-java.html) +> Вопрос: если в загружаем большой файл, то он придет частями? В этом случае используем `req.getParts()` и у каждой части можно получить InputStream. А как все части файла собрать вместе и получить итоговый InputStream, который уже можно передать StAX-процессору? + +`Part` это одно поле формы и на части уже не бъется. В `@MultipartConfig` можно через аттрибуты задать лимит `fileSizeThreshold`, когда входящий поток будет сохраняться в файле. Все происходит внизу Multipart API, `InputStream` из мы получаем также: `filePart.getInputStream()` + ---------------- ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Maven. Поиск и разрешение конфликтов зависимостей](https://drive.google.com/file/d/0B9Ye2auQ_NsFbFFpWWFzRWE3ekU) - Пример для сборки `upload + mail-service + зависимости` из **корня проекта**: From 5dfa7f026441646eb564f61016d0b0ccdc8e1862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 9 Nov 2017 15:38:29 +0300 Subject: [PATCH 032/126] Update lesson03.md --- doc/lesson03.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index cd806ec..bee404e 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -130,6 +130,8 @@ WAR модули: - Tomcat fileupload copied and package renamed - Java EE 6 Tutorial: fileupload example - Servlet 3.0's FileUpload Sample +- Сделать загрузку через StAX+JAXB многопоточно. Сейчас `JaxbParser` реализован с `synchronize`, что означает что он потокобезопасен (может работать с несколькими запросами), но последовательно, в одном потоке. Нужен рефакторинг. + - [Thread safe of JAXBContext, Marshaller, Unmarshalleris](https://stackoverflow.com/a/37926057/548473) ## Замечания: - 1: имя артифакта `artifactId` как и пакеты называть только в lowercase. Обычно используют "-" как разделитель слов. Имя каталога модуля лучше делать тоже самое: [Project Directories Should Match the Artifact ID](http://blog.sonatype.com/2011/01/maven-tip-project-directories-and-artifact-ids/) From 68ed9e66499dc8a68b739df48106092377d93adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 12 Nov 2017 20:23:10 +0300 Subject: [PATCH 033/126] Update lesson04.md --- doc/lesson04.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 46d4fd2..f876b80 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -2,10 +2,6 @@ ## [Материалы занятия (скачать все патчи можно через Download папки patch)](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFVDNRNHpGU2NmcEk) -### Fix: переименовал модуль `import(export)` в `upload` -#### 4_0_rename_upload.patch - - ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW3 ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Структура многомодульного проекта From dbeaf3762c06bf4b68902a590ecbb13becc0833b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 12 Nov 2017 20:33:01 +0300 Subject: [PATCH 034/126] Update lesson03.md --- doc/lesson03.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index bee404e..6fc8f39 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -137,4 +137,3 @@ WAR модули: - 1: имя артифакта `artifactId` как и пакеты называть только в lowercase. Обычно используют "-" как разделитель слов. Имя каталога модуля лучше делать тоже самое: [Project Directories Should Match the Artifact ID](http://blog.sonatype.com/2011/01/maven-tip-project-directories-and-artifact-ids/) - 2: следите, чтобы пути в шаблонах были не от рута "/". Каждое приложение деплоится в свой Application Context. - 3: чтобы не дублировать `maven-war-plugin` сделать `paren-web`. Он наследуется от `parent`, а от него наследуются все war модули. -- 4: При парсинге пользователей через `JaxbParser` учтите, что он многопоточный! From 8d6948da97a5c6cca25fc31f6862d563ea215a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 12 Nov 2017 23:07:09 +0300 Subject: [PATCH 035/126] Update lesson04.md --- doc/lesson04.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index f876b80..cfa8096 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -37,6 +37,10 @@ `Part` это одно поле формы и на части уже не бъется. В `@MultipartConfig` можно через аттрибуты задать лимит `fileSizeThreshold`, когда входящий поток будет сохраняться в файле. Все происходит внизу Multipart API, `InputStream` из мы получаем также: `filePart.getInputStream()` +#### 4_4_HW3_jaxb_stax.patch +- [JAXB creating context and marshallers cost](https://stackoverflow.com/a/7400735/548473) +- [Именование private static референсных изменяемых объектов](https://google.github.io/styleguide/javaguide.html#s5.2.4-constant-names) + ---------------- ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Maven. Поиск и разрешение конфликтов зависимостей](https://drive.google.com/file/d/0B9Ye2auQ_NsFbFFpWWFzRWE3ekU) - Пример для сборки `upload + mail-service + зависимости` из **корня проекта**: @@ -50,15 +54,15 @@ mvn dependency:tree mvn project-info-reports:dependencies ``` -#### 4_4_dependencies.patch +#### 4_5_dependencies.patch - Разрешение конфликтов в транзитивных зависимостях - Dependency hell ``` mvn project-info-reports:dependency-convergence ``` -#### 4_5_fix_convergence.patch -#### 4_6_enforcer.patch +#### 4_6_fix_convergence.patch +#### 4_7_enforcer.patch - Maven Enforcer Plugin ``` mvn clean install @@ -78,7 +82,7 @@ mvn dependency:analyze - Analyze used and declared; used and undeclared; unused and declared ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Подключаем логирование с общими настройкам -#### 4_7_logging.patch +#### 4_8_logging.patch > - Перенес подключение `logback-test.xml` из `parent-web` в `parent` (он используется в JUnit тестах, которые могут быть в любом модуле) > - Добавил в корень проекта `config_templates` с копией конфигурации. Общие файлы конфигурации заданы в maven parent как в `/apps/masterjava/config/`. @@ -106,7 +110,7 @@ mvn dependency:analyze - [Combining Spring Boot and JDBI](https://www.sitepoint.com/combining-spring-boot-and-jdbi) ### Tomcat Class Loader. Memory Leeks -#### 4_8_context.patch +#### 4_9_context.patch > Cохранил конфигурацию Tomcat `context.xml`, в котором конфигурируется `jdbc/masterjava`. **Ее надо будет положить в ${TOMCAT_HOME}/conf** - Class Loader HOW-TO @@ -115,7 +119,7 @@ mvn dependency:analyze ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. Модуль `persist` **ВНИМАНИЕ! перед накаткой патча создайте в корне проекта каталоги `persist\src\main` и `persist\src\test`, иначе патч промахивается.** -#### 4_9_persist.patch +#### 4_10_persist.patch - Postgresql enum advantages/disadvantages - ALTER Enum types since 9.1 - Simple EntityMapper with `@Column` support From 1117e8e5cdacc8d7d31ad5df0c1041904f488d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 13 Nov 2017 16:43:32 +0300 Subject: [PATCH 036/126] Update lesson04.md --- doc/lesson04.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/lesson04.md b/doc/lesson04.md index cfa8096..4503a2e 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -135,3 +135,6 @@ mvn dependency:analyze - дополнительный материал: - [Speed up insertion performance in PostgreSQL](http://stackoverflow.com/a/12207237/548473) - [COPY — копировать данные между файлом и таблицей](https://postgrespro.ru/docs/postgrespro/9.6/sql-copy) + +### Optional2 +- сделайте обработку `InterruptedException/ExecutionException`, вернув ошибку в диапазоне (начальный-конечный `email`) From 93d7a0304251cd3c863775d6de97c6118da383c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 13 Nov 2017 16:44:08 +0300 Subject: [PATCH 037/126] Update lesson04.md --- doc/lesson04.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 4503a2e..bdebaad 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -130,11 +130,11 @@ mvn dependency:analyze - добавить в таблицу `users` уникальный индекс на `email` и вставлять в базу только новых пользователей. Результат импорта: пользователи, уже присутствующие в базе ([POSTGRES: INSERT ON CONFLICT](https://habrahabr.ru/post/264281/)) ### Optional -- сделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: пользователи, уже присутствующие в базе и диапазоны (начальный-конечный `email`) в чанке, +- сделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: пользователи, уже присутствующие в базе и диапазоны (начальный-конечный email) в чанке, если его обработка закончилась с ошибкой + причина отказа в импорте для каждого пользователя/диапазона. - дополнительный материал: - [Speed up insertion performance in PostgreSQL](http://stackoverflow.com/a/12207237/548473) - [COPY — копировать данные между файлом и таблицей](https://postgrespro.ru/docs/postgrespro/9.6/sql-copy) ### Optional2 -- сделайте обработку `InterruptedException/ExecutionException`, вернув ошибку в диапазоне (начальный-конечный `email`) +- сделайте обработку `InterruptedException / ExecutionException`, вернув ошибку в диапазоне (начальный-конечный email) From e5a40ca744c8edf902c952815e8f5f227dffefb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 13 Nov 2017 18:39:01 +0300 Subject: [PATCH 038/126] Update lesson04.md --- doc/lesson04.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index bdebaad..8e5e450 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -130,11 +130,9 @@ mvn dependency:analyze - добавить в таблицу `users` уникальный индекс на `email` и вставлять в базу только новых пользователей. Результат импорта: пользователи, уже присутствующие в базе ([POSTGRES: INSERT ON CONFLICT](https://habrahabr.ru/post/264281/)) ### Optional -- сделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: пользователи, уже присутствующие в базе и диапазоны (начальный-конечный email) в чанке, -если его обработка закончилась с ошибкой + причина отказа в импорте для каждого пользователя/диапазона. +- сделать сохранение пользователей чанками в несколько потоков (по мере чтения xml). Результат импорта: email пользователей, уже присутствующие в базе и диапазоны (начальный-конечный email) в чанке, +если обработка чанка закончилась с ошибкой (`InterruptedException / ExecutionException`) + причина отказа для пользователя/диапазона. + - дополнительный материал: - [Speed up insertion performance in PostgreSQL](http://stackoverflow.com/a/12207237/548473) - [COPY — копировать данные между файлом и таблицей](https://postgrespro.ru/docs/postgrespro/9.6/sql-copy) - -### Optional2 -- сделайте обработку `InterruptedException / ExecutionException`, вернув ошибку в диапазоне (начальный-конечный email) From 5238a4d3e9aa14309ba0daa9872cae1d43f84165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 13 Nov 2017 19:36:02 +0300 Subject: [PATCH 039/126] Update lesson04.md --- doc/lesson04.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lesson04.md b/doc/lesson04.md index 8e5e450..6198f9e 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -136,3 +136,7 @@ mvn dependency:analyze - дополнительный материал: - [Speed up insertion performance in PostgreSQL](http://stackoverflow.com/a/12207237/548473) - [COPY — копировать данные между файлом и таблицей](https://postgrespro.ru/docs/postgrespro/9.6/sql-copy) + +## Замечания: +- 1: при вставке вам помогут JDBI аннотации `@BindBean` и `@BatchChunkSize` +- 2: чтобы при Batch вставке не нагружать базу вызовами `nextval` можно id генерить самостоятельно (используя `ALTER SEQUENCE`). При этом результат `int[]` в insertBatch возвращается с тем же размером, что и `List` From f119a2d3d35c2256582fcd54cde51296115ac55e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 13 Nov 2017 19:39:18 +0300 Subject: [PATCH 040/126] Update lesson04.md --- doc/lesson04.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 6198f9e..222766b 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -139,4 +139,5 @@ mvn dependency:analyze ## Замечания: - 1: при вставке вам помогут JDBI аннотации `@BindBean` и `@BatchChunkSize` -- 2: чтобы при Batch вставке не нагружать базу вызовами `nextval` можно id генерить самостоятельно (используя `ALTER SEQUENCE`). При этом результат `int[]` в insertBatch возвращается с тем же размером, что и `List` +- 2: чтобы при Batch вставке не нагружать базу вызовами `nextval` можно id генерить самостоятельно (используя `ALTER SEQUENCE`). +- 3: без `@GetGeneratedKeys` результат `int[]` в insertBatch возвращается с тем же размером, что и `List` From a1a02db726ed6f93fa016d721937b9e0a664ded3 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 14 Nov 2017 00:20:53 +0300 Subject: [PATCH 041/126] Add lesson05 --- doc/lesson05.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 doc/lesson05.md diff --git a/doc/lesson05.md b/doc/lesson05.md new file mode 100644 index 0000000..01d3d35 --- /dev/null +++ b/doc/lesson05.md @@ -0,0 +1,64 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFei05cGNKbEM3eG8) (скачать все патчи можно через Download папки patch) + +#### 5_0_fix_HW3_jaxb_stax.patch +> - Fix `upload` finalName +> - Добавил `fileSizeThreshold` в `UploadServlet` +> - Рефакторинг `JaxbParser` и реализация `UserProcessor` через StAX + JAXB ([HW3 Optional, пункт 2](https://github.com/JavaWebinar/masterjava/blob/doc/doc/lesson03.md#optional)) + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW4 + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Сохранение в базу в batch-моде с обработкой конфликтов](https://drive.google.com/file/d/0B9Ye2auQ_NsFZEJwR2ZqMEdVRG8) + +#### 5_1_HW4_export_chunk.patch +> Добавил `required` в `upload.html` + +``` +mvn clean -pl web\upload -am package +cd web/upload +mvn org.codehaus.cargo:cargo-maven2-plugin:run +``` +[URL to Upload](http://localhost:8080/upload) + +#### 5_2_HW4_webapp_users.patch +**!! Перед применением патча создате каталог `web\webapp\src`** +#### 5_3_HW4_already_present.patch +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Вставка в несколько потоков](https://drive.google.com/file/d/0B9Ye2auQ_NsFek5PYTdQbjBlUU0) +#### 5_4_HW4_parallel.patch +> Fix: в `UserProcessor.process` нельзя делать `85: chunk.clean()`, тк этот список асинхронно используется для вставки. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг](https://drive.google.com/open?id=1VNKqKrIhl4qQEkm8uIwnHuC6aAQnfR63) +#### 5_5_HW4_parallel2.patch + +---------------- +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Конфигурирование приложения +**ВНИМАНИЕ! перед накаткой патча создейте в `common` каталог `\src` , иначе патч промахивается (от корня `common\src`).** +#### 5_6_typesafe_config.patch +> Не забудте положить `persist.conf` в `/apps/masterjava/config` (или убрать `required` из `persist\src\main\resources\persist.conf`) + +- Переопределение занчений в конфигурации в Spring. +- Встроенные профили Spring Boot +- Apache commons-configuration2 +- Typesafe config library , user in Playframework + - HOCON Syntax: Include, required(), Substitutions + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. Lombok +#### 5_7_lombok.patch +- Подключаем Lombok +- Фичи Lombok +- [Ten More Ways to Reduce Boilerplate with Lombok](https://www.sitepoint.com/beyond-pojos-ten-ways-reduce-boilerplate-lombok/) +- Подключение к IDEA +- Drawbacks, Call super constructor +- Declutter Your POJOs with Lombok + +## Домашнее задание +- добавить в DB и сделать DAO для городов, групп и проектов (города и группы как - foreign keys) +- добавить тесты на DAO +- добавить в модуле `upload` импорт и сохранение в базу городов (импорт групп и проектов будут в следующем ДЗ) + - предполагается, что пользователей будет много, а городов, групп, проектов- на порядки меньше. + - если город уже есть в базе, просто пропускаем (не считаем ошибкой) + +#### Optional +- добавить при импорте пользователей связи на города + - если город юзера отсутствует в базе - ошибка импорта From a18b98a32bc388e3e8da2b0e3376eec03e709ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 14 Nov 2017 00:29:33 +0300 Subject: [PATCH 042/126] Update lesson05.md --- doc/lesson05.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index 01d3d35..eee63a2 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -21,8 +21,9 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run ``` [URL to Upload](http://localhost:8080/upload) +**ВНИМАНИЕ! перед накаткой патча создайте каталог `web\webapp\src`** #### 5_2_HW4_webapp_users.patch -**!! Перед применением патча создате каталог `web\webapp\src`** + #### 5_3_HW4_already_present.patch ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Вставка в несколько потоков](https://drive.google.com/file/d/0B9Ye2auQ_NsFek5PYTdQbjBlUU0) #### 5_4_HW4_parallel.patch From c97c47b63221a4b3384d9a05e9c8809cffd6e279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 14 Nov 2017 00:42:03 +0300 Subject: [PATCH 043/126] Update lesson05.md --- doc/lesson05.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index eee63a2..407cfb6 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -36,7 +36,9 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Конфигурирование приложения **ВНИМАНИЕ! перед накаткой патча создейте в `common` каталог `\src` , иначе патч промахивается (от корня `common\src`).** #### 5_6_typesafe_config.patch -> Не забудте положить `persist.conf` в `/apps/masterjava/config` (или убрать `required` из `persist\src\main\resources\persist.conf`) +> Перенес `compile/runtime` транзитивные зависимости из `parent` в `common`. Таким образом мы можен наследоваться от `parent` и не тянуть при этом все общие jar библиотеки + +**ВНИМАНИЕ!! Не забудте положить `persist.conf` в `/apps/masterjava/config` (или убрать `required` из `persist\src\main\resources\persist.conf`)** - Переопределение занчений в конфигурации в Spring. - Встроенные профили Spring Boot From 7fa25b0daff4e262e81d87b0bfae33940acdb394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 14 Nov 2017 00:47:12 +0300 Subject: [PATCH 044/126] Update lesson04.md --- doc/lesson04.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 222766b..65edab4 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -140,4 +140,4 @@ mvn dependency:analyze ## Замечания: - 1: при вставке вам помогут JDBI аннотации `@BindBean` и `@BatchChunkSize` - 2: чтобы при Batch вставке не нагружать базу вызовами `nextval` можно id генерить самостоятельно (используя `ALTER SEQUENCE`). -- 3: без `@GetGeneratedKeys` результат `int[]` в insertBatch возвращается с тем же размером, что и `List` +- 3: без `@GetGeneratedKeys` результат `int[]` в insertBatch возвращается с тем же размером, что и `List`. Значение 0 в возвращаемом массиве означает, что запись не вставилась. From dd3180a0cc398c0eff0ddc352cb532900d2c7386 Mon Sep 17 00:00:00 2001 From: gkislin Date: Thu, 16 Nov 2017 02:20:23 +0300 Subject: [PATCH 045/126] Update lesson05 --- doc/lesson05.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index 407cfb6..3ca69fd 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -2,11 +2,6 @@ ## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFei05cGNKbEM3eG8) (скачать все патчи можно через Download папки patch) -#### 5_0_fix_HW3_jaxb_stax.patch -> - Fix `upload` finalName -> - Добавил `fileSizeThreshold` в `UploadServlet` -> - Рефакторинг `JaxbParser` и реализация `UserProcessor` через StAX + JAXB ([HW3 Optional, пункт 2](https://github.com/JavaWebinar/masterjava/blob/doc/doc/lesson03.md#optional)) - ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW4 ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Сохранение в базу в batch-моде с обработкой конфликтов](https://drive.google.com/file/d/0B9Ye2auQ_NsFZEJwR2ZqMEdVRG8) @@ -29,7 +24,7 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run #### 5_4_HW4_parallel.patch > Fix: в `UserProcessor.process` нельзя делать `85: chunk.clean()`, тк этот список асинхронно используется для вставки. -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг](https://drive.google.com/open?id=1VNKqKrIhl4qQEkm8uIwnHuC6aAQnfR63) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг](https://drive.google.com/open?id=1IYCUi8bPbP0FTp_Nylzh8Ssbu-rXahVX) #### 5_5_HW4_parallel2.patch ---------------- From 316fe39a806ae8bab66bc47b47db65cd82fc6f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sat, 18 Nov 2017 22:02:05 +0300 Subject: [PATCH 046/126] Update lesson05.md --- doc/lesson05.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson05.md b/doc/lesson05.md index 3ca69fd..71b6f7b 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -22,6 +22,7 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run #### 5_3_HW4_already_present.patch ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Вставка в несколько потоков](https://drive.google.com/file/d/0B9Ye2auQ_NsFek5PYTdQbjBlUU0) #### 5_4_HW4_parallel.patch +**Внимание! в postgres 10 с squence могут быть проблемы** > Fix: в `UserProcessor.process` нельзя делать `85: chunk.clean()`, тк этот список асинхронно используется для вставки. ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг](https://drive.google.com/open?id=1IYCUi8bPbP0FTp_Nylzh8Ssbu-rXahVX) From 72230373a04c5f90a88658a343a9938fe8eab60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sat, 18 Nov 2017 22:02:25 +0300 Subject: [PATCH 047/126] Update lesson05.md --- doc/lesson05.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index 71b6f7b..fadeec5 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -22,7 +22,7 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run #### 5_3_HW4_already_present.patch ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Вставка в несколько потоков](https://drive.google.com/file/d/0B9Ye2auQ_NsFek5PYTdQbjBlUU0) #### 5_4_HW4_parallel.patch -**Внимание! в postgres 10 с squence могут быть проблемы** +**Внимание! в postgres 10 с sequence могут быть проблемы** > Fix: в `UserProcessor.process` нельзя делать `85: chunk.clean()`, тк этот список асинхронно используется для вставки. ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг](https://drive.google.com/open?id=1IYCUi8bPbP0FTp_Nylzh8Ssbu-rXahVX) From 219d35b6f0615168373cd3e417d055b1cc598621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 20 Nov 2017 12:10:15 +0300 Subject: [PATCH 048/126] Update lesson05.md --- doc/lesson05.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson05.md b/doc/lesson05.md index fadeec5..5705c93 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -55,6 +55,7 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run - добавить в DB и сделать DAO для городов, групп и проектов (города и группы как - foreign keys) - добавить тесты на DAO - добавить в модуле `upload` импорт и сохранение в базу городов (импорт групп и проектов будут в следующем ДЗ) + - загружаем `payload.xml` - предполагается, что пользователей будет много, а городов, групп, проектов- на порядки меньше. - если город уже есть в базе, просто пропускаем (не считаем ошибкой) From 704373145c0e61ecb32b3507a5e26bcfe716e9a9 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 21 Nov 2017 00:04:19 +0300 Subject: [PATCH 049/126] Add lesson06 --- doc/lesson06.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 doc/lesson06.md diff --git a/doc/lesson06.md b/doc/lesson06.md new file mode 100644 index 0000000..b45a417 --- /dev/null +++ b/doc/lesson06.md @@ -0,0 +1,105 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFVEJBS3VzVnBtMnc) + + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW5 + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Реализация модели/DAO/JUnit](https://drive.google.com/open?id=0B9Ye2auQ_NsFZzA1OHBUNExGdEk) +#### Apply 6_1_HW5_model_sql.patch +> - Перенес sql файлы в корневую папку `sql` +> - Изменения базы оставил только в файле миграции `databaseChangeLog.sql` +> - Сделал первичный ключ PK `city.ref`. Это справочник, и важно, чтобы внешние ссылки FK на него можно было вставить без заморочек. + У нас на одном проекте были проблемы, когда на разных окружениях справочные таблицы имели разные id. Данные нельзя было просто вставить скриптами миграции sql без подселектов или программного кода и + была задача привести их всех к одинаковым `id`. С `ref` как PK все упростится. Хотя у кого-то может быть другой опыт:) + +- Также см. отдельную тему **Миграция DB** в уроке. +- Скрип миграции `lb_apply.bat` (на sh переведите сами, если unix) можно запускать много раз. По истории смотрится, чтобы каждый ChangeSet накатился только 1 раз. +- [Liquibase](http://www.liquibase.org/) + - [Downloads](http://www.liquibase.org/download) + - [Run migration](http://www.liquibase.org/quickstart.html) + +#### Apply 6_2_HW5_dao_test.patch +> в `CityDaoTest` и `ProjectDaoTest` также выделил `init()` + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Реализация `export` +> - Классы `Result/ChunkResult/GroupResult` упростил до `List` +> - Переименовал +> - `ProcessPayload -> PayloadProcessor` +> - `CityExport -> CityProcessor` +> - `UserExport -> UserProcessor` + +#### Apply 6_3_HW5_add_PayloadProcessor.patch +#### Apply 6_4_HW5_NEW_add_CityProcessor.patch + +---------------- + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Миграция DB +- Liquibase (Dropwizard Migrations) +- Flyway (Liquibase vs FLyway which one to use?) +- MyBatis Migrations +- Техника безопасности при работе с PostgreSQL +- История про несогласованные данные +- DB Migration rules + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Веб-сервисы +#### Apply 6_5_web_services.patch + +- Веб-служба. Web service +- Примеры SOAP: + - Веб-сервис Центробанка, для получения ежедневных данных. + - Яндекса проверки правописания. + - Yandex каталог технологий + - Ряд веб сервисов авиастатистики, для мониторинга полетов, сведений о погоде, и.т.п. +- Resource vs. service +- REST vs SOAP. + +#### REST. +- 10 Best Practices for Better RESTful API + - JAX-RS, WADL + +#### SOAP +- SOAP веб-сервисы. +- WSDL. +- Web Services Standards. + +#### Java реализации. +- JAX-WS. SAAJ. JAX-RPC. +- JAX-WS vs Axis2 vs CXF. CFX vs AXIS. CXF vs Spring-WS +- AXIS vs CXF vs Spring WebServices +- Web Service Framework Comparison +- Contract-first and Contract-last styles +- Spring-WS Message Factories + +#### Имплементируем Mail Service +- JAX-WS Tutorial + - GlassFish » Metro » JAX-WS + - MailService WSDL / XSD +- Тестирование через SoapUI. + +---------------- +## Домашнее задание +- Реализовать `MailSender` с конфигурированием параметров в `mail.conf` + - Commons Email + - Параметры почты (yandex): +``` + mail.host: smtp.yandex.ru + mail.port: 465 + mail.username: user@yandex.ru + mail.password: password + mail.useSSL: true + mail.useTLS: false + mail.debug: true + mail.fromName: Name +``` +- Сохранят результат отправки писем в DB (в `MailSender`). +- DAO и модель для сохранения сделать в модуле `mail-service` +- Протестировать отправку почты через SoapUI и/или `MailServiceClient` + +#### Optional +- добавить в модуле `upload` импорт и сохранение в базу групп и проектов (упрощение: только добавление без удаления/модификации) +- добавить при импорте пользователей связи на группы + - если пользователь уже есть в базе, поведение остается прежним: сразу ошибка импорта + - если пользователь новый, добавляется он и его группы + - если какая-либо группа пользователя отсутствует в базе - ошибка импорта + - подсказка- пользователей много, а их групп еще больше. Задача не положить базу при большом импорте актуальна \ No newline at end of file From 3dc38071c686bc69feb4d6e353c4a30b7d7b92d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 21 Nov 2017 00:08:35 +0300 Subject: [PATCH 050/126] Update lesson06.md --- doc/lesson06.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index b45a417..2d057e4 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -22,7 +22,7 @@ #### Apply 6_2_HW5_dao_test.patch > в `CityDaoTest` и `ProjectDaoTest` также выделил `init()` -### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Реализация `export` +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Реализация `upload` с городами > - Классы `Result/ChunkResult/GroupResult` упростил до `List` > - Переименовал > - `ProcessPayload -> PayloadProcessor` @@ -102,4 +102,4 @@ - если пользователь уже есть в базе, поведение остается прежним: сразу ошибка импорта - если пользователь новый, добавляется он и его группы - если какая-либо группа пользователя отсутствует в базе - ошибка импорта - - подсказка- пользователей много, а их групп еще больше. Задача не положить базу при большом импорте актуальна \ No newline at end of file + - подсказка- пользователей много, а их групп еще больше. Задача не положить базу при большом импорте актуальна From 54e4a42fede14f20b967a62203d4d3603c2b0687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 21 Nov 2017 00:09:21 +0300 Subject: [PATCH 051/126] Update lesson06.md --- doc/lesson06.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index 2d057e4..65c7785 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -102,4 +102,4 @@ - если пользователь уже есть в базе, поведение остается прежним: сразу ошибка импорта - если пользователь новый, добавляется он и его группы - если какая-либо группа пользователя отсутствует в базе - ошибка импорта - - подсказка- пользователей много, а их групп еще больше. Задача не положить базу при большом импорте актуальна + - подсказка: пользователей много, а их групп еще больше. Задача не положить базу при большом импорте актуальна From a2dd8a2e0a4f445d33985b7fd0cf3d6de62f1585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 27 Nov 2017 00:39:18 +0300 Subject: [PATCH 052/126] Update lesson06.md --- doc/lesson06.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index 65c7785..82622e6 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -102,4 +102,4 @@ - если пользователь уже есть в базе, поведение остается прежним: сразу ошибка импорта - если пользователь новый, добавляется он и его группы - если какая-либо группа пользователя отсутствует в базе - ошибка импорта - - подсказка: пользователей много, а их групп еще больше. Задача не положить базу при большом импорте актуальна + - подсказка: пользователей много, а их групп еще больше. Если в чанке 2000 юзеров, не делайте 2001 запрос к базе при вставке 1го чанка. From aac2d3f2b5afdb514265f092a0a08030f09ecca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 27 Nov 2017 14:27:01 +0300 Subject: [PATCH 053/126] Update lesson06.md --- doc/lesson06.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index 82622e6..2d8c22b 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -102,4 +102,10 @@ - если пользователь уже есть в базе, поведение остается прежним: сразу ошибка импорта - если пользователь новый, добавляется он и его группы - если какая-либо группа пользователя отсутствует в базе - ошибка импорта - - подсказка: пользователей много, а их групп еще больше. Если в чанке 2000 юзеров, не делайте 2001 запрос к базе при вставке 1го чанка. + +## Замечания: + - пользователей много, а их групп еще больше. Если в чанке 2000 юзеров, не делайте 2001 запрос к базе при вставке 1го чанка. + - не считывате конфигурацию при каждой отсылке email + - попробуйте не дублировать инициализацию базы в `mail-service` + - Guide to using attached tests + From eb0ec79c24c79997a6a44cf33a051bdcad70a8cf Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 28 Nov 2017 06:19:20 +0300 Subject: [PATCH 054/126] Add lesson07 --- doc/lesson07.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 doc/lesson07.md diff --git a/doc/lesson07.md b/doc/lesson07.md new file mode 100644 index 0000000..879b35c --- /dev/null +++ b/doc/lesson07.md @@ -0,0 +1,71 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFbXFnekNDSmJzS1k) (скачать все патчи можно через Download папки patch) +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW6 +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Реализация `MailSender` +#### Apply 7_1_HW5_MailSender.patch +- List-Unsubcribe +- Amazon Simple Email Service + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Сохранение результатов отправки в DB +#### Apply 7_2_HW6_mail_history.patch +**Добавляем таблицу `mail_hist` через миграцию: после патча просто запускаем `config_templates\sql\lb_apply.bat`** + +> - В `mail_hist` удалил `body` и переименовал `date` -> `datetime` +> - Чтобы `mail-service` не зависел от `persist` можно было сделать еще один модуль `common-persist` + +- Resolving Maven circular dependencies +- Guide to using attached tests + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Импорт Проектов и Групп +#### Apply 7_3_NEW_HW6_ProjectGroupImporter.patch +> - Вынес общий `JaxbParser` в `PayloadProcessor` +> - Сделал `ProjectGroupProcessor` через `JaxbUnmarshaller` + +#### Apply 7_4_HW6_refactor_UserProcessor.patch +> - Вместо бина `List` сделал добавил 2й список `List` +> - Сделал батч вставку User и UserGroup в одной транзакции (для корректной работы повторного upload) +> - После вставки делаю очистку листов чанков (119, 120). Ссылки на них как closure попадают в `Future`, которые мы храним в `chunkFutures`, поэтому gc их не может удалить. + +- [Examples for org.skife.jdbi.v2.TransactionCallback](https://www.programcreek.com/java-api-examples/index.php?api=org.skife.jdbi.v2.TransactionCallback) +- Замечание в видео по поводу split: [Performance это праздник](https://habrahabr.ru/post/326242/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Стили WSDL. Кастомизация WSDL +#### Apply 7_5_customize_WSDL.patch +- SOAP +- Стили WSDL + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. Публикация кастомизированного WSDL. Автогенерация. +#### Apply 7_6_publish_CustomizedWSDL.patch +- CXF + - IDEA bug of CXF integration + - accessExternalSchema property restriction + - Using the servlet transport without Spring +- Metro = JAX-WS RI + WSIT + - Web Services Interoperability Technologies (WSIT) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. Деплой в Tomcat +#### Apply 7_7_deploy_Tomcat.patch +> [http://localhost:8080/mail/mailService](http://localhost:8080/mail/mailService) + +- JAX-WS + Tomcat +- Deploy JAX-WS web services on Tomcat +- Deploying JAX-WS Services without web.xml +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Создание клиента почтового сервиса. +#### Apply 7_8_create_client.patch +- Dynamically Change a Web Service Endpoint URL +- Fix thread safe JAX-WS client call +---------------- + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 8. [Реализация массовой и групповой отправки почты. HW7](https://drive.google.com/file/d/0B9Ye2auQ_NsFLWVfaEhFU1ctNjA) +> Подправил `GroupResult/ MailResult` для сериализации/десериализации в xml + +#### Apply 7_9_refactoring_send_to_group.patch +#### Apply 7_10_send_bulk.patch + +## Домашнее задание +- Расшарить wsdl для всех модулей в `\apps\masterjava\config\wsdl` +- Обновить `mailService.wsdl` в соответствии с реализацией (+пофиксить проблемы) и протестировать работу сервиса + +### Optional +- Сделать в модуле `web` простой интерфейс для выбора пользователей из таблицы и отправки им почты From f5516fb891e92eb16bd329f5462a7a25e9c70927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 28 Nov 2017 06:22:54 +0300 Subject: [PATCH 055/126] Update lesson07.md --- doc/lesson07.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson07.md b/doc/lesson07.md index 879b35c..fe46a79 100644 --- a/doc/lesson07.md +++ b/doc/lesson07.md @@ -9,7 +9,7 @@ ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Сохранение результатов отправки в DB #### Apply 7_2_HW6_mail_history.patch -**Добавляем таблицу `mail_hist` через миграцию: после патча просто запускаем `config_templates\sql\lb_apply.bat`** +**Добавляем таблицу `mail_hist` через миграцию: после патча просто запускаем `\sql\lb_apply.bat`** > - В `mail_hist` удалил `body` и переименовал `date` -> `datetime` > - Чтобы `mail-service` не зависел от `persist` можно было сделать еще один модуль `common-persist` From 369c7529a6c052d95859e1a7ffa43c536b1f02f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 4 Dec 2017 23:33:23 +0300 Subject: [PATCH 056/126] Update lesson07.md --- doc/lesson07.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson07.md b/doc/lesson07.md index fe46a79..fd55ad3 100644 --- a/doc/lesson07.md +++ b/doc/lesson07.md @@ -68,4 +68,4 @@ - Обновить `mailService.wsdl` в соответствии с реализацией (+пофиксить проблемы) и протестировать работу сервиса ### Optional -- Сделать в модуле `web` простой интерфейс для выбора пользователей из таблицы и отправки им почты +- Сделать в модуле `web` простой интерфейс для выбора пользователей из таблицы и отправки им почты (`subject` и `body` также элементы интерфейса) From 1a0b8227d98a3288161e869cf9c93ff3134b9844 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 5 Dec 2017 02:19:36 +0300 Subject: [PATCH 057/126] Add lesson08 --- doc/lesson08.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 doc/lesson08.md diff --git a/doc/lesson08.md b/doc/lesson08.md new file mode 100644 index 0000000..0fc7860 --- /dev/null +++ b/doc/lesson08.md @@ -0,0 +1,35 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFeUFhRGRETk80MkE) + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW7 + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Делаем общий `mailService.wsdl` +> Напомню, что общие wsdl ресурсы хранятся в `${masterjava.config}/wsdl` + +#### Apply 1_HW7_wsdl_share.patch +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Доступ к переменным maven в приложении +#### Apply 2_app_conf.patch +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Обновление WSDL](https://drive.google.com/file/d/0B9Ye2auQ_NsFWDFRYm5uNlJlNmM) +#### Apply 3_HW7_update_wsdl.patch +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Отправка почты из модуля `webapp` +#### Apply 4_HW7_webapp.patch + +---- +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. SOAP Exception. Выделение общей части схемы +**ВНИМАНИЕ! перед накаткой патча создейте в `services` каталог `\common-ws` (от корня `services\common-ws`)** +#### Apply 5_soap_exceptions.patch +- Передача по SOAP Exception + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. [Коррекция схемы](https://drive.google.com/file/d/0B9Ye2auQ_NsFZ1FmODdWcmlKdUk) +#### Apply 6_fix_wsdl_and_schema.patch + +-------------- +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Домашнее задание +Сделать отправку почты из модуля web c вложениями: +- Binary Data Transmission Using MTOM/XOP +- Тестирование вложений через SoapUi. +- Sending emails with attachments + +### Optional +- Добавить Git revision в `version.html` From fa662b58ca9a96603a7061253e96a4a62fb95ad0 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 5 Dec 2017 02:28:46 +0300 Subject: [PATCH 058/126] Update lesson08 --- doc/lesson08.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/lesson08.md b/doc/lesson08.md index 0fc7860..e542539 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -13,10 +13,16 @@ ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Обновление WSDL](https://drive.google.com/file/d/0B9Ye2auQ_NsFWDFRYm5uNlJlNmM) #### Apply 3_HW7_update_wsdl.patch ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Отправка почты из модуля `webapp` +> Убрал обработку эксепшенов в `MailWSClient` (есть в `SendServlet`) и заменил `$.ajax` на `$.post` + #### Apply 4_HW7_webapp.patch +- [jQuery.post() done and success](https://stackoverflow.com/a/22213543/548473) + ---- ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. SOAP Exception. Выделение общей части схемы +> Удалил `GroupResult.failedCause` и сделал вместо него `WebStateException` (бросается из `MailServiceExecutor`) + **ВНИМАНИЕ! перед накаткой патча создейте в `services` каталог `\common-ws` (от корня `services\common-ws`)** #### Apply 5_soap_exceptions.patch - Передача по SOAP Exception From a4159e1de25ec75b8804ba01f804c80b5054fce5 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 5 Dec 2017 02:31:26 +0300 Subject: [PATCH 059/126] Update lesson08 --- doc/lesson08.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/lesson08.md b/doc/lesson08.md index e542539..44196bd 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -27,7 +27,9 @@ #### Apply 5_soap_exceptions.patch - Передача по SOAP Exception -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. [Коррекция схемы](https://drive.google.com/file/d/0B9Ye2auQ_NsFZ1FmODdWcmlKdUk) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. [Коррекция схемы](https://drive.google.com/file/d/0B9Ye2auQ_NsFZ1FmODdWcmlKdUk) +> Анологично `Addressee` поправил `MailResult` + #### Apply 6_fix_wsdl_and_schema.patch -------------- From 2e34f4b426f2e63117188a61d8e8bab20c1dd709 Mon Sep 17 00:00:00 2001 From: gkislin Date: Sun, 10 Dec 2017 20:15:03 +0300 Subject: [PATCH 060/126] Update lesson08 --- doc/lesson08.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/lesson08.md b/doc/lesson08.md index 44196bd..a6d31e4 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -32,8 +32,15 @@ #### Apply 6_fix_wsdl_and_schema.patch +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Добавление мавен плагинов](https://drive.google.com/open?id=0B9Ye2auQ_NsFYnhDWG03Z3R6Y0E) +#### Apply 8_7_mvn_plugins.patch +- [Copy Rename Maven Plugin](https://coderplus.github.io/copy-rename-maven-plugin/usage.html) +- [Maven AntRun Plugin](http://maven.apache.org/plugins/maven-antrun-plugin/usage.html) +- [Maven Liquibase Plugin](http://www.liquibase.org/documentation/maven/) + + -------------- -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Домашнее задание +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 8. Домашнее задание Сделать отправку почты из модуля web c вложениями: - Binary Data Transmission Using MTOM/XOP - Тестирование вложений через SoapUi. From b0f6977e357f89fab747ae791166a85028f8940e Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 12 Dec 2017 01:17:04 +0300 Subject: [PATCH 061/126] Add lesson09 --- doc/lesson09.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 doc/lesson09.md diff --git a/doc/lesson09.md b/doc/lesson09.md new file mode 100644 index 0000000..74142bd --- /dev/null +++ b/doc/lesson09.md @@ -0,0 +1,64 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFd3pjNWZpR0QzVWs) + +### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Правка + +#### Apply 9_0_fix_package.patch +> - В модуле `common-ws` перенес пакет `ru.javaops.web` в `ru.javaops.masterjava.web` + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW8 +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Реализация вложений в веб-сервисе](https://drive.google.com/open?id=0B9Ye2auQ_NsFbER6Rjc4dHRGODA) +#### Apply 9_1_HW8_service_attach.patch +> Переименовал `Attach` в `Attachment` + +- Binary Data Transmission Using MTOM/XOP +- Тестирование вложений через SoapUi. + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Подключение MTOM](https://drive.google.com/open?id=0B9Ye2auQ_NsFeF8yWVBUbHd6Y0k) +#### Apply 9_2_HW8_MTOM.patch + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Реализация загрузки вложений в модуле webapp](https://drive.google.com/open?id=0B9Ye2auQ_NsFaVhpMkZRV3lSUlU) +> - Реализовал загрузку вложения через jQuery `FormData()` и Servlet 3 `@MultipartConfig` + +- [Sending multipart/formdata with jQuery](https://stackoverflow.com/a/5976031/548473) + +#### Apply 9_3_HW8_webapp_attach.patch + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Реализация вложений в почте](https://drive.google.com/open?id=0B9Ye2auQ_NsFQ0RZNktReWRoYjQ) +#### Apply 9_4_HW8_mail_attach.patch + +### [Git revision](https://habrahabr.ru/post/310738/) +#### Apply 9_5_HW8_git_revision.patch +> Не забудте обновит `/apps/masterjava/config` новыми файлами конфигурации + +--------------------- + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [JAX-WS Message Context. Авторизация](https://drive.google.com/open?id=0B9Ye2auQ_NsFSEdYZzR3OGxxLVk) +#### Apply 9_6_msg_ctx_auth.patch + +- Message Context in JAX-WS +- Application Authentication with JAX-WS + - Container Authentication + +#### Асинхронный вызов через @OneWay + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. [JAX-WS Handlers](https://drive.google.com/open?id=0B9Ye2auQ_NsFYjhDUGM2N0tHVDg) +#### Apply 9_7_logging_handlers.patch +> Сделал `Client/Server LoggingHandler` внутренними классами `SoapLoggingHandlers` + +- Handlers in JAX-WS + - SOAP handler sample + - Message Context + + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Домашнее задание. Статистика](https://drive.google.com/open?id=0B9Ye2auQ_NsFWGI0ejBZZ21Cc0k) +#### Apply 9_8_prepare_HW9.patch +> Поломалась конфигурация `endpoint`, в ДЗ требуется починить + + - Сделать отдельный Handler статистики трафика веб-сервиса (в статистике только логирование) + - Сделать авторизацию в `mailService` через `SoapServerSecurityHandler` + +#### Optional + - Вынести уровень логирования веб-сервисов и креденшелы авторизации в конфигурацию (`host.conf`) + - Сделать (отнаследовать) для `mail-service` свои хендлеры логирования и авторизации с настройками из конфигурации From 82e8e468a83fd244b1b680db9363404f81f98809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 12 Dec 2017 13:35:41 +0300 Subject: [PATCH 062/126] Update lesson04.md --- doc/lesson04.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 65edab4..f93a6f2 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -125,7 +125,7 @@ mvn dependency:analyze - Simple EntityMapper with `@Column` support ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW4 -- в модуле **upload** сохранить всех импортированных пользователей в базе (записи просто добавляются в таблицу `users`). Делать вставку группами (chunk) в [batch моде](http://jdbi.org/sql_object_api_batching/). Количестово пользователей в chunk принимать с UI как параметр +- в модуле **upload** сохранить всех импортированных пользователей в базе (записи просто добавляются в таблицу `users`). Делать вставку группами (chunk) в [batch моде](http://jdbi.org/jdbi2/sql_object_api_batching/). Количестово пользователей в chunk принимать с UI как параметр - сделать отображение первых 20 пользователей в модуле **webapp** - добавить в таблицу `users` уникальный индекс на `email` и вставлять в базу только новых пользователей. Результат импорта: пользователи, уже присутствующие в базе ([POSTGRES: INSERT ON CONFLICT](https://habrahabr.ru/post/264281/)) From 19919a10c86e74c854c752353d1e2ea20e35f1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 12 Dec 2017 13:39:09 +0300 Subject: [PATCH 063/126] Update lesson04.md --- doc/lesson04.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index f93a6f2..80452e7 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -105,7 +105,7 @@ mvn dependency:analyze - MyBatis, MyBatis tutorial (CRUD) - Commons DbUtils, доработка commons-dbutils - jDBI sample - - JDBI + - JDBI - JDBI tutorial (Dropwizard JDBI) - [Combining Spring Boot and JDBI](https://www.sitepoint.com/combining-spring-boot-and-jdbi) From 7ef6e05cbcb49ce76536da967cdb194429ccd487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 18 Dec 2017 13:28:08 +0300 Subject: [PATCH 064/126] Update lesson09.md --- doc/lesson09.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson09.md b/doc/lesson09.md index 74142bd..292c29b 100644 --- a/doc/lesson09.md +++ b/doc/lesson09.md @@ -54,7 +54,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Домашнее задание. Статистика](https://drive.google.com/open?id=0B9Ye2auQ_NsFWGI0ejBZZ21Cc0k) #### Apply 9_8_prepare_HW9.patch -> Поломалась конфигурация `endpoint`, в ДЗ требуется починить +> После обновления `hosts.conf` в `masterjava.config (/apps/masterjava/config/)` поломается конфигурация `endpoint`, в ДЗ требуется починить - Сделать отдельный Handler статистики трафика веб-сервиса (в статистике только логирование) - Сделать авторизацию в `mailService` через `SoapServerSecurityHandler` From 9657e3991eaf05ecdbefd465bba5ab0dcb4dfaac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 18 Dec 2017 13:31:48 +0300 Subject: [PATCH 065/126] Update lesson09.md --- doc/lesson09.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/lesson09.md b/doc/lesson09.md index 292c29b..3425561 100644 --- a/doc/lesson09.md +++ b/doc/lesson09.md @@ -61,4 +61,7 @@ #### Optional - Вынести уровень логирования веб-сервисов и креденшелы авторизации в конфигурацию (`host.conf`) + +## Замечания: + - в модуле `common-ws` находятся общие классы. Не хардкодьте туда `mail` сервис - Сделать (отнаследовать) для `mail-service` свои хендлеры логирования и авторизации с настройками из конфигурации From a7093c44ff134c1f3c57860e55f0f869ccb394cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 18 Dec 2017 13:32:14 +0300 Subject: [PATCH 066/126] Update lesson09.md --- doc/lesson09.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lesson09.md b/doc/lesson09.md index 3425561..50b0779 100644 --- a/doc/lesson09.md +++ b/doc/lesson09.md @@ -61,7 +61,8 @@ #### Optional - Вынести уровень логирования веб-сервисов и креденшелы авторизации в конфигурацию (`host.conf`) + - Сделать (отнаследовать) для `mail-service` свои хендлеры логирования и авторизации с настройками из конфигурации ## Замечания: - в модуле `common-ws` находятся общие классы. Не хардкодьте туда `mail` сервис - - Сделать (отнаследовать) для `mail-service` свои хендлеры логирования и авторизации с настройками из конфигурации + From 169a78a1680081bcdb4b20a1999e4c32e1f00dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 18 Dec 2017 13:38:56 +0300 Subject: [PATCH 067/126] Update lesson09.md --- doc/lesson09.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson09.md b/doc/lesson09.md index 50b0779..c94bca4 100644 --- a/doc/lesson09.md +++ b/doc/lesson09.md @@ -65,4 +65,4 @@ ## Замечания: - в модуле `common-ws` находятся общие классы. Не хардкодьте туда `mail` сервис - + - попробуйте вынести весь общий код в классы `common-ws` From 43879cc707ef01de6ebfb4cf0abb2da6d6916b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 18 Dec 2017 13:40:48 +0300 Subject: [PATCH 068/126] Update lesson09.md --- doc/lesson09.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson09.md b/doc/lesson09.md index c94bca4..4b76e19 100644 --- a/doc/lesson09.md +++ b/doc/lesson09.md @@ -64,5 +64,6 @@ - Сделать (отнаследовать) для `mail-service` свои хендлеры логирования и авторизации с настройками из конфигурации ## Замечания: + - обновите формат `hosts.conf` в `masterjava.config (/apps/masterjava/config/)` - в модуле `common-ws` находятся общие классы. Не хардкодьте туда `mail` сервис - попробуйте вынести весь общий код в классы `common-ws` From c45863d00278d7daac242a2c535498d3375a3fdb Mon Sep 17 00:00:00 2001 From: gkislin Date: Mon, 18 Dec 2017 21:53:41 +0300 Subject: [PATCH 069/126] Add lesson10 --- doc/lesson10.md | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 doc/lesson10.md diff --git a/doc/lesson10.md b/doc/lesson10.md new file mode 100644 index 0000000..93fb6f2 --- /dev/null +++ b/doc/lesson10.md @@ -0,0 +1,79 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFWGU0MTRQYkFQdEk) + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW9 +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Реализация SOAP handlers](https://drive.google.com/open?id=0B9Ye2auQ_NsFTVhpbTNCTDZ4bTA) +> - Для `SecurityHandler` в `mail-service` сделал родительский `MailHandlers` + +#### Apply 10_1_HW9_handlers.patch + +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Конфигурирование сервисов](https://drive.google.com/open?id=0B9Ye2auQ_NsFR1lybnQyRUJUUEU) +> Поправил в конфигурации [обработку null значений](https://github.com/typesafehub/config/issues/282) + +#### Apply 10_2_HW9_host_config.patch + +- Handle defaults in config + +---------------------------- + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [JavaEE](https://drive.google.com/open?id=0B9Ye2auQ_NsFUU92ZFBEZmJjb2c) +- Java Platform, Enterprise Edition +- Холивары в комментах +- CDI +- Enterprise JavaBeans +- TomEE состав +- Application Server statistics + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [JAX-RS](https://drive.google.com/file/d/0B9Ye2auQ_NsFeWQxTUVBSDFGMGM) +#### Apply 10_3_JAX_RS.patch +> - Обновил версию JAX-RS. См. [upgrage issue](https://github.com/jersey/jersey/issues/3664) +> - В `users.html` +> - сделал проверку на `"Addresses are not selected"` +> - в `done()` объект привожу к строке (JAX-RS возвращает json) +> - в `fail()` сделал вывод `result.responseText` + +#### Apply 10_4_jersey_logging.patch +> - [JAX-RS Test URL](http://localhost:8080/mail/rest/test) +> - [JAX-RS Detail WADL URL](http://localhost:8080/mail/rest/application.wadl?detail=true) + +- Jersey: RESTful Web Services in Java +- Modules and dependencies +- Example with web.xml +- Descriptor-less deployment + - [ServletContainerInitializer](http://stackoverflow.com/a/10784700/548473) + - [Servlet 3.0 ServletContainerInitializer and Spring WebApplicationInitializer](http://www.java-allandsundry.com/2014/03/servlet-30-servletcontainerinitializer.html) +- Jersey + MOXy JSON +- Validation +- Web Application Description Language (WADL) + - mail/rest/application.wadl + - wadl2java client stub generation + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. JMS +> - Вынес в `parent-web` версию ActiveMQ +> - Переименовал `SendServlet` в `SoapSendServlet` + +#### Apply 10_5_JMS.patch +> ![Внимание](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) **Для того, чтобы по JNDI приложение работало с JMS скопируйте:** +> - **`config_templates/context.xml` в `$TOMCAT_HOME/conf`** +> - **`$MAVEN_REPO(~/.m2)/org/apache/activemq/activemq-all/5.15.2/activemq-all-5.15.2.jar` в `$TOMCAT_HOME/lib`** + +- Java Message Service +- Queues +- JMS vs AMQP, AMQP +- ActiveMQ, HornetQ and RabbitMQ Performance Comparison +- ActiveMQ + Tomcat +- Embedded/StandAlone ActiveMQ, ActiveMQ transport, URI protocols +- Apache ActiveMQ and Tomcat sample + - [When close JMS connection/sessions](http://stackoverflow.com/questions/19772082/when-should-i-close-a-jms-connection-that-was-created-in-a-stateless-session-bea) + - [Cache JMS connections/sessions](https://developer.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions) + +## Домашнее задание +- Добавить аттачи в JAX-RS + - [File upload example in Jersey](http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey) **НЕ РАБОТАЕТ!** + - Jersey Multipart on Tomcat (вложения приходят, но пустые или обрезанные) +- Реализовать отсылку почты через JMS `ObjectMessage` + +#### Optional + - Починить вложения в JAX-RS (javax.mail читает поток из вложения 2 раза) + - Сделать вложения в JMS From 717687e550b10bd06bd01267b611dcd59c7e78e7 Mon Sep 17 00:00:00 2001 From: gkislin Date: Mon, 18 Dec 2017 22:02:43 +0300 Subject: [PATCH 070/126] Update lesson10 --- doc/lesson10.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/lesson10.md b/doc/lesson10.md index 93fb6f2..c26b8c6 100644 --- a/doc/lesson10.md +++ b/doc/lesson10.md @@ -54,9 +54,10 @@ > - Переименовал `SendServlet` в `SoapSendServlet` #### Apply 10_5_JMS.patch -> ![Внимание](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) **Для того, чтобы по JNDI приложение работало с JMS скопируйте:** -> - **`config_templates/context.xml` в `$TOMCAT_HOME/conf`** -> - **`$MAVEN_REPO(~/.m2)/org/apache/activemq/activemq-all/5.15.2/activemq-all-5.15.2.jar` в `$TOMCAT_HOME/lib`** +> ![Внимание](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) **Для того, чтобы по JNDI приложение работало с JMS сконфигурируйте Tomcat:** +> - Скопируйте +> - `config_templates/context.xml` в `$TOMCAT_HOME/conf` +> - `$MAVEN_REPO(~/.m2)/org/apache/activemq/activemq-all/5.15.2/activemq-all-5.15.2.jar` в `$TOMCAT_HOME/lib` - Java Message Service - Queues From a6ff98f891789db6063d204a151b6ebf133f3471 Mon Sep 17 00:00:00 2001 From: gkislin Date: Sun, 24 Dec 2017 21:53:54 +0300 Subject: [PATCH 071/126] Update lesson 10 --- doc/lesson10.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/lesson10.md b/doc/lesson10.md index c26b8c6..bf9cb6b 100644 --- a/doc/lesson10.md +++ b/doc/lesson10.md @@ -68,7 +68,14 @@ - Apache ActiveMQ and Tomcat sample - [When close JMS connection/sessions](http://stackoverflow.com/questions/19772082/when-should-i-close-a-jms-connection-that-was-created-in-a-stateless-session-bea) - [Cache JMS connections/sessions](https://developer.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions) - + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Авторизация в контейнере Tomcat](https://drive.google.com/file/d/0B9Ye2auQ_NsFcU1FU3FTQ25NNzA) +#### Apply 10_6_tomcat_auth.patch + +- [Realm Configuration HOW-TO](http://tomcat.apache.org/tomcat-8.0-doc/realm-howto.html) +- [Setup your own Tomcat security realm](http://www.christianschenk.org/blog/setup-your-own-tomcat-security-realm/) + + ## Домашнее задание - Добавить аттачи в JAX-RS - [File upload example in Jersey](http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey) **НЕ РАБОТАЕТ!** From 095db62043dcfc8829e2732f41fe34c78f86b96b Mon Sep 17 00:00:00 2001 From: gkislin Date: Sun, 24 Dec 2017 21:57:56 +0300 Subject: [PATCH 072/126] Update lesson 10 --- doc/lesson10.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lesson10.md b/doc/lesson10.md index bf9cb6b..821951e 100644 --- a/doc/lesson10.md +++ b/doc/lesson10.md @@ -17,7 +17,7 @@ ---------------------------- -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [JavaEE](https://drive.google.com/open?id=0B9Ye2auQ_NsFUU92ZFBEZmJjb2c) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [JavaEE](https://drive.google.com/open?id=0B9Ye2auQ_NsFUU92ZFBEZmJjb2c) - Java Platform, Enterprise Edition - Холивары в комментах - CDI @@ -25,7 +25,7 @@ - TomEE состав - Application Server statistics -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [JAX-RS](https://drive.google.com/file/d/0B9Ye2auQ_NsFeWQxTUVBSDFGMGM) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [JAX-RS](https://drive.google.com/file/d/0B9Ye2auQ_NsFeWQxTUVBSDFGMGM) #### Apply 10_3_JAX_RS.patch > - Обновил версию JAX-RS. См. [upgrage issue](https://github.com/jersey/jersey/issues/3664) > - В `users.html` @@ -49,7 +49,7 @@ - mail/rest/application.wadl - wadl2java client stub generation -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. JMS +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. JMS > - Вынес в `parent-web` версию ActiveMQ > - Переименовал `SendServlet` в `SoapSendServlet` @@ -69,7 +69,7 @@ - [When close JMS connection/sessions](http://stackoverflow.com/questions/19772082/when-should-i-close-a-jms-connection-that-was-created-in-a-stateless-session-bea) - [Cache JMS connections/sessions](https://developer.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions) -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Авторизация в контейнере Tomcat](https://drive.google.com/file/d/0B9Ye2auQ_NsFcU1FU3FTQ25NNzA) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. [Авторизация в контейнере Tomcat](https://drive.google.com/file/d/0B9Ye2auQ_NsFcU1FU3FTQ25NNzA) #### Apply 10_6_tomcat_auth.patch - [Realm Configuration HOW-TO](http://tomcat.apache.org/tomcat-8.0-doc/realm-howto.html) From ecbcee13c9597f7b5790f1cebc1b7621601f84f7 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 26 Dec 2017 04:36:27 +0300 Subject: [PATCH 073/126] Add lesson11 --- doc/lesson11.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 doc/lesson11.md diff --git a/doc/lesson11.md b/doc/lesson11.md new file mode 100644 index 0000000..9562fbb --- /dev/null +++ b/doc/lesson11.md @@ -0,0 +1,74 @@ +# Онлайн проекта Masterjava. + +## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFd1FnME50bEt6RDA) + +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW10 +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Отправка вложений по JAX-RS](https://drive.google.com/open?id=0B9Ye2auQ_NsFT3VmNXR2djRqM1E) +#### Apply 11_1_HW10_jersey_attach.patch +### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Отправка почты с вложениями по JMS](https://drive.google.com/open?id=0B9Ye2auQ_NsFdEZhVll2UFdCY0U) +#### Apply 11_2_HW10_JMS_attach.patch + +- [Недостатки ObjectMessage (или недостатки сериализации Java)]( http://jmesnil.net/weblog/2012/07/27/on-jms-objectmessage-and-its-pitfalls) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг. Эксепшены в Java 8 лямбда](https://drive.google.com/open?id=0B9Ye2auQ_NsFQUE4SzFQS2VDZ2M) +> Отправку по JMS листа аттачей + +#### Apply 11_3_HW10_JMS_attach_fix.patch +#### Apply 11_4_refactoring.patch +- [Pair (tuple) in Java](http://stackoverflow.com/questions/521171/a-java-collection-of-value-pairs-tuples) +- [Java 8 Lambda with exception](http://stackoverflow.com/questions/18198176/java-8-lambda-function-that-throws-exception) +- [What's Wrong in Java 8](https://dzone.com/articles/whats-wrong-java-8-part-iv) +- [Durian](https://github.com/diffplug/durian) ( [Дуриан](https://ru.wikipedia.org/wiki/Дуриан) ) + +> #### Дополнительно: +> #### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Николай Алименков - Нужен ли нам JMS в мире современных Java-технологий?](http://bekeriya.com/watch?v=RVwXdCfzJZA) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Concurrent and distributed applications toolkit AKKA](https://drive.google.com/open?id=0B9Ye2auQ_NsFR0tjc28tRzVHQVk) +> #### Внимание! Перед накаткой патчеа создайте в `services` каталог `akka-remote` (`services/akka-remote`) иначе файлы придется руками сюда перетаскивать. +> После патча скопируйте `akka.conf` в `${masterjava.config} (/apps/masterjava/config)` + +#### Apply 11_5_akka.patch +- [Wiki Akka (toolkit)](https://en.wikipedia.org/wiki/Akka_(toolkit)) +- [Модель акторов](https://ru.wikipedia.org/wiki/Модель_акторов) +- [Видео: Akka и его использование в Яндексе](http://2014.jpoint.ru/talks/07/) + - [Remoting](http://doc.akka.io/docs/akka/current/scala/remoting.html) + - [Remoting Sample](http://doc.akka.io/docs/akka/current/java/remoting.html#Remoting_Sample) + - [Tutorials](http://akka.io/downloads/) + - [Get started with Lightbend technologies](https://developer.lightbend.com/start) + - [Typesafe Changes Name to Lightbend](https://www.lightbend.com/blog/typesafe-changes-name-to-lightbend) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [Отсылка почты через AKKA Actors](https://drive.google.com/file/d/0B9Ye2auQ_NsFQWppSmxRYnVKX3M) +#### Apply 11_6_akka_typed.patch +> **При задержке выполнения актора более чем на 5 сек. будет вываливаться `AskTimeoutException: Timed out`. В `AkkaActivator` сделал Timeout 20 сек.** + + - [Typed Actors](http://doc.akka.io/docs/akka/current/java/typed-actors.html) + - [Spring Asynchronous Methods](https://spring.io/guides/gs/async-method) + - [Spring Async support](https://spring.io/blog/2012/05/07/spring-mvc-3-2-preview-introducing-servlet-3-async-support) + - [Asynchronous with JAX-RS](http://allegro.tech/2014/10/async-rest.html) + - [Currying vs Partial application](https://stackoverflow.com/a/218055/548473) + - [Serialization](http://doc.akka.io/docs/akka/current/scala/serialization.html) + + +#### Apply 11_7_akka_untyped.patch +> Переименовал `AkkaActorSendServlet` в `AkkaUntypedSendServlet` + - [Actors](http://doc.akka.io/docs/akka/current/java/actors.html) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. [Асинхронные сервлеты 3.0](https://drive.google.com/open?id=0B9Ye2auQ_NsFV2I2TndUT0kzT2s) +- [Tomcat 7 Async Processing](http://stackoverflow.com/questions/7287244/tomcat-7-async-processing) +- [Async in Servlet 3.0 vs NIO in Servlet 3.1](http://stackoverflow.com/questions/39802643/java-async-in-servlet-3-0-vs-nio-in-servlet-3-1) +- [AsyncContext.start in Servlet 3.0](https://stackoverflow.com/questions/10073392/whats-the-purpose-of-asynccontext-start-in-servlet-3-0) +- [The Limited Usefulness of AsyncContext.start()](https://dzone.com/articles/limited-usefulness) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Выбор языка программирования](https://drive.google.com/file/d/0B9Ye2auQ_NsFZUVNakNxeUtGeFE) +- [Scala dependency injection (di)](http://jonasboner.com/real-world-scala-dependency-injection-di) +- [Когда появится следующий большой язык программирования](https://habrahabr.ru/company/wrike/blog/323550) +- [Как я нашел лучший в мире язык программирования](https://habrahabr.ru/post/260149/) +- [Котлин рулит](https://habrahabr.ru/company/JetBrains/blog/329028/) + - [Почему следует полностью переходить на Kotlin](https://habrahabr.ru/company/mailru/blog/329294) + - [Stepik: Бесплатный Stepik курс Kotlin](https://stepik.org/course/Kotlin-2852) + - [Devcolibri: Базовый курс по Kotlin](https://www.youtube.com/playlist?list=PLIU76b8Cjem4ZOt3tlWykUX1AjL9zE19t) + +## Домашнее задание +- Сделать асинхронное ожидание и вывод результатов отправки почты пользователю в сервлетах: + - `AkkaTypedSendServlet` с выполнением в Tomcat `ThreadPoolExecutor` + - `AkkaActorSendServlet` с выполнением в собственном `ExecutorService` \ No newline at end of file From 8bd18c49a1c2a186aaff7f889c6861b77747b14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sat, 6 Jan 2018 00:32:50 +0300 Subject: [PATCH 074/126] Update lesson11.md --- doc/lesson11.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/lesson11.md b/doc/lesson11.md index 9562fbb..9e2c3db 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -69,6 +69,9 @@ - [Devcolibri: Базовый курс по Kotlin](https://www.youtube.com/playlist?list=PLIU76b8Cjem4ZOt3tlWykUX1AjL9zE19t) ## Домашнее задание -- Сделать асинхронное ожидание и вывод результатов отправки почты пользователю в сервлетах: +- Сделать асинхронное ожидание и **вывод результатов отправки почты** пользователю в сервлетах: - `AkkaTypedSendServlet` с выполнением в Tomcat `ThreadPoolExecutor` - - `AkkaActorSendServlet` с выполнением в собственном `ExecutorService` \ No newline at end of file + - `AkkaActorSendServlet` с выполнением в собственном `ExecutorService` + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 8. [Разбор решения с асинхронными сервлетами](https://drive.google.com/open?id=0B9Ye2auQ_NsFTWk1VS1GV1ROY0U) +#### Apply 11_8_async_servlet.patch From 92bb9eeec43e8f35852f3480b0dc85e78e3e3312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 23 Jan 2018 00:02:47 +0300 Subject: [PATCH 075/126] Update lesson06.md --- doc/lesson06.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index 2d8c22b..12286d9 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -72,6 +72,7 @@ - Spring-WS Message Factories #### Имплементируем Mail Service +- [Introduction to JAX-WS](http://www.baeldung.com/jax-ws) - JAX-WS Tutorial - GlassFish » Metro » JAX-WS - MailService WSDL / XSD From 878c5265ee96015160b81d6bd5af70f789cc9bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 29 Jan 2018 00:04:57 +0300 Subject: [PATCH 076/126] Update lesson11.md --- doc/lesson11.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lesson11.md b/doc/lesson11.md index 9e2c3db..a6ae17a 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -75,3 +75,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 8. [Разбор решения с асинхронными сервлетами](https://drive.google.com/open?id=0B9Ye2auQ_NsFTWk1VS1GV1ROY0U) #### Apply 11_8_async_servlet.patch + +### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Коррекция: +#### Apply 11_9_fix.patch +- `UserDao.insertWitId` поправил на `UserDao.insertWithId` From 88a17bdd0ba3c93fa233f64f34e48fac3b1d4e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 29 Jan 2018 00:05:25 +0300 Subject: [PATCH 077/126] Update lesson11.md --- doc/lesson11.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson11.md b/doc/lesson11.md index a6ae17a..1539774 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -76,6 +76,8 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 8. [Разбор решения с асинхронными сервлетами](https://drive.google.com/open?id=0B9Ye2auQ_NsFTWk1VS1GV1ROY0U) #### Apply 11_8_async_servlet.patch +----------- + ### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Коррекция: #### Apply 11_9_fix.patch - `UserDao.insertWitId` поправил на `UserDao.insertWithId` From f6956c54359f1483067af89fbfa7dac778ad76ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 8 Feb 2018 20:21:30 +0300 Subject: [PATCH 078/126] Update lesson11.md --- doc/lesson11.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson11.md b/doc/lesson11.md index 1539774..58ccdc8 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -81,3 +81,4 @@ ### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Коррекция: #### Apply 11_9_fix.patch - `UserDao.insertWitId` поправил на `UserDao.insertWithId` +- `UserTestData.FIST5_USERS` поправил на `FIRST5_USERS` From 725d83596b4a0d4435d75c7d9574dfefbfacfc51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 16 Mar 2018 18:01:27 +0300 Subject: [PATCH 079/126] Update lesson06.md --- doc/lesson06.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index 12286d9..a6da67c 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -97,6 +97,8 @@ - DAO и модель для сохранения сделать в модуле `mail-service` - Протестировать отправку почты через SoapUI и/или `MailServiceClient` +> если стоит Avast и Avast Mail Shield, для отправки требуется отключить + #### Optional - добавить в модуле `upload` импорт и сохранение в базу групп и проектов (упрощение: только добавление без удаления/модификации) - добавить при импорте пользователей связи на группы From ca617e9a93ee4547ef66e145fdba5c053878ecb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 26 Mar 2018 19:51:19 +0300 Subject: [PATCH 080/126] Update lesson05.md --- doc/lesson05.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson05.md b/doc/lesson05.md index 5705c93..5de90bd 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -23,6 +23,8 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Вставка в несколько потоков](https://drive.google.com/file/d/0B9Ye2auQ_NsFek5PYTdQbjBlUU0) #### 5_4_HW4_parallel.patch **Внимание! в postgres 10 с sequence могут быть проблемы** +> Правка для postgres 10: `h.execute("SELECT setval('user_seq', " + (id + step - 1) + ")")` + > Fix: в `UserProcessor.process` нельзя делать `85: chunk.clean()`, тк этот список асинхронно используется для вставки. ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рефакторинг](https://drive.google.com/open?id=1IYCUi8bPbP0FTp_Nylzh8Ssbu-rXahVX) From 8dbe54f434ed0d95befa1637c75962d7055db6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 25 May 2018 11:09:23 +0300 Subject: [PATCH 081/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 6fc8f39..3c5107f 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -37,7 +37,7 @@ - XSL Transformation in Java with parameters - Test Cases for XSLT support in browsers -## Затяние 3 +## Занятие 3 ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Обзор Guava](https://drive.google.com/open?id=0B9Ye2auQ_NsFeFB5a29JQ2tRNHM) - [The Top 20 Most Popular Java Libraries](https://dzone.com/articles/the-top-100-java-libraries-in-2016-after-analyzing) - [Guava Wiki](https://github.com/google/guava/wiki) From 8ac51f24a8df47a5cea59720c5994384c9497fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 25 May 2018 12:09:39 +0300 Subject: [PATCH 082/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index 3c5107f..ec41050 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -50,7 +50,7 @@ ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. Монады. flatMap - Функторы, аппликативные функторы и монады в картинках - Монады в Java 8 - - Куср Сoursera по функциональному программированию + - Курс Сoursera по функциональному программированию - Three Monad laws. - What's Wrong in Java 8 Monads From beb6c2e9e68544bd9fe05a2d88e173b92d252902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 6 Sep 2018 22:26:08 +0300 Subject: [PATCH 083/126] Update lesson06.md --- doc/lesson06.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index a6da67c..a8fbb36 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -41,6 +41,7 @@ - Техника безопасности при работе с PostgreSQL - История про несогласованные данные - DB Migration rules + -[Опыт 1440 миграций баз данных](https://habr.com/company/wrike/blog/414441/) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Веб-сервисы #### Apply 6_5_web_services.patch From a9f2e3e0d6af8b0c3044dc441d6fba96079950d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 6 Sep 2018 22:27:00 +0300 Subject: [PATCH 084/126] Update lesson06.md --- doc/lesson06.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index a8fbb36..fa1c9c3 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -41,7 +41,7 @@ - Техника безопасности при работе с PostgreSQL - История про несогласованные данные - DB Migration rules - -[Опыт 1440 миграций баз данных](https://habr.com/company/wrike/blog/414441/) + - [Опыт 1440 миграций баз данных](https://habr.com/company/wrike/blog/414441/) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Веб-сервисы #### Apply 6_5_web_services.patch From 73f9890f2989c0c70ed57c8ec450367bd35aca16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 20 Sep 2018 20:07:35 +0300 Subject: [PATCH 085/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 1e73e4d..01fc1e4 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -8,7 +8,7 @@ ## Материалы занятия (скачать все патчи можно через Download папки patch) ![image](https://cloud.githubusercontent.com/assets/13649199/18330295/5f2ca214-7560-11e6-8e1e-c0494f798c37.png) -## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1.1 Вступление. Разбор домашнего задания HW1 +## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1.1 Вступление. Разбор домашнего задания HW1 #### 2_1_HW1_singleThreadMultiplyOpt.patch #### 2_2_HW1_concurrentMultiply.patch - Сравнение EE и Spring в комментариях From 309c848e09ab634a0e92f98350200214ebf8d2b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 24 Jan 2019 13:42:36 +0300 Subject: [PATCH 086/126] Update lesson05.md --- doc/lesson05.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index 5de90bd..3234427 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -38,7 +38,7 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run **ВНИМАНИЕ!! Не забудте положить `persist.conf` в `/apps/masterjava/config` (или убрать `required` из `persist\src\main\resources\persist.conf`)** -- Переопределение занчений в конфигурации в Spring. +- Переопределение занчений в конфигурации в Spring. - Встроенные профили Spring Boot - Apache commons-configuration2 - Typesafe config library , user in Playframework From 5a0f9f2d7c7fab7e46fa1ee18767bc7157552109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 8 Feb 2019 13:17:50 +0300 Subject: [PATCH 087/126] Update lesson06.md --- doc/lesson06.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index fa1c9c3..61f770e 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -36,7 +36,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Миграция DB - Liquibase (Dropwizard Migrations) -- Flyway (Liquibase vs FLyway which one to use?) +- Flyway, [Liquibase vs FLyway which one to use? (удалили на so, копия на русском)](https://stackoverrun.com/ru/q/10306280) - MyBatis Migrations - Техника безопасности при работе с PostgreSQL - История про несогласованные данные From 096b500ca9a84c8bbe4bfff102c1d1608c818927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 25 Feb 2019 17:48:28 +0300 Subject: [PATCH 088/126] Update lesson05.md --- doc/lesson05.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index 3234427..8265610 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -6,7 +6,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Сохранение в базу в batch-моде с обработкой конфликтов](https://drive.google.com/file/d/0B9Ye2auQ_NsFZEJwR2ZqMEdVRG8) -#### 5_1_HW4_export_chunk.patch +#### 5_1_HW4_upload_chunk.patch > Добавил `required` в `upload.html` ``` From 38226dd2480d4a80c8fff28d9e30a0200c77fb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 25 Feb 2019 18:09:42 +0300 Subject: [PATCH 089/126] Update lesson06.md --- doc/lesson06.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index 61f770e..eae48ef 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -14,7 +14,7 @@ была задача привести их всех к одинаковым `id`. С `ref` как PK все упростится. Хотя у кого-то может быть другой опыт:) - Также см. отдельную тему **Миграция DB** в уроке. -- Скрип миграции `lb_apply.bat` (на sh переведите сами, если unix) можно запускать много раз. По истории смотрится, чтобы каждый ChangeSet накатился только 1 раз. +- Скрип миграции `lb_apply.bat` (на sh переведите сами, если unix) можно запускать много раз. По истории смотрится, чтобы каждый ChangeSet накатился только 1 раз. ВНИМАНИЕ: скрипт накатывается на базу, сгенерированную `initDB.sql` - [Liquibase](http://www.liquibase.org/) - [Downloads](http://www.liquibase.org/download) - [Run migration](http://www.liquibase.org/quickstart.html) From 1dece8c0f34e34473c9c3b1058c3942d4254746d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 25 Feb 2019 18:10:43 +0300 Subject: [PATCH 090/126] Update lesson07.md --- doc/lesson07.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson07.md b/doc/lesson07.md index fd55ad3..82b0bd9 100644 --- a/doc/lesson07.md +++ b/doc/lesson07.md @@ -3,7 +3,7 @@ ## [Материалы занятия](https://drive.google.com/drive/u/0/folders/0B9Ye2auQ_NsFbXFnekNDSmJzS1k) (скачать все патчи можно через Download папки patch) ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Разбор домашнего задания HW6 ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Реализация `MailSender` -#### Apply 7_1_HW5_MailSender.patch +#### Apply 7_1_HW6_MailSender.patch - List-Unsubcribe - Amazon Simple Email Service From 1ddaed6fbc8e9ebf193c137b760fdf66afc7f403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sat, 30 Mar 2019 19:39:01 +0300 Subject: [PATCH 091/126] Update lesson11.md --- doc/lesson11.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson11.md b/doc/lesson11.md index 58ccdc8..5bb9284 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -21,7 +21,7 @@ - [Durian](https://github.com/diffplug/durian) ( [Дуриан](https://ru.wikipedia.org/wiki/Дуриан) ) > #### Дополнительно: -> #### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Николай Алименков - Нужен ли нам JMS в мире современных Java-технологий?](http://bekeriya.com/watch?v=RVwXdCfzJZA) +> #### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Николай Алименков - Нужен ли нам JMS в мире современных Java-технологий?](https://www.youtube.com/watch?v=ExjPxDxkmFo) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Concurrent and distributed applications toolkit AKKA](https://drive.google.com/open?id=0B9Ye2auQ_NsFR0tjc28tRzVHQVk) > #### Внимание! Перед накаткой патчеа создайте в `services` каталог `akka-remote` (`services/akka-remote`) иначе файлы придется руками сюда перетаскивать. From b7cb9f983b2af66ba57a7dd75208880ef18e8807 Mon Sep 17 00:00:00 2001 From: gkislin Date: Thu, 4 Jul 2019 04:18:23 +0300 Subject: [PATCH 092/126] Add maven config --- doc/lesson08.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lesson08.md b/doc/lesson08.md index a6d31e4..2160886 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -7,6 +7,11 @@ ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Делаем общий `mailService.wsdl` > Напомню, что общие wsdl ресурсы хранятся в `${masterjava.config}/wsdl` +[Способы конфигурирования Maven](https://maven.apache.org/configure.html) +- MAVEN_OPTS +- settings.xml +- .mvn folder: в `maven.config` например `-Dmasterjava.config=/some/path/to/config` + #### Apply 1_HW7_wsdl_share.patch ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Доступ к переменным maven в приложении #### Apply 2_app_conf.patch From 2b1952bd2148d47c827bdf9b49b3329316163dd5 Mon Sep 17 00:00:00 2001 From: gkislin Date: Thu, 4 Jul 2019 04:19:58 +0300 Subject: [PATCH 093/126] Fix maven config --- doc/lesson08.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson08.md b/doc/lesson08.md index 2160886..f7888f2 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -10,7 +10,7 @@ [Способы конфигурирования Maven](https://maven.apache.org/configure.html) - MAVEN_OPTS - settings.xml -- .mvn folder: в `maven.config` например `-Dmasterjava.config=/some/path/to/config` +- .mvn папка в корне проекта: `maven.config` с пераметром `-Dmasterjava.config=/some/path/to/config` #### Apply 1_HW7_wsdl_share.patch ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Доступ к переменным maven в приложении From 8ab6cebcd12f8aa4421411318b3f4ca701cf9d48 Mon Sep 17 00:00:00 2001 From: gkislin Date: Thu, 4 Jul 2019 04:20:40 +0300 Subject: [PATCH 094/126] Fix maven config --- doc/lesson08.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lesson08.md b/doc/lesson08.md index f7888f2..32c00d1 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -8,9 +8,9 @@ > Напомню, что общие wsdl ресурсы хранятся в `${masterjava.config}/wsdl` [Способы конфигурирования Maven](https://maven.apache.org/configure.html) -- MAVEN_OPTS -- settings.xml -- .mvn папка в корне проекта: `maven.config` с пераметром `-Dmasterjava.config=/some/path/to/config` +- `MAVEN_OPTS` +- `settings.xml` +- `.mvn` папка в корне проекта: `maven.config` с параметром `-Dmasterjava.config=/some/path/to/config` #### Apply 1_HW7_wsdl_share.patch ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Доступ к переменным maven в приложении From 2a9b0dfa243a5ba5f873926c04c4d23e53569b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 16 Aug 2019 22:26:43 +0300 Subject: [PATCH 095/126] Update lesson11.md --- doc/lesson11.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson11.md b/doc/lesson11.md index 5bb9284..ec42dea 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -63,10 +63,12 @@ - [Scala dependency injection (di)](http://jonasboner.com/real-world-scala-dependency-injection-di) - [Когда появится следующий большой язык программирования](https://habrahabr.ru/company/wrike/blog/323550) - [Как я нашел лучший в мире язык программирования](https://habrahabr.ru/post/260149/) +- [ EduTools плагин от JetBrains для изучения Kotlin, Java, Python, Scala, ...](http://javaops.ru/view/story/story21#edutools) - [Котлин рулит](https://habrahabr.ru/company/JetBrains/blog/329028/) - [Почему следует полностью переходить на Kotlin](https://habrahabr.ru/company/mailru/blog/329294) - [Stepik: Бесплатный Stepik курс Kotlin](https://stepik.org/course/Kotlin-2852) - [Devcolibri: Базовый курс по Kotlin](https://www.youtube.com/playlist?list=PLIU76b8Cjem4ZOt3tlWykUX1AjL9zE19t) + ## Домашнее задание - Сделать асинхронное ожидание и **вывод результатов отправки почты** пользователю в сервлетах: From 1276a284621d1e9148dec9dc1c5a6f6f67107df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 16 Aug 2019 22:31:04 +0300 Subject: [PATCH 096/126] Update lesson11.md --- doc/lesson11.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson11.md b/doc/lesson11.md index ec42dea..5349cff 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -63,7 +63,7 @@ - [Scala dependency injection (di)](http://jonasboner.com/real-world-scala-dependency-injection-di) - [Когда появится следующий большой язык программирования](https://habrahabr.ru/company/wrike/blog/323550) - [Как я нашел лучший в мире язык программирования](https://habrahabr.ru/post/260149/) -- [ EduTools плагин от JetBrains для изучения Kotlin, Java, Python, Scala, ...](http://javaops.ru/view/story/story21#edutools) +- [EduTools плагин от JetBrains для изучения Kotlin, Java, Python, Scala, ...](http://javaops.ru/view/story/story21#edutools) - [Котлин рулит](https://habrahabr.ru/company/JetBrains/blog/329028/) - [Почему следует полностью переходить на Kotlin](https://habrahabr.ru/company/mailru/blog/329294) - [Stepik: Бесплатный Stepik курс Kotlin](https://stepik.org/course/Kotlin-2852) From e44baec8ecfd723986e3de8353899347a918ce64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 16 Aug 2019 22:37:23 +0300 Subject: [PATCH 097/126] Update lesson11.md --- doc/lesson11.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson11.md b/doc/lesson11.md index 5349cff..6458da9 100644 --- a/doc/lesson11.md +++ b/doc/lesson11.md @@ -66,7 +66,7 @@ - [EduTools плагин от JetBrains для изучения Kotlin, Java, Python, Scala, ...](http://javaops.ru/view/story/story21#edutools) - [Котлин рулит](https://habrahabr.ru/company/JetBrains/blog/329028/) - [Почему следует полностью переходить на Kotlin](https://habrahabr.ru/company/mailru/blog/329294) - - [Stepik: Бесплатный Stepik курс Kotlin](https://stepik.org/course/Kotlin-2852) + - [Stepik: Бесплатный Stepik курс Kotlin (доступен также через плагин JetBrains EduTools)](https://stepik.org/course/Kotlin-2852) - [Devcolibri: Базовый курс по Kotlin](https://www.youtube.com/playlist?list=PLIU76b8Cjem4ZOt3tlWykUX1AjL9zE19t) From 21c37e0e4995dbd1332691d80f39dc585db646b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 3 Dec 2019 18:41:25 +0300 Subject: [PATCH 098/126] Update lesson03.md --- doc/lesson03.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index ec41050..578ab9b 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -58,6 +58,7 @@ - Сервис-ориентированная архитектура как повышение абстракции производства ПО - What is service-oriented architecture? - Современное представление (SOA): Микросервисы + - [Микросервисная архитектура в разрезе](https://proglib.io/p/po-stopam-luchshih-mikroservisnaya-arhitektura-v-razreze-2019-11-07) - Микросервисы (Microservices) - Доклад Кирилла Толкачёва и Александра Тарасова про микросервисы - Минск: Микросервисы - Огонь, Вода и Медные трубы From a09f045af794306ba193d30c38cba2d1eb7c0541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 6 Feb 2020 11:48:06 +0300 Subject: [PATCH 099/126] Update lesson03.md --- doc/lesson03.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson03.md b/doc/lesson03.md index 578ab9b..c037c99 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -105,6 +105,7 @@ - Maven module inheritance vs aggregation - Расширение кругозора: - Антон Архипов, Евгений Борисов, Барух Садогурский — Maven vs Gradle vs SBT + - [Maven CI Friendly Versions: параметризация версии проекта](https://maven.apache.org/maven-ci-friendly.html) ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW3 - Сделать структуру проекта согласно схеме. В модулях c `packaging=pom` кода нет, корневое `src` перенести в другие модули. From b2bac87da3e129e8c428e9bda916a94e72420330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 2 Apr 2020 13:45:21 +0300 Subject: [PATCH 100/126] Update lesson01.md --- doc/lesson01.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lesson01.md b/doc/lesson01.md index 9a969df..8636fae 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -38,6 +38,7 @@ - Использование ThreadLocal переменных - Николай Алименков — Прикладная многопоточность - Can thread switching happen in the synchronized block? +- [The Deadlock Empire](https://deadlockempire.github.io/) #### Tproger: Многопоточное программирование в Java 8 - 1. Параллельное выполнение кода с помощью потоков @@ -81,4 +82,4 @@ Benchmark (matrixSize) Mode Cnt Score Error MatrixBenchmark.singleThreadMultiplyOpt 1000 ss 100 837,867 ± 25,530 ms/op MatrixBenchmark.concurrentMultiply2 1000 ss 100 394,294 ± 21,657 ms/op MatrixBenchmark.concurrentMultiply3 1000 ss 100 186,827 ± 11,882 ms/op -``` \ No newline at end of file +``` From 79d4fc90ea807de6fd514c1bdae3c3b04e2fbf47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Apr 2020 11:07:05 +0300 Subject: [PATCH 101/126] Update lesson05.md --- doc/lesson05.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson05.md b/doc/lesson05.md index 8265610..7c21167 100644 --- a/doc/lesson05.md +++ b/doc/lesson05.md @@ -23,7 +23,7 @@ mvn org.codehaus.cargo:cargo-maven2-plugin:run ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Вставка в несколько потоков](https://drive.google.com/file/d/0B9Ye2auQ_NsFek5PYTdQbjBlUU0) #### 5_4_HW4_parallel.patch **Внимание! в postgres 10 с sequence могут быть проблемы** -> Правка для postgres 10: `h.execute("SELECT setval('user_seq', " + (id + step - 1) + ")")` +> Правка для postgres 10 (`UserDao` 32): `h.execute("SELECT setval('user_seq', " + (id + step - 1) + ")")` > Fix: в `UserProcessor.process` нельзя делать `85: chunk.clean()`, тк этот список асинхронно используется для вставки. From c3cdc6a471a35294dd33d874149e728ec1d322d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 5 Apr 2020 17:59:25 +0300 Subject: [PATCH 102/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index c037c99..e6e6349 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -101,7 +101,7 @@ ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Многомодульный Maven проект #### Apply 3_5_multimodule.patch -- Maven на topjava. Snapshot. The Reactor. +- Snapshot. The Reactor. - Maven module inheritance vs aggregation - Расширение кругозора: - Антон Архипов, Евгений Борисов, Барух Садогурский — Maven vs Gradle vs SBT From 1241371e9152f266c9afc943aa1439d5b810b49a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 17 May 2020 15:41:00 +0300 Subject: [PATCH 103/126] Update lesson02.md --- doc/lesson02.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson02.md b/doc/lesson02.md index 01fc1e4..6520fa7 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -5,6 +5,8 @@ - **Код проекта обновляется и не всегда совпадает с видео (можно увидеть как развивался проект). Изменения в проекте указываю после соответствующего патча.** - 42 IntelliJ IDEA Tips and Tricks +### В коде проекта используется JDK 8. Если у вас выше, необходимо будет включить в проект [дополнительные зависимости, исключенные в JDK 9](https://stackoverflow.com/questions/48204141/548473) + ## Материалы занятия (скачать все патчи можно через Download папки patch) ![image](https://cloud.githubusercontent.com/assets/13649199/18330295/5f2ca214-7560-11e6-8e1e-c0494f798c37.png) From 0d3160c001902a8cacc586ac127aaeaf8f74006c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= <11200258+JavaWebinar@users.noreply.github.com> Date: Sun, 19 Jul 2020 01:44:33 +0300 Subject: [PATCH 104/126] Update lesson01.md --- doc/lesson01.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson01.md b/doc/lesson01.md index 8636fae..3f015fb 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -60,6 +60,7 @@ - Computer Science Center, курс Параллельное программирование - Юрий Ткач, курс Advanced Java - Concurrency - Головач, курс Java Multithreading +- [Перевод «Java Memory Model»](https://habr.com/ru/post/510454/) --- ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Задание первого занятия From 860e62978d8be6ffb9e0418f6b177616534edb72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 30 Mar 2021 00:16:46 +0300 Subject: [PATCH 105/126] Update lesson06.md --- doc/lesson06.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index eae48ef..63313ab 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -39,6 +39,7 @@ - Flyway, [Liquibase vs FLyway which one to use? (удалили на so, копия на русском)](https://stackoverrun.com/ru/q/10306280) - MyBatis Migrations - Техника безопасности при работе с PostgreSQL +- [Здоровье индексов в PostgreSQL глазами Java-разработчика](https://habr.com/ru/post/490824/) - История про несогласованные данные - DB Migration rules - [Опыт 1440 миграций баз данных](https://habr.com/company/wrike/blog/414441/) From 4351e5db4db8ed18ed0224956a229f4fc6af511a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 7 Apr 2021 02:36:11 +0300 Subject: [PATCH 106/126] Update lesson06.md --- doc/lesson06.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index 63313ab..fc94eae 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -95,6 +95,11 @@ mail.debug: true mail.fromName: Name ``` +Если конфигурируете почту Yandex, [перейдите в настройки](https://mail.yandex.ru/#setup/client) и поднимите галочки: + +![image](https://user-images.githubusercontent.com/11200258/113790310-c5b03b80-9749-11eb-969a-60ade652d405.png) + + - Сохранят результат отправки писем в DB (в `MailSender`). - DAO и модель для сохранения сделать в модуле `mail-service` - Протестировать отправку почты через SoapUI и/или `MailServiceClient` From 5b2939e270236c8d0054b60a57caf774dc088052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 7 Apr 2021 14:15:55 +0300 Subject: [PATCH 107/126] Update lesson06.md --- doc/lesson06.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index fc94eae..45ba395 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -99,6 +99,7 @@ ![image](https://user-images.githubusercontent.com/11200258/113790310-c5b03b80-9749-11eb-969a-60ade652d405.png) +Также, с включенным Avast были замечены проблемы с `ValidatorException: PKIX path building failed` - Сохранят результат отправки писем в DB (в `MailSender`). - DAO и модель для сохранения сделать в модуле `mail-service` From e14a73790c2d24148eb69b356225b80390e3eb3f Mon Sep 17 00:00:00 2001 From: gkislin Date: Fri, 25 Jun 2021 16:09:47 +0300 Subject: [PATCH 108/126] Fix url --- doc/lesson01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson01.md b/doc/lesson01.md index 3f015fb..26af0af 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -35,7 +35,7 @@ - Обзор java.util.concurrent.* - Как работает ConcurrentHashMap - Справочник по синхронизаторам java.util.concurrent.* -- Использование ThreadLocal переменных +- Использование ThreadLocal переменных - Николай Алименков — Прикладная многопоточность - Can thread switching happen in the synchronized block? - [The Deadlock Empire](https://deadlockempire.github.io/) From f1aa35bfb0e70607042cef5bb2d5641c5d1a5501 Mon Sep 17 00:00:00 2001 From: gkislin Date: Tue, 13 Jul 2021 17:27:55 +0300 Subject: [PATCH 109/126] update ibm links from webarchive --- doc/lesson02.md | 14 +++++++------- doc/lesson07.md | 2 +- doc/lesson10.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 6520fa7..6ea5bd7 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -52,28 +52,28 @@ - Работа с XML в Java. - DOM, SAX -- JAXP: вспомогательный слой над SAX и DOM API +- JAXP: вспомогательный слой над SAX и DOM API - JAXB, JAXP, Xerces, Xalan -- Валидации XML +- Валидации XML ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. StAX #### 2_8_StAX.patch - [Java XML API: выбираем правильно. StAX: работаем с удовольствием](https://habrahabr.ru/post/339716/) -- StAX: XMLStreamReader, XMLEventReader +- StAX: XMLStreamReader, XMLEventReader ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. XPath #### 2_9_XPath.patch -- XPath: Java XPath API +- XPath: Java XPath API - Примеры XPath ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. XSLT #### 2_10_Xslt.patch -- Преобразование XSLT, Default XSLT output +- Преобразование XSLT, Default XSLT output - XSLT, XSL - XSL Transformations (XSLT) - Дополнительно - - [What kind of language is XSLT?](https://www.ibm.com/developerworks/xml/library/x-xslt) - - [Saxon: Anatomy of an XSLT processor](http://www.ibm.com/developerworks/library/x-xslt2/) + - [What kind of language is XSLT?](https://web.archive.org/web/20201109035750/http://www.ibm.com/developerworks/xml/library/x-xslt/) + - [Saxon: Anatomy of an XSLT processor](https://web.archive.org/web/20200916195642/http://www.ibm.com/developerworks/library/x-xslt2/) ## Домашнее задание - 1: Изменить XML схему: diff --git a/doc/lesson07.md b/doc/lesson07.md index 82b0bd9..83788f3 100644 --- a/doc/lesson07.md +++ b/doc/lesson07.md @@ -33,7 +33,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Стили WSDL. Кастомизация WSDL #### Apply 7_5_customize_WSDL.patch - SOAP -- Стили WSDL +- Стили WSDL ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. Публикация кастомизированного WSDL. Автогенерация. #### Apply 7_6_publish_CustomizedWSDL.patch diff --git a/doc/lesson10.md b/doc/lesson10.md index 821951e..2eca663 100644 --- a/doc/lesson10.md +++ b/doc/lesson10.md @@ -20,7 +20,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [JavaEE](https://drive.google.com/open?id=0B9Ye2auQ_NsFUU92ZFBEZmJjb2c) - Java Platform, Enterprise Edition - Холивары в комментах -- CDI +- CDI - Enterprise JavaBeans - TomEE состав - Application Server statistics From b1b56f4c4ab2dca321318bf11c817f3599211291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 14 Sep 2021 01:05:14 +0300 Subject: [PATCH 110/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 6ea5bd7..08c4934 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -30,7 +30,7 @@ > Сделал forks=10 для большой точности измерений и убрал лишние измерения -- JMH - Java Microbenchmark Harness, Java Performance Tuning Guide +- JMH - Java Microbenchmark Harness, Java Performance Tuning Guide (если не работает, попробуйте перейти на Introduction to JMH [отсюда](https://d1k2jhzcfaebet.cloudfront.net/#post-750)) - idea-jmh-plugin, Exception while trying to acquire a JMH lock - Maven latest dependency version From ec7af7034eecd69458ce2f61578801fcd03986f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 17 Sep 2021 10:19:16 +0300 Subject: [PATCH 111/126] Update lesson02.md --- doc/lesson02.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/lesson02.md b/doc/lesson02.md index 08c4934..403c000 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -66,6 +66,14 @@ - XPath: Java XPath API - Примеры XPath +В IDEA в контекстном меню на элемент XML есть пункт (2-й снизу) `Evaluate XPath...` +На имена города он выдает `/Payload/Cities/City/text()` +Чтобы это выражение работало в нашем `XPathProcessorTest` нужно отключить `NamespaceAware`: +``` +public class XPathProcessor +... +25 DOCUMENT_FACTORY.setNamespaceAware(false); +``` ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. XSLT #### 2_10_Xslt.patch - Преобразование XSLT, Default XSLT output From 1e07bfe185d9f0303c947a9e6af63ff0d9d0758a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 22 Sep 2021 13:24:00 +0300 Subject: [PATCH 112/126] Update lesson03.md --- doc/lesson03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson03.md b/doc/lesson03.md index e6e6349..6a656db 100644 --- a/doc/lesson03.md +++ b/doc/lesson03.md @@ -100,7 +100,7 @@ - Apache Camel for Micro­service Architectures ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. Многомодульный Maven проект -#### Apply 3_5_multimodule.patch +#### Apply 3_6_multimodule.patch - Snapshot. The Reactor. - Maven module inheritance vs aggregation - Расширение кругозора: From fd129e651bf94f0d8d58190d937add79682408b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 22 Sep 2021 13:39:09 +0300 Subject: [PATCH 113/126] Update lesson04.md --- doc/lesson04.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/lesson04.md b/doc/lesson04.md index 80452e7..0c32423 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -88,6 +88,12 @@ mvn dependency:analyze Общие файлы конфигурации заданы в maven parent как в `/apps/masterjava/config/`. **Нужно у себя в корне диска создать этот каталог и положить в него содержимое `config_templates`** +UPDATE: c Maven 3.3.1 [в переменной `${maven.multiModuleProjectDirectory}` храниться рутовый каталог многомодульного проекта](https://stackoverflow.com/a/49528226/548473). Те мы можем создавать `config` и хранить его прямо в нашем репозитории (вместо `config_templates`) и делать путь к нем как +``` +${maven.multiModuleProjectDirectory}/config/ +``` +Если в корне проекта сделать каталог `.mvn`, то эта переменная работает при сборке из зависимых модулей. + - Добавление зависимостей логирования - logback.xml Example - Справочник: From 445c31b619f3a6a3b86c6e53e32cab0daff62216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 22 Sep 2021 13:40:28 +0300 Subject: [PATCH 114/126] Update lesson04.md --- doc/lesson04.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson04.md b/doc/lesson04.md index 0c32423..99a0b0b 100644 --- a/doc/lesson04.md +++ b/doc/lesson04.md @@ -88,7 +88,7 @@ mvn dependency:analyze Общие файлы конфигурации заданы в maven parent как в `/apps/masterjava/config/`. **Нужно у себя в корне диска создать этот каталог и положить в него содержимое `config_templates`** -UPDATE: c Maven 3.3.1 [в переменной `${maven.multiModuleProjectDirectory}` храниться рутовый каталог многомодульного проекта](https://stackoverflow.com/a/49528226/548473). Те мы можем создавать `config` и хранить его прямо в нашем репозитории (вместо `config_templates`) и делать путь к нем как +UPDATE: c Maven 3.3.1 [в переменной `${maven.multiModuleProjectDirectory}` храниться рутовый каталог многомодульного проекта](https://stackoverflow.com/a/49528226/548473). Те мы можем создавать `config` и хранить его прямо в нашем репозитории (вместо `config_templates`) с путем ``` ${maven.multiModuleProjectDirectory}/config/ ``` From 7b73355f4bf1ef71d1c813b8aeaa95b66980d141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sun, 14 Nov 2021 15:28:18 +0300 Subject: [PATCH 115/126] Update lesson02.md --- doc/lesson02.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson02.md b/doc/lesson02.md index 403c000..7fb3efe 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -62,6 +62,8 @@ - StAX: XMLStreamReader, XMLEventReader ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. XPath +> Поправка к видео на 2:29 - лет 10-15 назад был популярен подход рисовать квадратиками в специальном приложении логику [связываения через сообщения разных сервисов](https://www.mulesoft.com/resources/esb/what-esb). Сервисы подключались к [ESB](https://ru.wikipedia.org/wiki/ESB) по разным протоколам. Один из них был [JBI](https://hrwiki.ru/wiki/Java_Business_Integration). Все это было достаточно красиво для продаж, но очень неуклюже для разработки. Cейчас уже редко где можно встретить, хотя Spring Integration, Apache Camel и пр. для определенных приложений-процессов используют. + #### 2_9_XPath.patch - XPath: Java XPath API - Примеры XPath From ed1a4bc7f125f3b90c92a92b072ec66193dcc210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 24 Nov 2021 00:57:11 +0300 Subject: [PATCH 116/126] Update lesson10.md --- doc/lesson10.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lesson10.md b/doc/lesson10.md index 2eca663..70d4ffc 100644 --- a/doc/lesson10.md +++ b/doc/lesson10.md @@ -59,6 +59,8 @@ > - `config_templates/context.xml` в `$TOMCAT_HOME/conf` > - `$MAVEN_REPO(~/.m2)/org/apache/activemq/activemq-all/5.15.2/activemq-all-5.15.2.jar` в `$TOMCAT_HOME/lib` +*Для новых версий activemq-all, например `activemq-all-5.16.3.jar`, [нужно добавить в зависимости `jackson-core`, `jackson-databind`, `jackson-databind`](https://cursos.alura.com.br/forum/topico-java-11-activemq-5-15-14-java-lang-noclassdeffounderror-com-fasterxml-jackson-databind-objectmapper-141531)* + - Java Message Service - Queues - JMS vs AMQP, AMQP From 826e400a7adf92f5a5905d531a94de0afe164bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Thu, 25 Nov 2021 12:57:56 +0300 Subject: [PATCH 117/126] Update lesson06.md --- doc/lesson06.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lesson06.md b/doc/lesson06.md index 45ba395..722fcc6 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -95,18 +95,18 @@ mail.debug: true mail.fromName: Name ``` -Если конфигурируете почту Yandex, [перейдите в настройки](https://mail.yandex.ru/#setup/client) и поднимите галочки: +> Если конфигурируете почту Yandex, [перейдите в настройки](https://mail.yandex.ru/#setup/client) и поднимите галочки: ![image](https://user-images.githubusercontent.com/11200258/113790310-c5b03b80-9749-11eb-969a-60ade652d405.png) -Также, с включенным Avast были замечены проблемы с `ValidatorException: PKIX path building failed` +> C включенным Avast были замечены проблемы с `ValidatorException: PKIX path building failed`. Avast и Avast Mail Shield для отправки требуется отключить + +> В случае DEBUG SMTP: AUTH LOGIN failed, Error: authentication failed: Invalid user or password! проверьте [Шаг 2. Создайте пароль приложения](https://yandex.ru/support/mail/mail-clients/others.html) - при галочке "Включить пароли приложений" нужно указывать пароль к приложению. - Сохранят результат отправки писем в DB (в `MailSender`). - DAO и модель для сохранения сделать в модуле `mail-service` - Протестировать отправку почты через SoapUI и/или `MailServiceClient` -> если стоит Avast и Avast Mail Shield, для отправки требуется отключить - #### Optional - добавить в модуле `upload` импорт и сохранение в базу групп и проектов (упрощение: только добавление без удаления/модификации) - добавить при импорте пользователей связи на группы From 4da2f3e32c1922363ffcbcacf7ba0defa4c598e2 Mon Sep 17 00:00:00 2001 From: gkislin Date: Mon, 21 Mar 2022 20:19:38 +0300 Subject: [PATCH 118/126] update master link --- doc/lesson01.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/lesson01.md b/doc/lesson01.md index 26af0af..f90b673 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -16,8 +16,9 @@ - Stack and Heap - Дополнительно: - Из каких частей состоит память java процесса. - - Permanent область памяти - - Java thread stack + - Permanent область памяти + > Замечание: [с JDK 7 String Pool переехал в Heap](https://topjava.ru/blog/rukovodstvo-po-string-pool-v-java) + - [Стек и куча в Java](https://topjava.ru/blog/stack-and-heap-in-java) - Размер Java объектов ### Ленивая инициализация @@ -30,7 +31,7 @@ - Параллелизм в Java - Монитор (синхронизация) - Compare-and-swap -- Java Memory Model +- Java Memory Model - Синхронизация потоков - Обзор java.util.concurrent.* - Как работает ConcurrentHashMap From c76ab3462578257a6ec14ddcb0d5bee83dea4abb Mon Sep 17 00:00:00 2001 From: gkislin Date: Fri, 3 Jun 2022 18:49:25 +0300 Subject: [PATCH 119/126] update lesson01 --- doc/lesson01.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/lesson01.md b/doc/lesson01.md index f90b673..a393684 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -20,6 +20,9 @@ > Замечание: [с JDK 7 String Pool переехал в Heap](https://topjava.ru/blog/rukovodstvo-po-string-pool-v-java) - [Стек и куча в Java](https://topjava.ru/blog/stack-and-heap-in-java) - Размер Java объектов + - Оптимизация памяти + - [Escape analysis и скаляризация: Пусть GC отдохнет](https://habr.com/company/jugru/blog/322348) + - [Условия для размещения объекта в стеке](https://stackoverflow.com/a/43002529/548473) ### Ленивая инициализация - Реализация Singleton в JAVA @@ -31,15 +34,16 @@ - Параллелизм в Java - Монитор (синхронизация) - Compare-and-swap -- Java Memory Model +- Java Memory Model - Синхронизация потоков - Обзор java.util.concurrent.* - Как работает ConcurrentHashMap - Справочник по синхронизаторам java.util.concurrent.* -- Использование ThreadLocal переменных +- Использование ThreadLocal переменных - Николай Алименков — Прикладная многопоточность - Can thread switching happen in the synchronized block? - [The Deadlock Empire](https://deadlockempire.github.io/) +- [Реактивное программирование - как, зачем и стоит ли?](https://habr.com/ru/company/oleg-bunin/blog/543386/) #### Tproger: Многопоточное программирование в Java 8 - 1. Параллельное выполнение кода с помощью потоков @@ -49,10 +53,16 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. Реализация многопоточной отправки писем. Execution Framework > правка к видео: `22: completionService.submit(..)` -### ![](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Все изменения в проекте будут делаться на основе патчей -#### Скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... +Вычекать этот проект: +```git clone https://github.com/JavaOPs/masterjava.git``` + +> - [Настройка git на свой репозиторий](https://github.com/JavaOPs/basejava/blob/master/lesson/lesson1.md#настройка-проекта) +> - [Правила работы с патчами на проекте](https://github.com/JavaOPs/topjava/wiki/Git) + +#### Все изменения в проекте будут делаться на основе патчей: скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... ---------------------------- +- [Как сделать Java код проще и нагляднее](https://habrahabr.ru/company/wrike/blog/349652/) ### Ресурсы (основы) - Intuit, Потоки выполнения. Синхронизация @@ -66,9 +76,6 @@ --- ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Задание первого занятия -Вычекать этот проект: -```git clone https://github.com/JavaOPs/masterjava.git``` - - Применить оптимизацию к MatrixUtil.singleThreadMultiply - Реализовать метод `MatrixUtil.concurrentMultiply`, позволяющий многопоточно перемножать квадратные матрицы N*N. - Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`. From e494b8b5e83ddcd01e23a04910b286eb51c5490a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Fri, 20 Jan 2023 13:57:02 +0300 Subject: [PATCH 120/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 7fb3efe..ca17551 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -34,7 +34,7 @@ - idea-jmh-plugin, Exception while trying to acquire a JMH lock - Maven latest dependency version -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Формат XML. Создание схемы XSD. +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Формат XML. Создание схемы XSD. #### 2_6_xml_scheme.patch - История создания. XML формат и технологии, XML - Attribute vs Element. From b1eb205a818f39779e55dbfbc2e694357100200d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 7 Feb 2023 17:41:20 +0300 Subject: [PATCH 121/126] Update lesson02.md --- doc/lesson02.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/lesson02.md b/doc/lesson02.md index ca17551..d9359e5 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -44,6 +44,7 @@ ## Работа с XML в Java ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. JAXB, JAXP +Для генерации Java схемы из xsd проверьте плагин **Jakarta EE: Web Services (JAX-WS)**. Схема генериться через главное меню: _Tools -> XML Actions -> Generate Java code from XML Schema Using JAXB..._. Возможно пакет уже будет новый `jakarta`, поправте на `javax`. #### 2_7_JAXB.patch > - Добавил в `maven-surefire-plugin` UTF-8 > - Убрал лишний `synchronized` в `JaxbParser.marshal()` (уже есть в `JaxbMarshaller.marshal()`) From 4a9faab1f2dceada7faa757fa75c7c81abb36542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Wed, 23 Aug 2023 00:25:47 +0300 Subject: [PATCH 122/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index d9359e5..73a4050 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -36,7 +36,7 @@ ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Формат XML. Создание схемы XSD. #### 2_6_xml_scheme.patch -- История создания. XML формат и технологии, XML +- [Что такое XML](https://habr.com/ru/articles/524288/) - Attribute vs Element. - sequence/ choice/ all/ group. Define referring to Another XML Element - Лекции по XML From 07117a6a073e6df72559b281c7ccb4fba94c5448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Mon, 28 Aug 2023 18:52:13 +0300 Subject: [PATCH 123/126] Update lesson08.md --- doc/lesson08.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/lesson08.md b/doc/lesson08.md index 32c00d1..174da57 100644 --- a/doc/lesson08.md +++ b/doc/lesson08.md @@ -50,6 +50,7 @@ - Binary Data Transmission Using MTOM/XOP - Тестирование вложений через SoapUi. - Sending emails with attachments - +> При `timeout=10s` и `debug=true` в `mail.conf` для писем со вложениями логирование будет настолько долгим (attachments тоже логируются), что сервис будет отваливаться по таймату (но письма будут нормально отправляться). +Решение: при отправке писем со вложениями отключать дебаг или увеличивать таймаут (например 30s) ### Optional - Добавить Git revision в `version.html` From 1017a0206da3c5c275bd5889169ba60baf19a38a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Sat, 16 Sep 2023 20:37:06 +0300 Subject: [PATCH 124/126] Update lesson02.md --- doc/lesson02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lesson02.md b/doc/lesson02.md index 73a4050..8b920f1 100644 --- a/doc/lesson02.md +++ b/doc/lesson02.md @@ -60,7 +60,7 @@ ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. StAX #### 2_8_StAX.patch - [Java XML API: выбираем правильно. StAX: работаем с удовольствием](https://habrahabr.ru/post/339716/) -- StAX: XMLStreamReader, XMLEventReader +- StAX: XMLStreamReader, XMLEventReader ### ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. XPath > Поправка к видео на 2:29 - лет 10-15 назад был популярен подход рисовать квадратиками в специальном приложении логику [связываения через сообщения разных сервисов](https://www.mulesoft.com/resources/esb/what-esb). Сервисы подключались к [ESB](https://ru.wikipedia.org/wiki/ESB) по разным протоколам. Один из них был [JBI](https://hrwiki.ru/wiki/Java_Business_Integration). Все это было достаточно красиво для продаж, но очень неуклюже для разработки. Cейчас уже редко где можно встретить, хотя Spring Integration, Apache Camel и пр. для определенных приложений-процессов используют. From 9ea5039f3bca78fb98399570e4746a78fd54cd92 Mon Sep 17 00:00:00 2001 From: Ivan Ustinov <31504863+ivanustinov@users.noreply.github.com> Date: Fri, 8 Dec 2023 11:42:37 +0500 Subject: [PATCH 125/126] valid certification path --- doc/lesson06.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lesson06.md b/doc/lesson06.md index 722fcc6..4dd842b 100644 --- a/doc/lesson06.md +++ b/doc/lesson06.md @@ -103,6 +103,11 @@ > В случае DEBUG SMTP: AUTH LOGIN failed, Error: authentication failed: Invalid user or password! проверьте [Шаг 2. Создайте пароль приложения](https://yandex.ru/support/mail/mail-clients/others.html) - при галочке "Включить пароли приложений" нужно указывать пароль к приложению. +> При попытке подключиться к хосту smtp.yandex.ru(или другому) возможен `SunCertPathBuilderException: unable to find valid certification path to requested target`. +> В таком случае нужно или выполнить [две команды в терминале](https://sky.pro/media/isklyuchenie-sun-security-provider-certpath-suncertpathbuilderexception-v-java/) +> или [сделать все как в статье](https://mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/). +> Во втором случае перед запуском пропишите в аргументах приложения имя хоста(smtp.yandex.ru:465 если через яндекс) + - Сохранят результат отправки писем в DB (в `MailSender`). - DAO и модель для сохранения сделать в модуле `mail-service` - Протестировать отправку почты через SoapUI и/или `MailServiceClient` From 0b536ad294b518e2175b926accd3cfd560935f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B6=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20Java=20Enterprise?= Date: Tue, 23 Apr 2024 15:20:35 +0300 Subject: [PATCH 126/126] Update lesson01.md --- doc/lesson01.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lesson01.md b/doc/lesson01.md index a393684..d0b28d9 100644 --- a/doc/lesson01.md +++ b/doc/lesson01.md @@ -34,12 +34,12 @@ - Параллелизм в Java - Монитор (синхронизация) - Compare-and-swap -- Java Memory Model +- Java Memory Model - Синхронизация потоков - Обзор java.util.concurrent.* - Как работает ConcurrentHashMap - Справочник по синхронизаторам java.util.concurrent.* -- Использование ThreadLocal переменных +- Использование ThreadLocal переменных - Николай Алименков — Прикладная многопоточность - Can thread switching happen in the synchronized block? - [The Deadlock Empire](https://deadlockempire.github.io/)