# Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие
## Регистрация
## [Программа проекта](#Программа-проекта-1)
### [Изменения проекта (Release Notes)](ReleaseNotes.md)
### _Разработка полнофункционального многомодульного Maven проекта_
#### состоящего из 3-х веб приложений:

- **приложение импорта** из 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
# Первое занятие: многопоточность.
##  1. Вступление. Многопоточность и параллельность.

##  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
##  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. Атомарные переменные и конкурентные таблицы
##  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/)
---
##  Задание первого занятия
- Применить оптимизацию к MatrixUtil.singleThreadMultiply
- Реализовать метод `MatrixUtil.concurrentMultiply`, позволяющий многопоточно перемножать квадратные матрицы N*N.
- Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`.
- Добиться того, чтобы на матрице 1000*1000 многопоточная реализация была быстрее однопоточной
-----
##  Подсказки по 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)