Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00231 005700 18969740 na godz. na dobę w sumie
Java EE 8. Wzorce projektowe i najlepsze praktyki - książka
Java EE 8. Wzorce projektowe i najlepsze praktyki - książka
Autor: , Liczba stron: 256
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-5503-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> java - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

Od profesjonalnych systemów informatycznych wymaga się wysokiej dostępności usług, łatwego wprowadzania niezbędnych zmian, skalowalności i możliwości przetworzenia ogromnej ilości danych. Java EE 8 znakomicie nadaje się do tworzenia aplikacji spełniających te wyśrubowane kryteria. Poza tym Java to język wieloplatformowy, jej kod jest otwarty, została dobrze przetestowana, a doświadczenie i wsparcie społeczności użytkowników okazują się nie do przecenienia. Wszechstronność i popularność Javy ma też mroczną stronę - programiści bardzo często muszą rozwiązywać istotne problemy, które zwykle dotyczą integracji usług, wysokiej dostępności i odporności systemu na błędy. Rozwiązaniem pozwalającym uniknąć wielu z tych kłopotów jest zastosowanie odpowiednich wzorców projektowych i przestrzeganie dobrych praktyk.

To książka przeznaczona dla programistów, którzy chcą tworzyć aplikacje biznesowe z użyciem wzorców projektowych, wzorców biznesowych i najlepszych praktyk. Zawiera wyjaśnienie podstawowych koncepcji Javy EE 8, opis jej warstw oraz omówienie najlepszych praktyk tworzenia aplikacji biznesowych. Przedstawia zasady łączenia wzorców projektowych i wzorców biznesowych w Javie EE 8, a także techniki optymalizacji rozwiązań z wykorzystaniem programowania aspektowego, programowania reaktywnego i mikrousług. Opisano tu szereg wzorców: integracyjne, reaktywne, bezpieczeństwa, wdrażania i operacyjne. Zaprezentowano również projekt MicroProfile, przydatny do tworzenia aplikacji dla architektury mikrousług.

W książce między innymi:

Java EE 8: zestaw świetnych narzędzi dla zawodowca!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Java EE 8 Design Patterns and Best Practices Tłumaczenie: Rafał Jońca ISBN: 978-83-283-5503-3 Copyright © Packt Publishing 2018. First published in the English language under the title ‘Java EE 8 Design Patterns and Best Practices – (9781788830621)’ Polish edition copyright © 2019 by Helion SA All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/jee8wp Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci O autorach O redaktorze merytorycznym Wst(cid:218)p Rozdzia(cid:239) 1. Wprowadzenie do wzorców projektowych Czym s(cid:200) wzorce projektowe? Wzorce projektowe GoF Zalety wzorców projektowych Podstawowe wzorce projektowe (cid:258)rodowiska Java Wzorzec projektowy Singleton Wzorzec projektowy Fabryka abstrakcyjna Wzorzec projektowy Fasada Wzorzec projektowy Iterator Wzorzec projektowy Pe(cid:239)nomocnik Wzorce tworzenia aplikacji biznesowych Ró(cid:285)nice mi(cid:218)dzy wzorcami projektowymi i wzorcami tworzenia aplikacji biznesowych Podsumowanie Rozdzia(cid:239) 2. Wzorce warstwy prezentacji Warstwa prezentacji — co to takiego? Wzorzec filtra przechwytuj(cid:200)cego Implementacja filtra przechwytuj(cid:200)cego w Javie EE 8 Implementacja klasy LogAccessFilter Implementacja klasy LogBrowserFilter W(cid:239)a(cid:258)ciwe przypisanie filtrów 11 12 13 19 20 20 23 24 24 25 26 27 28 29 29 30 31 31 33 34 34 36 37 Poleć książkęKup książkę Spis tre(cid:286)ci Wzorzec kontrolera przedniego Implementacja klasy dzia(cid:239)aj(cid:200)cej jako FrontController Implementacja polece(cid:241) Wzorzec kontrolera aplikacji Implementacja klasy DownloadFrontController Implementacja klasy DownloadApplicationController Implementacja polece(cid:241) Ró(cid:285)nice mi(cid:218)dzy wzorcami kontrolera frontowego i aplikacyjnego Podsumowanie Rozdzia(cid:239) 3. Wzorce warstwy biznesowej Warstwa biznesowa — co to takiego? Wzorzec delegat biznesowy Warstwy programowe i sprz(cid:218)towe Klasyczny scenariusz u(cid:285)ycia delegata biznesowego Zalety wzorca delegata biznesowego Wzorzec fasady sesyjnej Zalety fasady sesyjnej Implementacja wzorca fasady sesyjnej w Javie EE Klasyczny scenariusz u(cid:285)ycia wzorca fasady sesyjnej Implementacja wzorca fasady sesyjnej Wzorzec obiektu biznesowego Aplikacje o z(cid:239)o(cid:285)onych regu(cid:239)ach biznesowych Implementacja wzorca obiektu biznesowego Podsumowanie Rozdzia(cid:239) 4. Wzorce integracyjne Czym jest warstwa integracyjna? Wzorzec dost(cid:218)pu do danych Implementacja wzorca dost(cid:218)pu do danych Implementacja encji przy u(cid:285)yciu JPA Implementacja DAO Wzorzec magazynu dziedzinowego Implementacja wzorca magazynu dziedzinowego Implementacja klasy PersistenceManagerFactory Implementacja klasy PersistenceManager Implementacja klasy EmployeeStoreManager Implementacja interfejsu StageManager Implementacja klasy TransactionFactory Implementacja klasy Transaction Implementacja klasy EmployeeBusiness Wzorzec aktywatora us(cid:239)ugi JMS (Java Message Service) Metody asynchroniczne EJB Zdarzenia asynchroniczne — producenci i nas(cid:239)uchuj(cid:200)cy 6 38 39 41 41 42 43 46 48 48 49 49 51 51 53 55 57 57 58 58 60 71 72 75 77 79 79 80 81 81 83 86 87 88 89 90 91 93 93 94 95 96 97 98 Poleć książkęKup książkę Spis tre(cid:286)ci Implementacja wzorca aktywatora us(cid:239)ugi Implementacja wysy(cid:239)ania i otrzymywania komunikatów poprzez JMS Implementacja metod asynchronicznych EJB Implementacja zdarze(cid:241) asynchronicznych — producenci i nas(cid:239)uchuj(cid:200)cy Podsumowanie Rozdzia(cid:239) 5. Programowanie aspektowe i zwi(cid:200)zane z tym wzorce projektowe Programowanie aspektowe — co to takiego? Programowanie aspektowe czasu kompilacji czy czasu dzia(cid:239)ania? Programowanie aspektowe w Javie EE — interceptor Kilka s(cid:239)ów na temat CDI i komponentów bean Komponent bean Lu(cid:283)ne powi(cid:200)zanie Interceptory na platformie Javy EE Implementacja interceptora EJB Implementacja interceptora CDI Dekorator Wzorzec Dekorator Dekorator w systemie Javy EE Implementacja dekoratora Podsumowanie Rozdzia(cid:239) 6. Wzorce reaktywne Zdarzenia w CDI Implementacja zdarzenia w CDI Implementacja klasy FileUploadResource Implementacja obserwatorów Asynchroniczne metody komponentów EJB Ró(cid:285)nice mi(cid:218)dzy zdarzeniami i asynchronicznym wywo(cid:239)aniem metody Implementacja asynchronicznej metody EJB Implementacja komponentów EJB Implementacja klasy FileUploadResource Asynchroniczna us(cid:239)uga REST Implementacja asynchronicznej us(cid:239)ugi REST Implementacja EJB Implementacja klasy FileUploadResource Implementacja API klienckiego Podsumowanie Rozdzia(cid:239) 7. Wzorce mikrous(cid:239)ug Wzorzec mikrous(cid:239)ug — co to takiego? Wewn(cid:200)trz aplikacji monolitycznej Sze(cid:258)cian skalowalno(cid:258)ci Czym naprawd(cid:218) s(cid:200) mikrous(cid:239)ugi? Jak dzia(cid:239)a architektura mikrous(cid:239)ug? Aplikacja podzielona na wiele ma(cid:239)ych komponentów Zespo(cid:239)y wielozadaniowe Skupienie si(cid:218) na produkcie 99 99 100 101 102 103 104 104 105 105 106 107 108 109 115 119 119 120 121 123 125 127 127 128 132 134 134 134 135 137 139 139 140 141 144 145 147 147 149 151 152 152 153 156 156 7 Poleć książkęKup książkę Spis tre(cid:286)ci Prostsze i inteligentniejsze przetwarzanie Zdecentralizowane zarz(cid:200)dzanie bibliotekami i API Zasada jednej odpowiedzialno(cid:258)ci Odporno(cid:258)(cid:202) na b(cid:239)(cid:218)dy Systemy ewolucyjne Zdecentralizowane dane Kiedy stosowa(cid:202) architektur(cid:218) mikrous(cid:239)ug? Jak podzieli(cid:202) aplikacj(cid:218) na mikrous(cid:239)ugi? Zalety i wady aplikacji wykorzystuj(cid:200)cych mikrous(cid:239)ugi Wzorce architektury mikrous(cid:239)ugowej Wzorzec agregator Wzorzec pe(cid:239)nomocnik Wzorzec (cid:239)a(cid:241)cuch Wzorzec rozga(cid:239)(cid:218)zienie Wzorzec asynchronicznego przekazywania komunikatów Implementacja mikrous(cid:239)ug Podsumowanie Rozdzia(cid:239) 8. Wzorce dla aplikacji dzia(cid:239)aj(cid:200)cych w chmurze Poj(cid:218)cie aplikacji dzia(cid:239)aj(cid:200)cej w chmurze Cele stawiane aplikacjom dostosowanym do dzia(cid:239)ania w chmurze Wzorce projektowe aplikacji dzia(cid:239)aj(cid:200)cych w chmurze Aplikacja jako kompozyt (mikrous(cid:239)ugi) Abstrakcja Metodologia dwunastu czynników Brama interfejsu API Rejestr serwisów Serwer konfiguracji Bezpiecznik Podsumowanie Rozdzia(cid:239) 9. Wzorce bezpiecze(cid:241)stwa Poj(cid:218)cie wzorców bezpiecze(cid:241)stwa Wzorzec pojedynczego miejsca rejestracji Implementacja pojedynczego miejsca rejestracji Implementacja klasy AuthenticationResource Implementacja klas App1 i App2 Mechanizmy uwierzytelniania Uwierzytelnianie proste Uwierzytelnianie na podstawie formularza Uwierzytelnianie w oparciu o skrót Uwierzytelnianie klienta Uwierzytelnianie wzajemne Kiedy stosowa(cid:202) deskryptor wdro(cid:285)enia, adnotacj(cid:218) lub konfiguracj(cid:218) programow(cid:200)? Implementacja mechanizmów uwierzytelniania Implementacja pliku web.xml Implementacja klasy HelloWorld Implementacja klasy HelloWorldServlet 8 157 157 157 158 159 159 159 160 163 164 165 165 166 167 167 168 171 173 173 174 175 176 176 176 182 184 184 185 187 189 189 190 192 192 197 200 200 200 202 202 202 202 204 205 205 207 Poleć książkęKup książkę Interceptor uwierzytelniania Implementacja interceptora uwierzytelniania Implementacja interceptora CDI Implementacja zasobu JAX-RS Podsumowanie Rozdzia(cid:239) 10. Wzorce wdra(cid:285)ania Wzorce wdra(cid:285)ania — co to takiego? Wdra(cid:285)anie kanarkowe Wskazanie serwerów kanarkowych Wdro(cid:285)enie nowej wersji na serwery kanarkowe Testowanie aplikacji i weryfikacja, czy ca(cid:239)y system dzia(cid:239)a poprawnie Wdro(cid:285)enie aplikacji na pozosta(cid:239)e serwery Wdra(cid:285)anie niebieski-zielony Okre(cid:258)lenie serwerów maj(cid:200)cych otrzyma(cid:202) aktualizacj(cid:218) jako pierwsze Wdro(cid:285)enie aplikacji na wybranej grupie serwerów Wdro(cid:285)enie aplikacji na pozosta(cid:239)ych serwerach Wdra(cid:285)anie z testami A/B Zdefiniowanie grupy u(cid:285)ytkowników ko(cid:241)cowych Okre(cid:258)lenie serwerów, na których zostanie umieszczona nowa wersja Wdro(cid:285)enie nowej wersji Ocena wp(cid:239)ywu nowej wersji na u(cid:285)ytkowników Wdra(cid:285)anie ci(cid:200)g(cid:239)e Podsumowanie Rozdzia(cid:239) 11. Wzorce operacyjne Wzorzec operacyjny — co to takiego? Wzorce zwi(cid:200)zane z wydajno(cid:258)ci(cid:200) i skalowalno(cid:258)ci(cid:200) Pami(cid:218)(cid:202) podr(cid:218)czna Wzorzec CQRS (cid:189)ród(cid:239)a zdarze(cid:241) Tabela indeksowa Zmaterializowany widok Sharding Wzorce zwi(cid:200)zane z zarz(cid:200)dzaniem i monitoringiem Wzorzec ambasador Wzorzec monitorowania dzia(cid:239)ania aplikacji Wzorzec zewn(cid:218)trznego magazynu z konfiguracj(cid:200) Podsumowanie Rozdzia(cid:239) 12. Projekt MicroProfile Tworzenie projektów Eclipse MicroProfile Eclipse MicroProfile Config 1.3 Eclipse MicroProfile Fault Tolerance 1.1 Eclipse MicroProfile Health Check 1.0 Eclipse MicroProfile JWT Authentication 1.1 Eclipse MicroProfile Metrics 1.1 Eclipse MicroProfile OpenAPI 1.0 Spis tre(cid:286)ci 208 208 209 213 214 215 215 217 218 219 219 219 219 220 220 221 221 222 223 223 223 223 224 225 225 226 227 229 230 231 233 234 235 236 237 238 239 241 241 242 242 242 243 243 243 9 Poleć książkęKup książkę Spis tre(cid:286)ci Eclipse MicroProfile OpenTracing 1.1 Eclipse MicroProfile Rest Client 1.1 CDI 2.0 Common Annotations 1.3 JAX-RS 2.1 JSON-B 1.0 JSON-P 1.1 Dlaczego powinni(cid:258)my u(cid:285)ywa(cid:202) projektu MicroProfile? Spo(cid:239)eczno(cid:258)(cid:202) Przysz(cid:239)o(cid:258)(cid:202) projektu Podsumowanie Skorowidz 243 243 244 244 244 244 244 245 245 245 245 247 10 Poleć książkęKup książkę 6 Wzorce reaktywne W tym rozdziale przyjrzymy si(cid:218) wzorcom reaktywnym i ich implementacjom. Napiszemy, jak z ich pomoc(cid:200) tworzy(cid:202) lepsze aplikacje. Zajmiemy si(cid:218) te(cid:285) wyja(cid:258)nieniem, jak pewne ogólne koncepcje programowania reaktywnego wspomagaj(cid:200) sam proces programowania. Po przeczy- taniu rozdzia(cid:239)u b(cid:218)dziesz móg(cid:239) stosowa(cid:202) wzorce reaktywne w zgodzie z najlepszymi prakty- kami Javy EE 8. W tym rozdziale poruszone zostan(cid:200) nast(cid:218)puj(cid:200)ce tematy: (cid:81) poj(cid:218)cie programowania reaktywnego; (cid:81) zdarzenia w mechanizmie CDI; (cid:81) implementacja zdarzenia CDI; (cid:81) asynchroniczne metody EJB; (cid:81) implementacja asynchronicznej metody EJB; (cid:81) asynchroniczne us(cid:239)ugi REST; (cid:81) implementacje asynchronicznych us(cid:239)ug REST. Bardzo d(cid:239)ugo wiele aplikacji przetwarza(cid:239)o wszystkie (cid:285)(cid:200)dania w sposób synchroniczny. W takim systemie u(cid:285)ytkownik (cid:285)(cid:200)da zasobu i czeka na odpowied(cid:283). Ka(cid:285)dy element procesu jest wykonywany jeden po drugim. Diagram na nast(cid:218)pnej stronie przedstawia dzia(cid:239)anie procesu, gdy ten jest wykonywany w sposób synchroniczny. W procesie synchronicznym ka(cid:285)de wywo(cid:239)anie funkcji lub zasobu odbywa si(cid:218) w sposób sekwen- cyjny krok po kroku. Gdy pewne zadania wykonuj(cid:200) si(cid:218) d(cid:239)u(cid:285)ej, blokuj(cid:200) na ten czas ca(cid:239)y proces. Przyk(cid:239)adem zadania, które mo(cid:285)e potrwa(cid:202) d(cid:239)u(cid:285)ej, jest chocia(cid:285)by komunikacja wej(cid:258)cie-wyj(cid:258)cie zwi(cid:200)zana z odczytem danych z dysku lub (cid:283)ród(cid:239)a danych. Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki Wraz z rozwojem aplikacji internetowych pojawi(cid:239)a si(cid:218) konieczno(cid:258)(cid:202) jednoczesnego przyjmowania i obs(cid:239)ugi du(cid:285)ej liczby (cid:285)(cid:200)da(cid:241). W takiej konfiguracji przetwarzanie synchroniczne zacz(cid:218)(cid:239)o ujawnia(cid:202) swoje s(cid:239)abo(cid:258)ci, bo nie radzi(cid:239)o sobie z wystarczaj(cid:200)co szybkim przygotowywaniem odpowiedzi przy wielu (cid:285)(cid:200)daniach. Aplikacje internetowe zacz(cid:218)(cid:239)y wi(cid:218)c coraz intensywniej korzy- sta(cid:202) z procesów asynchronicznych, co w wielu przypadkach pozwala(cid:239)o na przyspieszenie zwracania odpowiedzi. W procesie asynchronicznym wywo(cid:239)ania funkcji lub zasobów mog(cid:200) odbywa(cid:202) si(cid:218) w sposób zrów- noleglony bez potrzeby oczekiwania na zako(cid:241)czenie jednego zadania przed rozpocz(cid:218)ciem nast(cid:218)pnego. W takiej sytuacji zlecenie d(cid:239)ugotrwa(cid:239)ego zadania wej(cid:258)cia-wyj(cid:258)cia nie opó(cid:283)ni rozpocz(cid:218)cia prac nad nast(cid:218)pnym — oba zadania mog(cid:200) si(cid:218) wykonywa(cid:202) równolegle. Programowanie reaktywne to styl programowania wykorzystuj(cid:200)cy elementy funkcyjne. Obs(cid:239)u- guje asynchronicznie strumienie danych wysy(cid:239)ane przez (cid:285)(cid:200)daj(cid:200)cych. Zasoby nas(cid:239)uchuj(cid:200) stru- mienia i reaguj(cid:200) na pojawiaj(cid:200)ce si(cid:218) w nim dane. Poszczególne zadania dzia(cid:239)aj(cid:200) jak funkcje i nie obs(cid:239)uguj(cid:200) zmiennych poza swoim zakresem, co pozwala funkcjom na zrównoleglone dzia(cid:239)anie bez (cid:285)adnej synchronizacji lub ryzyka efektów ubocznych. W programowaniu reaktywnym mamy do czynienia z elementami, które reaguj(cid:200) na zdarzenia, wi(cid:218)c je(cid:258)li u(cid:285)ytkownik (cid:285)(cid:200)da zasobu, zg(cid:239)asza zdarzenie do odpowiedniego strumienia. Po pojawie- niu si(cid:218) zdarzenia w strumieniu danych zadanie reaguje, uruchamiaj(cid:200)c swój algorytm przetwa- rzania. W ten sposób aplikacja internetowa mo(cid:285)e z (cid:239)atwo(cid:258)ci(cid:200) w tym samym czasie obs(cid:239)ugiwa(cid:202) wiele (cid:285)(cid:200)da(cid:241) bez problemów ze skalowalno(cid:258)ci(cid:200). Ca(cid:239)o(cid:258)(cid:202) opiera si(cid:218) na czterech filarach. Oto one. (cid:81) Elastyczno(cid:258)(cid:202) — reagowanie na popyt. Aplikacja z (cid:239)atwo(cid:258)ci(cid:200) korzysta z procesorów wielordzeniowych i wielu serwerów do przetwarzania (cid:285)(cid:200)da(cid:241). (cid:81) Odporno(cid:258)(cid:202) — reagowanie na pora(cid:285)ki. Aplikacja z (cid:239)atwo(cid:258)ci(cid:200) reaguje i powraca do pe(cid:239)nej sprawno(cid:258)ci po b(cid:239)(cid:218)dach programowych, sprz(cid:218)towych lub sieciowych. 126 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne (cid:81) Sterowanie komunikatami — reagowanie na zdarzenia. Aplikacja sk(cid:239)ada si(cid:218) z dzia(cid:239)aj(cid:200)cych asynchronicznie i nieblokuj(cid:200)co mened(cid:285)erów zdarze(cid:241) zamiast z wielu synchronicznie dzia(cid:239)aj(cid:200)cych w(cid:200)tków. (cid:81) Responsywno(cid:258)(cid:202) — reagowanie na u(cid:285)ytkowników. Aplikacja oferuje bogate interakcje przy bardzo niskim czasie oczekiwania. Java EE 8 oferuje odpowiednie narz(cid:218)dzia pozwalaj(cid:200)ce programi(cid:258)cie na zastosowanie programo- wania reaktywnego w tworzonych aplikacjach. Narz(cid:218)dziami tymi s(cid:200): zdarzenia z CDI, asynchro- niczne wywo(cid:239)ywanie metod komponentów EJB i asynchroniczne us(cid:239)ugi REST. Zdarzenia w CDI Gdy w (cid:258)rodowisku programistów ros(cid:239)a popularno(cid:258)(cid:202) programowania reaktywnego, j(cid:218)zyk Java i (cid:258)rodowisko Javy EE musia(cid:239)o zaoferowa(cid:202) narz(cid:218)dzia pozwalaj(cid:200)ce na pod(cid:200)(cid:285)anie za nowym tren- dem. W Javie EE skupiono si(cid:218) przede wszystkim na u(cid:239)atwieniu tworzenia programów w stylu funkcyjnym i u(cid:239)atwieniu obs(cid:239)ugi asynchroniczno(cid:258)ci. Efektem tych prac s(cid:200) mi(cid:218)dzy innymi zda- rzenia dost(cid:218)pne w CDI — kod mo(cid:285)e uruchomi(cid:202) zdarzenie w sposób synchroniczny i blokuj(cid:200)cy lub asynchroniczny i nieblokuj(cid:200)cy. W CDI zdarzenie (obiekt Event) to mechanizm, który korzysta z wzorca Obserwator, co pozwala na przekazanie zdarzenia w celu obróbki do dowolnych innych komponentów dzia(cid:239)aj(cid:200)cych w sposób asynchroniczny (nieblokuj(cid:200)cy) lub synchroniczny (blokuj(cid:200)cy). W tym rozdziale skupimy si(cid:218) na wersji asynchronicznej zdarze(cid:241), bo ona stanowi cz(cid:218)(cid:258)(cid:202) paradygmatu programowania reaktywnego. Implementacja zdarzenia w CDI Jako przyk(cid:239)ad implementacji zdarzenia w CDI wyobra(cid:283)my sobie asynchroniczny CDI i aplikacj(cid:218) pozwalaj(cid:200)c(cid:200) na przes(cid:239)anie trzech typów plików (obs(cid:239)ugiwanych na podstawie rozszerzenia): ZIP, JPG i PDF. W zale(cid:285)no(cid:258)ci od otrzymanego w (cid:285)(cid:200)daniu rozszerzenia uruchomi si(cid:218) jedno zdarzenie, a obserwator zapisze plik na dysku w asynchronicznym procesie. Ka(cid:285)de rozszerzenie b(cid:218)dzie posiada(cid:239)o w(cid:239)asnego obserwatora i w(cid:239)asny algorytm zapisu pliku. W tym przyk(cid:239)adzie u(cid:285)yjemy nast(cid:218)puj(cid:200)cych klas i interfejsów: (cid:81) FileUploadResource — klasa reprezentuje zasób, który otrzymuje wszystkie (cid:285)(cid:200)dania zwi(cid:200)zane z przesy(cid:239)aniem plików i uruchamia odpowiednie zdarzenie na podstawie rozszerzenia pliku; (cid:81) FileEvent — komponent bean z danymi pliku przekazywany do zdarzenia; (cid:81) FileHandler — interfejs dla wszystkich obserwatorów, czyli wszystkie klasy reaguj(cid:200)ce na FileEvent b(cid:218)d(cid:200) musia(cid:239)y implementowa(cid:202) FileHandler; (cid:81) JpgHandler — implementacja FileHandler, która zapisuje na dysku plik JPG; klasa jest obserwatorem reaguj(cid:200)cym na FileEvent zawieraj(cid:200)cy plik JPG; 127 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki (cid:81) PdfHandler — implementacja FileHandler, która zapisuje na dysku plik PDF; klasa jest obserwatorem reaguj(cid:200)cym na FileEvent zawieraj(cid:200)cy plik JPG; (cid:81) ZipHandler — implementacja FileHandler, która zapisuje na dysku plik ZIP; klasa jest obserwatorem reaguj(cid:200)cym na FileEvent zawieraj(cid:200)cy plik JPG; (cid:81) Jpg — to kwalifikator wskazuj(cid:200)cy, (cid:285)e obserwatorzy JpgHandler powinni reagowa(cid:202) na to zdarzenie; (cid:81) Pdf — to kwalifikator wskazuj(cid:200)cy, (cid:285)e obserwatorzy PdfHandler powinni reagowa(cid:202) na to zdarzenie; (cid:81) Zip — to kwalifikator wskazuj(cid:200)cy, (cid:285)e obserwatorzy ZipHandler powinni reagowa(cid:202) na to zdarzenie; (cid:81) FileSystemUtils — klasa narz(cid:218)dziowa zwi(cid:200)zana z obs(cid:239)ug(cid:200) systemu plików. Implementacja klasy FileUploadResource Klasa FileUploadResource jest klas(cid:200) wykorzystuj(cid:200)c(cid:200) JAX-RS do wykonania us(cid:239)ugi typu REST pozwalaj(cid:200)cej na przes(cid:239)anie plików o rozszerzeniach JPG, PDF i ZIP. Poni(cid:285)ej przedstawimy zarówno kod tej klasy, jak i kod kwalifikatorów s(cid:239)u(cid:285)(cid:200)cych do wyboru odpowiedniego obserwa- tora, który ma zareagowa(cid:202) na zdarzenie. Komponent bean wysy(cid:239)any w zdarzeniu Klasa FileEvent to komponent bean przesy(cid:239)any jako cz(cid:218)(cid:258)(cid:202) zdarzenia. Obiekt tej klasy otrzymaj(cid:200) obserwatorzy. import java.io.File; public class FileBean { private File file; private String mimeType; public FileBean(){} public FileBean(File file, String mimeType){ this.file = file; this.mimeType = mimeType; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } 128 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne public String getMimeType() { return mimeType; } public void setMimeType(String mimeType) { this.mimeType = mimeType; } } Kwalifikator wybieraj(cid:200)cy obserwatora JpgHandler jako obs(cid:239)uguj(cid:200)cego zdarzenie Poni(cid:285)szy kod definiuje kwalifikator Jpg pozwalaj(cid:200)cy w przysz(cid:239)o(cid:258)ci wskaza(cid:202), kto ma obs(cid:239)u(cid:285)y(cid:202) zdarzenie. import javax.inject.Qualifier; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER, ElementType.FIELD}) public @interface Jpg { } Kwalifikator wybieraj(cid:200)cy obserwatora PdfHandler jako obs(cid:239)uguj(cid:200)cego zdarzenie Poni(cid:285)szy kod definiuje kwalifikator Pdf pozwalaj(cid:200)cy w przysz(cid:239)o(cid:258)ci wskaza(cid:202), kto ma obs(cid:239)u(cid:285)y(cid:202) zdarzenie. import javax.inject.Qualifier; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER, ElementType.FIELD}) public @interface Pdf { } Kwalifikator wybieraj(cid:200)cy obserwatora ZipHandler jako obs(cid:239)uguj(cid:200)cego zdarzenie Poni(cid:285)szy kod definiuje kwalifikator Zip pozwalaj(cid:200)cy w przysz(cid:239)o(cid:258)ci wskaza(cid:202), kto ma obs(cid:239)u(cid:285)y(cid:202) zdarzenie. import javax.inject.Qualifier; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; 129 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER, ElementType.FIELD}) public @interface Zip { } Klasa FileUploadResource Poni(cid:285)szy kod przedstawia klas(cid:218) FileUploadResource b(cid:218)d(cid:200)c(cid:200) us(cid:239)ug(cid:200) REST wykorzystuj(cid:200)c(cid:200) JAX-RS. import javax.enterprise.event.Event; import javax.enterprise.util.AnnotationLiteral; import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import java.io.File; import java.util.Objects; @Path( upload ) public class FileUploadResource { @Inject Event FileEvent fileEvent; @Consumes( application/pdf ) @POST public Response uploadPdf(File file) { FileEvent fileEvent = new FileEvent(file, pdf ); Event FileEvent pdfEvent = this.fileEvent.select( new AnnotationLiteral Pdf () {}); pdfEvent.fireAsync(fileEvent) .whenCompleteAsync((event, err) - { if (Objects.isNull(err)) System.out.println( PDF zapisany ); else err.printStackTrace(); }); return Response.ok().build(); } @Consumes( image/jpeg ) @POST 130 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne public Response uploadJpg(File file) { FileEvent fileEvent = new FileEvent(file, jpg ); Event FileEvent jpgEvent = this.fileEvent.select( new AnnotationLiteral Jpg () {}); jpgEvent.fireAsync(fileEvent) .whenCompleteAsync((event, err) - { if (Objects.isNull(err)) System.out.println( JPG zapisany ); else err.printStackTrace(); }); return Response.ok().build(); } @Consumes( application/zip ) @POST public Response uploadZip(File file) { FileEvent fileEvent = new FileEvent( file, zip ); Event FileEvent zipEvent = this.fileEvent.select( new AnnotationLiteral Zip () {}); zipEvent.fireAsync(fileEvent) .whenCompleteAsync((event, err) - { if (Objects.isNull(err)) System.out.println( ZIP zapisany ); else err.printStackTrace(); }); return Response.ok().build(); } } Powy(cid:285)szy kod zawiera trzy metody — uploadPdf(File file), uploadJpg(File file) i uploadZip (cid:180)(File file) — wywo(cid:239)ywane odpowiednio, gdy u(cid:285)ytkownik przesy(cid:239)a plik o rozszerzeniu PDF, JPG lub ZIP. Klasa posiada w(cid:239)a(cid:258)ciwo(cid:258)(cid:202) fileEvent typu Event FileEvent . To klasa odpowiedzialna za uruchomienie zdarzenia zgodnie z kwalifikatorem. Oto fragment, który odpowiada za wybór odpowiedniego obiektu Event na podstawie kwalifikatora: Event FileEvent zipEvent = this.fileEvent.select(new AnnotationLiteral Zip () {}); Alternatywnym sposobem okre(cid:258)lenia odpowiedniego zdarzenia do uruchomienia jest wskazanie kwalifikatora w momencie wstrzykiwania obiektu za pomoc(cid:200) adnotacji @Inject, ale w ten sposób zdarzenie zawsze dotyczy(cid:239)oby jednego typu. U(cid:285)ycie metody select(Annotation... var) pozwala na dynamiczne decydowanie o rodzaju zdarzenia. Oto przyk(cid:239)ad zapisu zdarzenia w spo- sób statyczny: 131 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki @Inject @Pdf // Kwalifikator. Event FileEvent pdfEvent; Gdyby u(cid:285)y(cid:202) powy(cid:285)szego kodu, pdfEvent zawsze powodowa(cid:239)oby utworzenie zdarzenia, na które reagowaliby tylko obserwatorzy oznaczeni kwalifikatorem @Pdf. Aby wywo(cid:239)a(cid:202) zdarzenie asynchroniczne, musimy u(cid:285)y(cid:202) metody fireAsync(U var) zwracaj(cid:200)cej warto(cid:258)(cid:202) typu CompletionStage. Oto fragment kodu wywo(cid:239)uj(cid:200)cy metod(cid:218) oraz przygotowuj(cid:200)cy funkcj(cid:218) wywo(cid:239)ania zwrotnego informuj(cid:200)c(cid:200) o zako(cid:241)czeniu obs(cid:239)ugi zdarzenia. zipEvent.fireAsync(fileEvent) .whenCompleteAsync((event, err) - { if (Objects.isNull(err)) System.out.println( ZIP zapisany ); else err.printStackTrace(); }); Implementacja obserwatorów W momencie uruchomienia zdarzenia pewne elementy zareaguj(cid:200) na nie i uruchomi(cid:200) zadania zwi(cid:200)zane z przetworzeniem danych zawartych w zdarzeniu. Elementy te nazywamy obserwato- rami. Korzystaj(cid:200) one z obserwatora tworz(cid:200)cego mi(cid:218)dzy obiektami zwi(cid:200)zek typu jeden-do-wielu. Do takiej sytuacji dochodzi, gdy jeden obiekt jest (cid:283)ród(cid:239)em informacji, a pozosta(cid:239)e s(cid:200) jej obser- watorami. Gdy (cid:283)ród(cid:239)o wy(cid:258)le zdarzenie, otrzymaj(cid:200) je wszyscy obserwatorzy, którzy wcze(cid:258)niej zg(cid:239)osili ch(cid:218)(cid:202) jego otrzymania. CDI udost(cid:218)pnia mechanizm tworzenia obserwatorów reaguj(cid:200)cych na zg(cid:239)aszane zdarzenia. W przedstawionym przyk(cid:239)adzie dla ka(cid:285)dego rodzaju zdarzenia musimy utworzy(cid:202) obserwatora odpowiadaj(cid:200)cego za jego obs(cid:239)ug(cid:218). Wszystkie klasy obserwatorów b(cid:218)d(cid:200) implementowa(cid:239)y ten sam interfejs — FileHandler — zawieraj(cid:200)cy tylko jedn(cid:200) metod(cid:218) — handle(FileEvent file). Zwró(cid:202) uwag(cid:218), (cid:285)e typem parametru metody jest FileEvent, czyli dok(cid:239)adnie ten sam typ, którego u(cid:285)ywamy do zg(cid:239)oszenia zdarzenia. Oto implementacja interfejsu FileHandler: import java.io.IOException; public interface FileHandler { public void handle(FileEvent file) throws IOException; } Poni(cid:285)szy kod przedstawia klas(cid:218) JpgHandler b(cid:218)d(cid:200)c(cid:200) implementacj(cid:200) interfejsu FileHandler. Klasa odpowiada za zapis pliku JPG w systemie. Metoda klasy zostanie wywo(cid:239)ana, gdy dojdzie do zg(cid:239)oszenia zdarzenia oznaczonego kwalifikatorem @Jpg. import javax.enterprise.event.ObservesAsync; import java.io.IOException; import java.util.Date; 132 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne public class JpgHandler implements FileHandler { @Override public void handle(@ObservesAsync @Jpg FileEvent file) throws IOException { FileSystemUtils.save(file.getFile(), jpg , jpg_ + new Date().getTime() + .jpg ); } } Metoda klasy zawiera w parametrze zarówno adnotacj(cid:218) @ObservesAsync, jak i @Jpg. To zapis sto- sowany przez CDI, który wskazuje, (cid:285)e metoda obserwuje zdarzenia FileEvent, ale powinna by(cid:202) uruchamiana tylko wtedy, gdy zdarzenia te s(cid:200) oznaczone kwalifikatorem @Jpg. Poni(cid:285)szy kod przedstawia klas(cid:218) PdfHandler równie(cid:285) implementuj(cid:200)c(cid:200) FileHandler. Tym razem klasa odpowiada za zapis pliku PDF. Metoda klasy zostaje wywo(cid:239)ana, gdy dochodzi do zg(cid:239)oszenia zdarzenia oznaczonego kwalifikatorem @Pdf. import javax.enterprise.event.ObservesAsync; import java.io.IOException; import java.util.Date; public class PdfHandler implements FileHandler { @Override public void handle(@ObservesAsync @Pdf FileEvent file) throws IOException { FileSystemUtils.save(file.getFile(), pdf , pdf_ + new Date().getTime() + .pdf ); } } Metoda klasy zawiera w parametrze zarówno adnotacj(cid:218) @ObservesAsync, jak i @Pdf. W ten sposób informuje, (cid:285)e metoda obserwuje zdarzenia FileEvent, ale powinna by(cid:202) uruchamiana tylko dla zdarze(cid:241) oznaczonych kwalifikatorem @Pdf. Poni(cid:285)szy kod przedstawia klas(cid:218) ZipHandler równie(cid:285) implementuj(cid:200)c(cid:200) FileHandler. Tym razem klasa odpowiada za zapis pliku ZIP. Metoda klasy zostaje wywo(cid:239)ana, gdy dochodzi do zg(cid:239)oszenia zdarzenia oznaczonego kwalifikatorem @Zip. import javax.enterprise.event.ObservesAsync; import java.io.IOException; import java.util.Date; public class ZipHandler implements FileHandler { @Override public void handle(@ObservesAsync @Zip FileEvent file) throws IOException { FileSystemUtils.save(file.getFile(), zip , zip_ + new Date().getTime() + .zip ); } } 133 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki Metoda klasy zawiera w parametrze zarówno adnotacj(cid:218) @ObservesAsync, jak i @Zip. W ten sposób informuje, (cid:285)e metoda obserwuje zdarzenia FileEvent, ale powinna by(cid:202) uruchamiana tylko dla zdarze(cid:241) oznaczonych kwalifikatorem @Zip. Asynchroniczne metody komponentów EJB Tworzenie zdarze(cid:241) i przekazywanie ich do komponentów, które na nie reaguj(cid:200), to dobry me- chanizm do rozwi(cid:200)zywania wielu ró(cid:285)nych rodzajów problemów. Czasem jednak chcemy po prostu wywo(cid:239)a(cid:202) metod(cid:218) pewnej klasy bez konieczno(cid:258)ci blokowania procesu a(cid:285) do momentu jej zako(cid:241)czenia. Asynchroniczna metoda EJB to mechanizm, który pozwala klientowi wywo(cid:239)a(cid:202) metod(cid:218) i od razu uzyska(cid:202) z powrotem sterowanie (bez oczekiwania). Warto(cid:258)(cid:202), która zostanie w przysz(cid:239)o(cid:258)ci uzyskana jako wynik metody, znajdzie si(cid:218) w zwróconym obiekcie Future T . Co wi(cid:218)cej, klient mo(cid:285)e cz(cid:218)sto nawet sterowa(cid:202) wykonaniem metody, na przyk(cid:239)ad mo(cid:285)e j(cid:200) anulowa(cid:202). Obiekt poza wynikiem oferuje w(cid:239)a(cid:258)ciwo(cid:258)ci pozwalaj(cid:200)ce na sprawdzenie zako(cid:241)czenia prac, zg(cid:239)oszenia wyj(cid:200)tku lub anulowania przetwarzania. Ró(cid:285)nice mi(cid:218)dzy zdarzeniami i asynchronicznym wywo(cid:239)aniem metody Zarówno zdarzenia CDI, jak i asynchroniczne wywo(cid:239)ania metod EJB maj(cid:200) podobn(cid:200) charaktery- styk(cid:218), czyli oferuj(cid:200) nieblokuj(cid:200)ce wykonanie zadania. W przypadku wywo(cid:239)ania asynchronicznego klient ma mo(cid:285)liwo(cid:258)(cid:202) anulowania procesu i monitorowania post(cid:218)pów. G(cid:239)ówn(cid:200) ró(cid:285)nic(cid:200) mi(cid:218)dzy dwoma rodzajami wykonywania zada(cid:241) jest to, (cid:285)e metoda asynchroniczna dzia(cid:239)a na zasadzie jeden-do-jednego mi(cid:218)dzy wywo(cid:239)uj(cid:200)cym i wywo(cid:239)ywanym. Wywo(cid:239)uj(cid:200)cy dok(cid:239)adnie wie, co zosta- nie wywo(cid:239)ane i (cid:285)e zadanie b(cid:218)dzie dotyczy(cid:202) tylko prac zwi(cid:200)zanych z t(cid:200) metod(cid:200). W przypadku zdarze(cid:241) istnieje zwi(cid:200)zek typu jeden-do-wielu, bo wywo(cid:239)uj(cid:200)cy tylko zg(cid:239)asza zdarzenie, a ca(cid:239)(cid:200) reszt(cid:200) zajmuj(cid:200) si(cid:218) obiekty nas(cid:239)uchuj(cid:200)ce. W przypadku zdarze(cid:241) wywo(cid:239)uj(cid:200)cy nie jest w stanie dowiedzie(cid:202) si(cid:218) w (cid:239)atwy sposób o wyniku dzia(cid:239)a(cid:241), a samo wykonanie zada(cid:241) z racji zastosowania wzorca Obserwator mo(cid:285)e si(cid:218) opó(cid:283)ni(cid:202). Metoda asynchroniczna EJB nie stosuje obserwatora, zwraca wynik i najcz(cid:218)(cid:258)ciej jest uruchamiana od razu. Implementacja asynchronicznej metody EJB W przyk(cid:239)adzie zastosujemy ten sam scenariusz, co we wcze(cid:258)niejszym przyk(cid:239)adzie dotycz(cid:200)cym zdarze(cid:241) CDI. Aplikacja b(cid:218)dzie umo(cid:285)liwia(cid:239)a przes(cid:239)anie plików trzech typów (rozszerze(cid:241)): ZIP, PDF i JPG. W zale(cid:285)no(cid:258)ci od typu b(cid:218)dzie obs(cid:239)ugiwa(cid:239)a i zapisywa(cid:239)a pliki w ró(cid:285)nych folderach. W trakcie realizacji przyk(cid:239)adu wykonamy nast(cid:218)puj(cid:200)ce klasy: 134 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne (cid:81) FileUploadResource — klasa reprezentuje zasób, który otrzymuje wszystkie (cid:285)(cid:200)dania zwi(cid:200)zane z przesy(cid:239)aniem plików i wywo(cid:239)uje odpowiedni komponent EJB na podstawie rozszerzenia pliku; (cid:81) JpgHandler — komponent EJB, który zapisuje na dysku plik JPG; klasa zawiera metod(cid:218) asynchroniczn(cid:200); (cid:81) PdfHandler — komponent EJB, który zapisuje na dysku plik PDF; klasa zawiera metod(cid:218) asynchroniczn(cid:200); (cid:81) ZipHandler — komponent EJB, który zapisuje na dysku plik ZIP; klasa zawiera metod(cid:218) asynchroniczn(cid:200); (cid:81) FileSystemUtils — klasa narz(cid:218)dziowa zwi(cid:200)zana z obs(cid:239)ug(cid:200) systemu plików. Implementacja komponentów EJB Aby skorzysta(cid:202) z asynchronicznych metod EJB, musimy utworzy(cid:202) bean sesyjny i skonfigurowa(cid:202) go tak, aby stosowa(cid:239) metody asynchroniczne. Poni(cid:285)szy kod przedstawia implementacj(cid:218) klasy PdfHandler, czyli bean sesyjny odpowiedzialny za zapis plików typu PDF. import javax.ejb.AsyncResult; import javax.ejb.Asynchronous; import javax.ejb.Stateless; import java.io.IOException; import java.util.Date; import java.util.concurrent.Future; @Stateless public class PdfHandler { @Asynchronous public Future String handler(FileBean file) throws IOException { return new AsyncResult( FileSystemUtils.save( file.getFile(), pdf , pdf_ + new Date().getTime() + .pdf )); } } Powy(cid:285)szy kod zawiera w klasie PdfHandler metod(cid:218) handler(FileBean file). U(cid:285)ycie adnotacji @Asynchronous zamienia zwyk(cid:239)(cid:200) metod(cid:218) w metod(cid:218) asynchroniczn(cid:200). Oto ogólna sygnatura metody handle(FileBean file). @Asynchronous public Future String handler(FileBean file) throws IOException { // Logika biznesowa. } 135 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki Nale(cid:285)y zwróci(cid:202) uwag(cid:218), (cid:285)e metoda zwraca typ Future T . W tej konkretnej implementacji u(cid:285)ywamy obiektu klasy AsyncResult, która implementuje interfejs Future. W przyk(cid:239)adzie jako wynik wykonania metody zwracamy (cid:258)cie(cid:285)k(cid:218) do zapisanego pliku. Oto fragment realizuj(cid:200)cy opisane zadanie. return new AsyncResult( FileSystemUtils.save( file.getFile(), pdf , pdf_ + new Date().getTime() + .pdf )); Teraz zdefiniujemy klas(cid:218) o nazwie JpgHandler, która odpowiada(cid:202) b(cid:218)dzie za zapis w systemie pliku typu JPG. import javax.ejb.AsyncResult; import javax.ejb.Asynchronous; import javax.ejb.Stateless; import java.io.IOException; import java.util.Date; import java.util.concurrent.Future; @Stateless public class JpgHandler { @Asynchronous public Future String handler(FileBean file) throws IOException { return new AsyncResult( FileSystemUtils.save( file.getFile(), jpg , jpg_ + new Date().getTime() + .jpg )); } } Metoda w zasadzie jest taka sama jak metoda PdfHandler, ale zapisuje plik w innym folderze, stosuj(cid:200)c inny szablon nazw. Tak(cid:285)e i tym razem obiekt Future b(cid:218)dzie po wykonaniu zadania za- wiera(cid:239) (cid:258)cie(cid:285)k(cid:218) do zapisanego pliku. Ostatnia z klas obs(cid:239)ugi dotyczy zapisywania plików typu ZIP i nosi nazw(cid:218) ZipHandler. import javax.ejb.AsyncResult; import javax.ejb.Asynchronous; import javax.ejb.Stateless; import java.io.IOException; import java.util.Date; import java.util.concurrent.Future; @Stateless public class ZipHandler { @Asynchronous public Future String handler(FileBean file) throws IOException { 136 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne return new AsyncResult( FileSystemUtils.save( file.getFile(), zip , zip_ + new Date().getTime() + .zip )); } } Tak(cid:285)e i ta klasa dzia(cid:239)a jak dwie poprzednie, cho(cid:202) stosuje nieco inny wzorzec plików i zapisuje je w innym folderze. Podobnie jak wcze(cid:258)niej, obiekt Future b(cid:218)dzie po wykonaniu zadania zawiera(cid:239) (cid:258)cie(cid:285)k(cid:218) do zapisanego pliku. Implementacja klasy FileUploadResource Klasa FileUploadResource to klasa zasobu wykorzystuj(cid:200)ca JAX-RS do otrzymania us(cid:239)ugi typu REST obs(cid:239)uguj(cid:200)cej przesy(cid:239)anie plików o rozszerzeniach JPG, PDF lub ZIP. Oto kod klasy. import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import java.io.File; import java.io.IOException; @Path( upload ) public class FileUploadResource { @Inject private PdfHandler pdfHandler; @Inject private JpgHandler jpgHandler; @Inject private ZipHandler zipHandler; @Consumes( application/pdf ) @POST public Response uploadPdf(File file) throws IOException { FileBean fileBean = new FileBean(file, pdf ); pdfHandler.handler(fileBean); return Response.ok().build(); } @Consumes( image/jpeg ) @POST public Response uploadJpg(File file) throws IOException { 137 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki FileBean fileBean = new FileBean(file, jpg ); jpgHandler.handler(fileBean); return Response.ok().build(); } @Consumes( application/zip ) @POST public Response uploadZip(File file) throws IOException { FileBean fileBean = new FileBean(file, zip ); zipHandler.handler(fileBean); return Response.ok().build(); } } W powy(cid:285)szym kodzie klasy poni(cid:285)szy fragment odpowiada(cid:239) za wstrzykni(cid:218)cie klas PdfHandler, JpgHandler i ZipHandler za pomoc(cid:200) adnotacji @Inject. @Inject private PdfHandler pdfHandler; @Inject private JpgHandler jpgHandler; @Inject private ZipHandler zipHandler; Gdy do aplikacji trafi (cid:285)(cid:200)danie, metoda odpowiedzialna za jego przetworzenie pobiera plik i buduje obiekt typu FileBean. Nast(cid:218)pnie metoda ta wywo(cid:239)uje asynchroniczn(cid:200) metod(cid:218) EJB, aby zapisa(cid:202) plik. Trzy kolejne bloki kodu przedstawiaj(cid:200) operacje wywo(cid:239)ywania metody asynchronicznej. Wywo(cid:239)anie asynchronicznej metody EJB w celu zapisu pliku PDF Poni(cid:285)szy fragment kodu ilustruje zapis pliku PDF za pomoc(cid:200) wywo(cid:239)ania asynchronicznej metody EJB: FileBean fileBean = new FileBean(file, pdf ); pdfHandler.handler(fileBean); Wywo(cid:239)anie asynchronicznej metody EJB w celu zapisu pliku JPG Poni(cid:285)szy fragment kodu ilustruje zapis pliku PDF za pomoc(cid:200) wywo(cid:239)ania asynchronicznej metody EJB: FileBean fileBean = new FileBean(file, jpg ); jpgHandler.handler(fileBean); 138 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne Wywo(cid:239)anie asynchronicznej metody EJB w celu zapisu pliku ZIP Poni(cid:285)szy fragment kodu ilustruje zapis pliku PDF za pomoc(cid:200) wywo(cid:239)ania asynchronicznej metody EJB: FileBean fileBean = new FileBean(file, zip ); zipHandler.handler(fileBean); Asynchroniczna us(cid:239)uga REST Zdecydowanie ro(cid:258)nie liczba aplikacji oferuj(cid:200)cych API typu REST, a tak(cid:285)e liczba aplikacji korzy- staj(cid:200)cych z tego rodzaju us(cid:239)ug. Aplikacje u(cid:285)ywaj(cid:200)ce zasobów typu REST równie(cid:285) musz(cid:200) mie(cid:202) mo(cid:285)liwo(cid:258)(cid:202) asynchronicznego (czyli bez blokowania) przetwarzania procesów. Asynchroniczna us(cid:239)uga REST to asynchroniczny proces u(cid:239)atwiaj(cid:200)cy obs(cid:239)ug(cid:218) w(cid:200)tków. W przy- padku nadej(cid:258)cia (cid:285)(cid:200)dania do serwera mo(cid:285)e zosta(cid:202) utworzony nowy w(cid:200)tek, aby obs(cid:239)u(cid:285)y(cid:202) nieblo- kuj(cid:200)ce zadanie, na przyk(cid:239)ad operacje na systemie plików. JAX-RS obs(cid:239)uguje asynchroniczne przetwarzanie zarówno w API po stronie serwerowej, jak i po stronie klienckiej, ale asynchro- niczna us(cid:239)uga REST dotyczy cz(cid:218)(cid:258)ci serwerowej. Cz(cid:218)(cid:258)(cid:202) kliencka konsumuje zasoby us(cid:239)ugi, wi(cid:218)c j(cid:200) najcz(cid:218)(cid:258)ciej nazywamy asynchronicznym konsumentem REST. API klienckie mo(cid:285)e oczywi(cid:258)cie korzysta(cid:202) z asynchronicznego wywo(cid:239)ania, które zwraca obiekt typu Future T tu(cid:285) po zg(cid:239)oszeniu (cid:285)(cid:200)dania. Klient mo(cid:285)e (cid:258)ledzi(cid:202) post(cid:218)py wykonania i odpowiednio na nie reagowa(cid:202). Strona serwerowa zwraca obiekt typu CompletionStage T , co pozwala u(cid:285)y(cid:202) metody wywo(cid:239)ania zwrotnego wykonywanej w zale(cid:285)no(cid:258)ci od etapu. W przyk(cid:239)adowej implementacji przedstawionej dalej w tym rozdziale u(cid:285)yjemy wywo(cid:239)ania wykorzystuj(cid:200)ce programowanie reaktywne. Implementacja asynchronicznej us(cid:239)ugi REST Tak(cid:285)e przy implementacji asynchronicznej us(cid:239)ugi REST u(cid:285)yjemy tego samego przyk(cid:239)adowego zadania, co w przypadku zdarzenia CDI i asynchronicznej metody EJB. Przyk(cid:239)adowa aplikacja umo(cid:285)liwia(cid:202) b(cid:218)dzie przes(cid:239)anie trzech typów plików: ZIP, JPG i PDF. W zale(cid:285)no(cid:258)ci od rozszerze- nia plik b(cid:218)dzie trafia(cid:239) do ró(cid:285)nych folderów w systemie plików. W przyk(cid:239)adzie skorzystamy z na- st(cid:218)puj(cid:200)cych klas: (cid:81) FileUploadResource — klasa reprezentuje zasób wspó(cid:239)pracuj(cid:200)cy z procesem asynchronicznym, który otrzymuje wszystkie (cid:285)(cid:200)dania zwi(cid:200)zane z przesy(cid:239)aniem plików i wywo(cid:239)uje odpowiedni komponent EJB na podstawie rozszerzenia pliku; (cid:81) JpgHandler — komponent EJB zawieraj(cid:200)cy metod(cid:218), która zapisuje na dysku plik JPG; (cid:81) PdfHandler — komponent EJB zawieraj(cid:200)cy metod(cid:218), która zapisuje na dysku plik PDF; (cid:81) ZipHandler — komponent EJB zawieraj(cid:200)cy metod(cid:218), która zapisuje na dysku plik ZIP; 139 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki (cid:81) FileSystemUtils — klasa narz(cid:218)dziowa zwi(cid:200)zana z obs(cid:239)ug(cid:200) systemu plików; (cid:81) FileUploadClient — klient API zaimplementowany dzi(cid:218)ki JAX-RS, który w sposób asynchroniczny wywo(cid:239)uje us(cid:239)ug(cid:218) REST. Implementacja EJB Zaimplementujemy trzy komponenty EJB o nazwach PdfHandler, JpgHandler i ZipHandler, któ- rych zadaniem b(cid:218)dzie obs(cid:239)uga zapisu przes(cid:239)anego pliku w odpowiedniej lokalizacji. Pierwsza z klas, PdfHandler, odpowiada za zapis plików PDF. import javax.ejb.Stateless; import java.io.IOException; import java.util.Date; @Stateless public class PdfHandler { public String handler(FileBean file) throws IOException { return FileSystemUtils.save( file.getFile(), pdf , pdf_ + new Date().getTime() + .pdf ); } } Druga z klas, JpgHandler, odpowiada za zapis plików JPG. import javax.ejb.Stateless; import java.io.IOException; import java.util.Date; @Stateless public class JpgHandler { public String handler(FileBean file) throws IOException { return FileSystemUtils.save( file.getFile(), jpg , jpg_ + new Date().getTime() + .jpg ); } } Ostatnia z klas, ZipHandler, odpowiada za zapis plików ZIP. import javax.ejb.Stateless; import java.io.IOException; import java.util.Date; @Stateless public class ZipHandler { 140 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne public String handler(FileBean file) throws IOException { return FileSystemUtils.save( file.getFile(), zip , zip_ + new Date().getTime() + .zip ); } } Implementacja klasy FileUploadResource Klasa FileUploadResource to zasób zaprojektowany w taki sposób, aby umo(cid:285)liwi(cid:202) klientom przesy(cid:239)anie plików na serwer z u(cid:285)yciem asynchronicznego (cid:285)(cid:200)dania typu REST. Klasa korzysta z JAX-RS do utworzenia zasobu typu REST. Kod w zale(cid:285)no(cid:258)ci od rozszerzenia otrzymanego pliku deleguje zapis do odpowiedniego komponentu EJB. Oto kod klasy FileUploadResource. import javax.annotation.Resource; import javax.enterprise.concurrent.ManagedExecutorService; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import java.io.File; import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @Path( upload ) public class FileUploadResource { @Resource private ManagedExecutorService executor; @Consumes( application/pdf ) @POST public CompletionStage String uploadPdf(File file) { BeanManager beanManager = getBeanManager(); CompletableFuture String completionStage = new CompletableFuture (); executor.execute(() - { FileBean fileBean = new FileBean(file, pdf ); Bean PdfHandler bean = (Bean) beanManager.getBeans(PdfHandler.class).iterator().next(); CreationalContext cCtx = beanManager.createCreationalContext(bean); PdfHandler pdfHandler = (PdfHandler) beanManager.getReference(bean, PdfHandler.class, cCtx); 141 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki try { completionStage.complete(pdfHandler.handler( fileBean )); } catch (IOException e) { e.printStackTrace(); completionStage.completeExceptionally(e); } }); return completionStage; } private BeanManager getBeanManager(){ try { // R(cid:266)czne wyszukiwanie JNDI dotycz(cid:261)ce BeanManager CDI (JSR 299). return (BeanManager) new InitialContext().lookup( java:comp/BeanManager ); } catch (NamingException ex) { throw new IllegalStateException( B(cid:239)(cid:200)d wyszukania BeanManager w JNDI ); } } @Consumes( image/jpeg ) @POST public CompletionStage String uploadJpg(File file) throws IOException { BeanManager beanManager = getBeanManager(); CompletableFuture String completionStage = new CompletableFuture (); executor.execute(() - { FileBean fileBean = new FileBean(file, jpg ); Bean JpgHandler bean = (Bean) beanManager.getBeans(JpgHandler.class).iterator().next(); CreationalContext cCtx = beanManager.createCreationalContext(bean); JpgHandler jpgHandler = (JpgHandler) beanManager.getReference(bean, JpgHandler.class, cCtx); try { completionStage.complete(jpgHandler.handler( fileBean )); } catch (IOException e) { e.printStackTrace(); completionStage.completeExceptionally(e); } }); return completionStage; } @Consumes( application/zip ) @POST public CompletionStage String uploadZip(File file) throws IOException { 142 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne BeanManager beanManager = getBeanManager(); CompletableFuture String completionStage = new CompletableFuture (); executor.execute(() - { FileBean fileBean = new FileBean(file, zip ); Bean ZipHandler bean = (Bean) beanManager.getBeans(ZipHandler.class).iterator().next(); CreationalContext cCtx = beanManager.createCreationalContext(bean); ZipHandler zipHandler = (ZipHandler) beanManager.getReference(bean, ZipHandler.class, cCtx); try { completionStage.complete(zipHandler.handler(fileBean)); } catch (IOException e) { e.printStackTrace(); completionStage.completeExceptionally(e); } }); return completionStage; } } Przedstawiona powy(cid:285)ej klasa FileUploadResource posiada w(cid:239)a(cid:258)ciwo(cid:258)(cid:202) executor z wstrzykni(cid:218)tym obiektem typu ManagedExecutorService. Wstrzykiwanie odbywa si(cid:218) za pomoc(cid:200) adnotacji @Resource z CDI. Uzyskany obiekt pozwala utworzy(cid:202) nowy w(cid:200)tek i w nim wykona(cid:202) niezb(cid:218)dne zadanie. Oto omówiony fragment kodu klasy: @Resource private ManagedExecutorService executor; Dodatkowo klasa zawiera trzy metody otrzymuj(cid:200)ce (cid:285)(cid:200)danie, przygotowuj(cid:200)ce obiekt FileBean i wysy(cid:239)aj(cid:200)ce go do procesu EJB odpowiadaj(cid:200)cego za zapis pliku. Oto jedna z takich metod, uploadPdf(File file), która odpowiada za obs(cid:239)ug(cid:218) przes(cid:239)anego pliku typu PDF. @Consumes( application/pdf ) @POST public CompletionStage String uploadPdf(File file) { BeanManager beanManager = getBeanManager(); CompletableFuture String completionStage = new CompletableFuture (); executor.execute(() - { FileBean fileBean = new FileBean(file, pdf ); // Pobierz EJB poprzez CDI. Bean PdfHandler bean = (Bean) beanManager.getBeans(PdfHandler.class).iterator().next(); CreationalContext cCtx = beanManager.createCreationalContext(bean); PdfHandler pdfHandler = (PdfHandler) beanManager.getReference(bean, PdfHandler.class, cCtx); 143 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki try { completionStage.complete(pdfHandler.handler(fileBean)); } catch (IOException e) { e.printStackTrace(); completionStage.completeExceptionally(e); } }); return completionStage; } Przedstawiony fragment klasy FileUploadResource obs(cid:239)uguje przes(cid:239)ane pliki w sposób asynchro- niczny. Aby metoda mog(cid:239)a dzia(cid:239)a(cid:202) w sposób asynchroniczny, mo(cid:285)emy albo u(cid:285)y(cid:202) AsyncResponse (@Suspended final AsyncResponse ar) jako parametru metody, albo wskaza(cid:202), (cid:285)e zwraca ona do klienta obiekt typu CompletionStage T . W przyk(cid:239)adzie skorzystali(cid:258)my z tego drugiego roz- wi(cid:200)zania. Pozostaje jeszcze tylko utworzy(cid:202) osobny w(cid:200)tek, aby zadanie realizowa(cid:202) w sposób nieblokuj(cid:200)cy. Oto fragment metody uploadPdf, który odpowiada za utworzenie osobnego zadania zapisuj(cid:200)cego plik PDF. executor.execute(() - { FileBean fileBean = new FileBean(file, pdf ); Bean PdfHandler bean = (Bean) beanManager.getBeans(PdfHandler.class).iterator().next(); CreationalContext cCtx = beanManager.createCreationalContext(bean); PdfHandler pdfHandler = (PdfHandler) beanManager.getReference(bean, PdfHandler.class, cCtx); try { completionStage.complete(pdfHandler.handler(fileBean)); } catch (IOException e) { e.printStackTrace(); completionStage.completeExceptionally(e); } }); Implementacja API klienckiego Aby wys(cid:239)a(cid:202) asynchroniczne (cid:285)(cid:200)danie przy u(cid:285)yciu programowania reaktywnego, u(cid:285)yjemy API klienckiego oferowanego przez JAX-RS. Oto kod klasy realizuj(cid:200)cej to zadanie. public class ClientAPI { private static final String URL = http://localhost:8080/asyncRestService/resources/upload ; private static final String FILE_PATH = test.pdf ; public static void main(String[] args) { Client client = ClientBuilder.newClient(); WebTarget target = client.target(URL); try { 144 Poleć książkęKup książkę Rozdzia(cid:225) 6. • Wzorce reaktywne CompletionStage String csf = target.request() .rx() .post(Entity.entity(new FileInputStream( new File(FILE_PATH)), application/pdf ), String.class); csf.whenCompleteAsync((path, err) - { if (Objects.isNull(err)) System.out.println( Plik zapisano: + path); else err.printStackTrace(); }); } catch (FileNotFoundException e) { e.printStackTrace(); } } } Kod wysy(cid:239)a (cid:285)(cid:200)danie do serwera i pozwala na realizacj(cid:218) innych prac, bo sterowanie do kodu wy- wo(cid:239)uj(cid:200)cego powraca niemal(cid:285)e natychmiast. Dodatkowo kod tworzy funkcj(cid:218) wywo(cid:239)ania zwrotnego, która wykona si(cid:218) po zako(cid:241)czeniu asynchronicznego przetwarzania (cid:285)(cid:200)dania. Oto cz(cid:218)(cid:258)(cid:202) klasy ClientAPI realizuj(cid:200)ca przypisanie funkcji wywo(cid:239)ania zwrotnego do realizowanego (cid:285)(cid:200)dania. csf.whenCompleteAsync((path, err) - { if (Objects.isNull(err)) System.out.println( Plik zapisano: + path); else err.printStackTrace(); }); Podsumowanie W tym rozdziale przyjrzeli(cid:258)my si(cid:218) paradygmatowi programowania reaktywnego i jego implemen- tacji za pomoc(cid:200) mechanizmów Javy EE 8. Dodatkowo omówili(cid:258)my wykonywanie w Javie EE 8 wywo(cid:239)a(cid:241) asynchronicznych wraz ze sterowaniem nimi i otrzymywaniem wyniku poprzez funkcje wywo(cid:239)a(cid:241) zwrotnych. Zdarzenia w CDI to mechanizm stanowi(cid:200)cy cz(cid:218)(cid:258)(cid:202) specyfikacji CDI. Jest dost(cid:218)pny we wszyst- kich warstwach aplikacji. Okazuje si(cid:218) szczególnie przydatny w trakcie prac nad warstw(cid:200) pre- zentacji. Wynika to z faktu, i(cid:285) CDI skupia si(cid:218) g(cid:239)ównie na tej warstwie i ma spore znaczenie w interakcjach i sesjach HTTP. Co wa(cid:285)ne, zdarzenia pozwalaj(cid:200) przypisa(cid:202) jednej akcji wielu reaguj(cid:200)cych na ni(cid:200) odbiorców. Asynchroniczna metoda EJB nie stosuje paradygmatu programowania reaktywnego. Jest zwyk(cid:239)ym procesem asynchronicznym pozwalaj(cid:200)cym na zmniejszenie czasu niezb(cid:218)dnego do od- powiedzenia klientowi. Poniewa(cid:285) to mechanizm zwi(cid:200)zany z komponentami EJB, zaleca si(cid:218) 145 Poleć książkęKup książkę Java EE 8. Wzorce projektowe i najlepsze praktyki stosowanie go w warstwie biznesowej. Zalet(cid:200) tego rozwi(cid:200)zania jest dost(cid:218)p do innych mechani- zmów EJB, na przyk(cid:239)ad sterowania transakcjami. Asynchroniczna us(cid:239)uga REST to mechanizm specyfikacji JAX-RS pozwalaj(cid:200)cy na utworzenie us(cid:239)ugi REST realizuj(cid:200)cej przetwarzanie w trybie asynchronicznym. W tym mechanizmie sterowanie wraca do procesu tu(cid:285) po wys(cid:239)aniu (cid:285)(cid:200)dania, wi(cid:218)c klient nie musi bezczynnie czeka(cid:202) na jego zako(cid:241)czenie. Mechanizm ten stosuje si(cid:218) tylko na poziomie warstwy prezentacji. W nast(cid:218)pnym rozdziale przyjrzymy si(cid:218) bli(cid:285)ej wzorcom mikrous(cid:239)ug i sposobom ich implementacji. Omówimy równie(cid:285) kilka powi(cid:200)zanych z mikrous(cid:239)ugami wzorców szczegó(cid:239)owych, takich jak wzorzec agregatora, wzorzec przedstawiciela, wzorzec (cid:239)a(cid:241)cuchowania, wzorzec rozga(cid:239)(cid:218)ziania i wzorzec asynchronicznego przekazywania komunikatów. 146 Poleć książkęKup książkę Skorowidz B baza danych, 80, 149, 179 dzielenie na shardy, 235 LDAP, 80 NoSQL, 80 relacyjna, 81, 86, 231 bezpiecze(cid:241)stwo, 189 brama interfejsu API, 155, 156, 182 chmura, 173, 185 ograniczenia, 174 zalety, 173 cookie, 33 C D baza, Patrz: baza danych filtracja, 32 formatowanie, 32 kompresja, 105 spójno(cid:258)(cid:202), 229 walidacja, 32 (cid:283)ród(cid:239)o, 80, 81 dekorator, 103, 107, 119, 123 kolejno(cid:258)(cid:202), 123 delegat biznesowy, 49, 50, 51, 53, 54, 55, 56 Dependency inversion principle, Patrz: DIP deskryptor wdro(cid:285)enia, 202, 203 DIP, 158 A Abbott Martin, 151 abstrakcja, 23 adnotacja, 34, 203 interceptora, 109 aktywator us(cid:239)ugi, 79, 95, 99 algorytm, 22, 23 AOP, 103, 104, 208 API klienckie, 144 aplikacja budowanie, 179 ca(cid:239)o(cid:258)ciowa, 181 dzia(cid:239)aj(cid:200)ca w chmurze, 173, 174 konfiguracja, 176, 178 rozproszona, 175 uruchamianie, 180 wdra(cid:285)anie, Patrz: wdra(cid:285)anie wydawanie, 180 dzia(cid:239)anie, 152 model heksagonalny, 162 wady, 163, 164 wdra(cid:285)anie, 160, 161, 168 wielozadaniowo(cid:258)(cid:202), 156 wzorzec, Patrz: wzorzec architektury mikrous(cid:239)ugowej zagro(cid:285)enia, 153, 154, 158, 163, 164 zalety, 157, 159, 163 zastosowania, 159, 160 autoryzacja, 105 architektura mikrous(cid:239)ugowa, 148, 152, 156, 241 dane Poleć książkęKup książkę Skorowidz dowi(cid:200)zanie portów, 176, 181 drzewo cz(cid:218)(cid:258)(cid:202)-ca(cid:239)o(cid:258)(cid:202), 22 dziedziczenie, 20 dziennik aktywno(cid:258)ci, 177, 182 wywo(cid:239)a(cid:241), 105 (cid:285)(cid:200)da(cid:241), 33 Eclipse AspectJ, 104 encja JPA, 81, 82, 86 E F fasada sesyjna, 49, 50, 57, 58, 60, 68 filtr kompresji danych, 105 konwersji obrazów, 105 przechwytuj(cid:200)cy, 34 odwzorowanie na adresy, 37 wzorzec, Patrz: wzorzec filtra przechwytuj(cid:200)cego szyfruj(cid:200)cy, 105 tworzenia dzienników wywo(cid:239)a(cid:241), 105 logów audytowych, 105 tokenów, 105 uwierzytelniania i autoryzacji, 105 Fisher Michael, 151 Gamma Erich, 20 Gang Czworga, 20 Helm Richard, 20 hermetyzacja, 22, 23 G H I implementacja, 23 interceptor, 34, 103, 104, 105, 106, 107, 108, 123, 208 CDI, 105, 107, 116, 117, 208, 209 diagram interakcji, 108, 109 EJB, 105, 109, 110, 208 kolejno(cid:258)(cid:202), 113 248 Interface segregation principle, Patrz: ISP interfejs, 22 API brama, Patrz: brama interfejsu API ISP, 158 J Java serwlet, Patrz: serwlet jednorazowo(cid:258)(cid:202), 176, 181 j(cid:218)zyk programowania gramatyka, 22 obiektowy, 20 JMS, 96 Johnson Ralph, 20 K klasa abstrakcyjna, 84 FileEvent, 128 FileUploadResource, 127, 128, 130, 135, 137, 141, 143, 144 instancja, 23, 24 interceptora, 108, 113 wielokrotnego u(cid:285)ytku, 20 klucz publiczny, 202 kompilacja, 20 komponent bean, 106, 127, 128 wstrzykiwanie, 106 zarz(cid:200)dzany, 106, 107 bean sterowany komunikatem, Patrz: MDB EJB, 135 internetowy, 31 JAX-RS, 32 JAX-WS, 32 webowy, Patrz: komponent internetowy konwersja obrazów, 105 L Liskov substitution principle, Patrz: LSP log audytowy, 105 logika biznesowa, 22, 49, 57, 80, 104, 149 integracyjna, 80 tworzenia obiektów, 22 LSP, 158 Poleć książkęKup książkę M O baza danych, 159 biznesowa, 160 identyfikacja, 160 implementacja, 168 modyfikacje, 156 techniczna, 160 MOM, 96 obiekt, 20 magazyn dziedzinowy, 79, 86, 87 Martin Robert Cecil, 158 MDB, 96 metoda asynchroniczna, 96, 97, 100, 101 EJB, 134, 138, 139 metodologia dwunastu czynników, 176, 180, 181, 182 mikrous(cid:239)uga, 147, 148, 151, 152, 184 anemiczny, 59 biznesowy, 49, 50, 57, 58, 71, 73, 74, 75, 81 dost(cid:218)pu do danych, 79, 80, 81, 83, 86 Event, 127, Patrz te(cid:285): zdarzenie w CDI inicjalizacja, 20 kopia, 23 nieanemiczny, 59 POJO, 57 po(cid:258)rednicz(cid:200)cy, Patrz: pe(cid:239)nomocnik przechwytuj(cid:200)cy, 106, Patrz te(cid:285): interceptor stan wewn(cid:218)trzny, 22, 23 tworzenie, 20, 22 zale(cid:285)no(cid:258)(cid:202), Patrz: zale(cid:285)no(cid:258)(cid:202) obserwator, 132 OCP, 158 Open closed principle, Patrz: OCP oprogramowanie biznesowe, 29 jako us(cid:239)uga, Patrz: SaaS zorientowane na przetwarzanie komunikatów, 96 P pami(cid:218)(cid:202) podr(cid:218)czna, 227 czas (cid:285)ycia danych, 228 lokalna, 229 oczyszczanie, 228 wype(cid:239)nianie, 228 Skorowidz pe(cid:239)nomocnik, 23 plik beans.xml, 123 cookie, Patrz: cookie EAR, 149 WAR, 149 web.xml, 37, 205 XML, 34 powi(cid:200)zanie lu(cid:283)ne, 107 proces administracyjny, 177, 182 asynchroniczny, 126 bezstanowy, 176, 180 synchroniczny, 125 programowanie aspektowe, Patrz: AOP reaktywne, 126, 127 rozproszone, 175 projekt Eclipse MicroProfile, 241, 245 protokó(cid:239) dost(cid:218)powy, 184 HTTP, 31 przegl(cid:200)darki weryfikacja, 33 R repozytorium kodu, 176, 177 S SaaS, 176 Service-Oriented Architecture, Patrz: SOA serwer kanarkowy, 218, 219 konfiguracji, 185 serwlet, 32, 34, 52, 106 atrybut, 40 nazwa, 37, 38 sharding, 151, 227, 235 Single Responsibility Principle, Patrz: SRP skalowalno(cid:258)(cid:202), 151, 159, 226, 231, 235 SOA, 148 Software as a Service, Patrz: SaaS SRP, 157, 158 SSO, Patrz: wzorzec pojedynczego miejsca strategia wdra(cid:285)ania, Patrz: wzorzec wdra(cid:285)ania sze(cid:258)cian skalowalno(cid:258)ci, Patrz: skalowalno(cid:258)(cid:202) rejestracji sze(cid:258)cian 249 Poleć książkęKup książkę Skorowidz (cid:258)rodowisko, 177, 182 tabela indeksowa, 231 technologia CDI, 50 EJB, 49 JavaServer Faces, 32 JavaServer Pages, 32 JAX-RS, 52 JAX-WS, 52 JPA, 49 JSF, 52 JSP, 52 token, 105, 192, 194 (cid:165) T U us(cid:239)uga aktywator, Patrz: aktywator us(cid:239)ugi backendowa, 176, 178 REST, 130, 139 sieciowa, 32 uwierzytelnianie, 33, 105, 194, 197, 198, 200, 202 implementacja, 204, 205, 207 klienta, 200, 202 na podstawie formularza, 200 proste, 200 w oparciu o skrót, 200, 202 wzajemne, 200, 202 Vlissides John, 20 V W warstwa biznesowa, 29, 31, 49, 51, 52 danych, 51, 52, 149
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Java EE 8. Wzorce projektowe i najlepsze praktyki
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: