# Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие ## Регистрация ## [Программа проекта](#Программа-проекта-1) ### [Изменения проекта (Release Notes)](ReleaseNotes.md) ### _Разработка полнофункционального многомодульного Maven проекта_ #### состоящего из 3-х веб приложений: ![image](https://cloud.githubusercontent.com/assets/13649199/23876457/ab01ff0a-084e-11e7-964f-49c90579fac9.png) - **приложение импорта** из XML (JAXB, StAX, XPath, XSLT) - **многопоточного почтового веб-сервиса** (JavaMail, java.util.concurrent, JAX-WS, MTOM, хендлеры авторизации, логирования и статистики) - **веб приложения отправки почты с вложениями** - по SOAP (JAX-WS, MTOM) - по JAX-RS (Jersey) - по JMS ([ActiveMQ](http://activemq.apache.org/)) - через [AKKA](http://akka.io/) - используя асинхронные сервлеты 3.0 - сохранение данных в PostgreSQL используя [jDBI](http://jdbi.org/) - миграция базы [LiquiBase](http://www.liquibase.org/) - использование в проекте [Guava](https://github.com/google/guava/wiki), [Thymleaf](http://www.thymeleaf.org/), [Lombok](https://projectlombok.org/), [StreamEx](https://github.com/amaembo/streamex), [Typesafe Config](https://github.com/typesafehub/config), [Java Microbenchmark JMH](http://openjdk.java.net/projects/code-tools/jmh) ### Требование к участникам Опыт программирования на Java. Базовые знания Maven. ### Необходимое ПО - JDK8 - Git - IntelliJ IDEA # Первое занятие: многопоточность. ## ![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 область памяти > Замечание: [с 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 - 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? - [The Deadlock Empire](https://deadlockempire.github.io/) - [Реактивное программирование - как, зачем и стоит ли?](https://habr.com/ru/company/oleg-bunin/blog/543386/) #### 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(..)` Вычекать этот проект: ```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/file/d/0B9Ye2auQ_NsFTE5ZV3pzWElxTWM/view?resourcekey=0-TF7H5aadPlE3aQukNC5Ejg), положите его в проект, правой мышкой на нем сделайте Apply Patch ... ---------------------------- - [Как сделать Java код проще и нагляднее](https://habrahabr.ru/company/wrike/blog/349652/) ### Ресурсы (основы) - Intuit, Потоки выполнения. Синхронизация - Алексей Владыкин, Основы многопоточность в Java - Виталий Чибриков, Java. Многопоточность - 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) Задание первого занятия - Применить оптимизацию к 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 ``` ----- # Программа проекта ## Занятие 2 - Разбор ДЗ (многопоточная реализация умножения матриц) - Java Microbenchmark JMH (от Алексея Шипилева) - Формат XML. Создание схемы XSD. - Работа с XML в Java - JAXB, JAXP - StAX - XPath - XSLT ## Занятие 3 - Разбор ДЗ (работа с XML) - [Обзор Guava](https://drive.google.com/open?id=0B9Ye2auQ_NsFeFB5a29JQ2tRNHM) - Монады. flatMap - SOA и Микросервисы - Многомодульный Maven проект ## Занятие 4 - Разбор ДЗ (реализация структуры проекта, загрузка и разбор xml) - Thymleaf - Maven. Поиск и разрешение конфликтов зависимостей - Подключаем логирование с общими настройкам - Библиотеки и фреймворки для работы с JDBC. - Модуль persistence ## Занятие 5 - Разбор ДЗ - Сохранение в базу в batch-моде с обработкой конфликтов - Вставка в несколько потоков - Конфигурирование приложения (Typesafe config) - Lombok ## Занятие 6 - Разбор ДЗ (доработка модели и модуля export) - Миграция DB - Веб-сервисы (REST/SOAP) - Java реализации SOAP - Имплементируем Mail Service ## Занятие 7 - Разбор ДЗ - реализация MailSender - сохранение результатов отправки в DB - импорт Проектов и Групп - Стили WSDL. Кастомизация WSDL - Публикация кастомизированного WSDL. Автогенерация. - Деплой в Tomcat - Создание клиента почтового сервиса - Реализация массовой и групповой отправки почты. HW7 ## Занятие 8 - Разбор ДЗ - Делаем общий mailService.wsdl - Обновление WSDL - Отправка почты из модуля webapp - Доступ к переменным maven в приложении - SOAP Exception. Выделение общей части схемы - Коррекция схемы ## Занятие 9 - Добавление мавен плагинов (copy-rename-maven-plugin, maven-antrun-plugin, liquibase-maven-plugin) - Разбор ДЗ - Реализация вложений в веб-сервисе - Подключение MTOM - Реализация загрузки вложений в модуле webapp - Реализация вложений в почте - JAX-WS Message Context. Авторизация - JAX-WS Handlers (логирование SOAP) - Домашнее задание. Статистика ## Занятие 10 - Разбор ДЗ - Реализация SOAP handlers - Конфигурирование сервисов - JavaEE - JAX-RS. Интеграция с Jersey - JMS. Интеграция с [ActiveMQ](http://activemq.apache.org/) ## Занятие 11 - Авторизация в контейнере Tomcat - Отправка почты с вложениями - по JAX-RS - по JMS - Рефакторинг. Эксепшены в лямбдах Java 8 - Concurrent and distributed applications toolkit AKKA - Отсылка почты через AKKA Actors (Typed и Untyped Actors) - Асинхронные сервлеты 3.0 - Домашнее задание - Разбор решения с асинхронными сервлетами - [Выбор языка программирования](https://drive.google.com/open?id=0B9Ye2auQ_NsFZUVNakNxeUtGeFE)