{"id":12927,"date":"2022-12-08T11:35:58","date_gmt":"2022-12-08T10:35:58","guid":{"rendered":"https:\/\/vived.io\/?p=12927"},"modified":"2022-12-08T11:36:00","modified_gmt":"2022-12-08T10:36:00","slug":"feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/","title":{"rendered":"Feature Freeze dla JDK 20 &#8211; co przyniesie nowa edycja? &#8211; JVM Weekly 116"},"content":{"rendered":"\n<h2 id=\"1-feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja\" data-num=1>1. Feature Freeze dla JDK 20 &#8211; co przyniesie nowa edycja?<\/h2>\n\n\n\n<p>Kiedy poprzednia Java sk\u0142ada\u0142a si\u0119 g\u0142\u00f3wnie z Preview, przyznam, \u017ce by\u0142o w tym co\u015b fascynuj\u0105cego. W ko\u0144cu to w\u0142a\u015bnie JDK 19 pozwala\u0142o nam spojrze\u0107 w przysz\u0142o\u015b\u0107 tego, jak rozwija\u0107 si\u0119 b\u0119dzie platforma w najbli\u017cszych latach i posmakowa\u0107 wynik\u00f3w kilku d\u0142ugo oczekiwanych projekt\u00f3w. Musz\u0119 jednak przyzna\u0107, \u017ce ci\u0119\u017cko wykrzesa\u0107 mi jest podobny entuzjazm w stosunku do JDK 20. Ponownie mamy do czynienia z zestawem Preview, ale s\u0105 to w zasadzie drobne iteracje (z wyj\u0105tkami o kt\u00f3rych za chwil\u0119) ju\u017c istniej\u0105cych API. A wraz z dzisiejszym dniem, nowa Java wchodzi w faz\u0119 Rampdown &#8211; oznacza ona, \u017ce lista funkcjonalno\u015bci zosta\u0142a zamro\u017cona i nie mo\u017cna spodziewa\u0107 si\u0119 \u017cadnych dalszych nowinek. <\/p>\n\n\n\n<p>Finalnie wi\u0119c lista nowo\u015bci w JDK 20 prezentuje si\u0119 wi\u0119c nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/openjdk.org\/jeps\/429\">429: Scoped Values (Incubator)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/432\">432: Record Patterns (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/433\">433: Pattern Matching for switch (Fourth Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/434\">434: Foreign Function &amp; Memory API (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/436\">436: Virtual Threads (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/437\">437: Structured Concurrency (Second Incubator)<\/a><\/li><\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"371\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-18.png\" alt=\"\" class=\"wp-image-12940\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-18.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-18-300x223.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n<p>Jak widzicie, zupe\u0142nie nowych rzeczy jest jak na lekarstwo. I oczywi\u015bcie, sam fakt, \u017ce API w wersji preview przechodz\u0105 zmiany jest czym\u015b pozytywnym, a takie dodatki w <strong>Foreign Function &amp; Memory API<\/strong> s\u0105 ca\u0142kiem przyjemne &#8211; o nich mo\u017cecie przeczyta\u0107 cho\u0107by u <a href=\"https:\/\/twitter.com\/pminborg\">Pera Minborga<\/a>, kt\u00f3ry opublikowa\u0142 tekst <a href=\"https:\/\/minborgsjavapot.blogspot.com\/2022\/12\/java-20-sneak-peek-on-panama-ffm-api.html\">Java 20: A Sneak Peek on the Panama FFM API (Second Preview)<\/a>. Je\u017celi jeste\u015bcie za\u015b ciekawi szczeg\u00f3\u0142\u00f3w zmian w proposalach nowych rekord\u00f3w i pattern matchingu, o <a href=\"https:\/\/vived.io\/how-does-a-made-for-jvm-linux-distro-perform-alpaquita-linux-benchmarks-are-impressive-jvm-weekly-111\/\"><strong>Record Patterns (Second Preview)<\/strong> oraz <strong>Pattern Matching for switch (Fourth Preview)<\/strong> pisa\u0142em ju\u017c w jednej z poprzednich edycji<\/a>. Podobnie wygl\u0105da sytuacje nowych iteracji JEP\u00f3w powi\u0105zanych z Loomem &#8211; <strong>Virtual Threads (Second Preview)<\/strong> oraz <strong>Structured Concurrency (Second Incubator)<\/strong>, kt\u00f3re <a href=\"https:\/\/vived.io\/java-community-seeks-happiness-beyond-twitter-want-to-join-jvm-weekly-113\/\">r\u00f3wnie\u017c mia\u0142em okazj\u0119 ju\u017c opisa\u0107<\/a>. Nie robi\u0119 tego tu po raz kolejny, bo nowo\u015bci s\u0105 naprawd\u0119 raczej kosmetyczne.<\/p>\n\n\n\n<p>Od tamtego czasu, <strong>437: Structured Concurrency (Second Incubator)<\/strong> doczeka\u0142a si\u0119 jednak pewnej zmiany, kt\u00f3r\u0105 mo\u017cna uzna\u0107 za jedyny realnie interesuj\u0105cy dodatek wprowadzony w JDK 20 &#8211; wsparcie dla Scope Values. I nimi si\u0119 w\u0142a\u015bnie teraz zajmiemy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O Scope Values<\/h3>\n\n\n\n<p>Zapotrzebowanie na lokalne warto\u015bci wynika ze zmian wprowadzonych w JVM na potrzeby Loom. Ze wzgl\u0119du na fakt, \u017ce Loom opiera si\u0119 na bardzo leciutkich w\u0105tkach (dzi\u0119ki czemu mo\u017cliwe staje si\u0119 tworzenie ich w zasadzie nieograniczonej ilo\u015bci), musimy bardzo uwa\u017ca\u0107 na rozmiar struktur tworzonych na potrzeby ka\u017cdego w\u0105tku (bardzo fajny artyku\u0142 na ten temat znale\u017a\u0107 <a href=\"https:\/\/webtide.com\/do-looms-claims-stack-up-part-1\/\">mo\u017cecie tutaj<\/a>).<\/p>\n\n\n\n<p>Popularne Thread Locals (zmienne przypi\u0119te do w\u0105tku) od pocz\u0105tku by\u0142y kamieniem w bucie tw\u00f3rc\u00f3w wirtuaknych w\u0105tk\u00f3w. Rozwi\u0105zaniem na nie maj\u0105 by\u0107 wspomniane Scope Values \u2013 efektywnie finalne, niemutowalne zmienne lokalne, kt\u00f3re mog\u0105 by\u0107 w ramach potrzeb bezpiecznie dzielone mi\u0119dzy w\u0105tkami, zmniejszaj\u0105c ilo\u015b\u0107 niezb\u0119dnej pami\u0119ci. Ka\u017cdy w\u0105tek-dziecko posiada\u0107 ma dost\u0119p do pe\u0142nego kontekstu swojego rodzica. Pomys\u0142 realizacji tego zadania podkradziony zosta\u0142 z Common Lispa i jego \u201czmiennych specjalnych\u201d,<\/p>\n\n\n\n<p>O Scope Values mo\u017cna my\u015ble\u0107 jako niewidocznych parametrach, kt\u00f3re s\u0105 przekazywane do ka\u017cdej metody. Maj\u0105 one mo\u017cliwo\u015b\u0107 przypisania do zmiennej lokalnej warto\u015bci wy\u0142\u0105cznie na potrzeby konkretnego zakresu (scope) \u2013 po jego zako\u0144czeniu warto\u015bci zmiennych w nim ustawionych zostanie automatycznie przywr\u00f3cona. Zachowanie to pozwala np. na zakrycie warto\u015bci <code>x<\/code> i <code>y<\/code>, w kt\u00f3rym\u015b z \u201cdzieci\u201d, bez wp\u0142ywu na wszystkie inne w\u0105tki je u\u017cywaj\u0105ce.<\/p>\n\n\n\n<p>Do\u015b\u0107 dobrze obrazuje to kod \u017ar\u00f3d\u0142owy z JEPa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>final static ScopedValue&lt;...&gt; x = new ScopedValue&lt;&gt;();\nfinal static ScopedValue&lt;...&gt; y = new ScopedValue&lt;&gt;();\n\n{\n    ScopedValue.where(x, expr1)\n        .where(y, expr2)\n        .run(() -&gt; ... code that uses x.get() and y.get() ...);\n}\n<\/code><\/pre>\n\n\n\n<p>Jak wida\u0107, sk\u0142adnia przypomina troch\u0119 znane wszystkim \u201catomiki\u201d na sterydach. Warto\u015bci <code>x<\/code> i <code>y<\/code> mog\u0105 by\u0107 przekazywane z w\u0105tku \u201crodzica\u201d do w\u0105tku \u201cdziecka\u201d. Metoda <code>run()<\/code> \u201ewi\u0105\u017ce\u201d za\u015b w tym przypadku <code>x<\/code> i <code>y<\/code> z warto\u015bciami <code>expr1<\/code> i <code>expr2<\/code>. Podczas wykonywania metody <code>run()<\/code> wszelkie wywo\u0142ania <code>x.get()<\/code> i <code>y.get()<\/code> zwracaj\u0105 w\u0142a\u015bnie je. Po jej opuszczeniu, warto\u015bci wracaj\u0105 do wersji poprzednich, odziedziczonych po rodzicu.<\/p>\n\n\n\n<p>Oczywi\u015bcie, jak to z Loomem bywa, sk\u0142adnia mo\u017ce si\u0119 jeszcze wielokrotnie zmieni\u0107 (zw\u0142aszcza, \u017ce mamy do czynienia z niczym innym jak inkubacj\u0105). Nie ukrywam te\u017c, \u017ce moja sympatia do tego JEPa na pewno pochodzi z faktu, \u017ce pod\u015bwiadomie troch\u0119 jednak jestem kryptoclojurowcem, wi\u0119c wszelkie nawi\u0105zania do Lispa w JDK przyjmuje z otwartymi ramionami.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Og\u00f3lnie wydaje mi si\u0119, \u017ce s\u0142owo klucz opisuj\u0105ce nowe wydanie Javy to &#8222;stabilizacja&#8221;. Co mo\u017ce by\u0107 lepszym kierunkiem &#8211; wol\u0119 w nast\u0119pnym LTS dosta\u0107 ma\u0142\u0105 ilo\u015b\u0107 stabilnych, du\u017cych featury ni\u017c du\u017c\u0105 ilo\u015b\u0107 drobnicy. Na pewno cieszy mnie, \u017ce po dodaniu Scope Values, wirtualne w\u0105tki staj\u0105 si\u0119 coraz bardziej kompletne i u\u017cyteczne. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16-1024x681.png\" alt=\"\" class=\"wp-image-12934\" width=\"512\" height=\"341\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16-1024x681.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16-300x199.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16-768x511.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16.png 1134w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption>A jakby\u015bcie si\u0119 zastanawiali czym jest JEP 435, kt\u00f3ry stanowi dziur\u0119 w li\u015bcie nowych JEP-\u00f3w &#8211; mowa o JEP 435: Asynchronous Stack Trace VM API, kt\u00f3ry po prostu si\u0119 do nowego wydania nie za\u0142apa\u0142. O nim r\u00f3wnie\u017c <a href=\"https:\/\/vived.io\/much-ado-about-observability-jep-making-profiling-easier-and-quarkus-dropping-microprofile-standard\/\">wi\u0119cej przeczytacie w jednej z poprzednich edycji<\/a>.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"2-release-radar-gradle-wildfly-resillience4j-async-profiler-i-spring\" data-num=2>2. Release Radar &#8211; Gradle, Wildfly, Resillience4j, Async-Profiler i Spring <\/h2>\n\n\n\n<p>Dawno nie by\u0142o Release Radaru, dlatego dzisiaj po\u015bwi\u0119cimy sporo miejsca premier\u0105 ostatnich tygodni &#8211; a takowych akurat by\u0142o troch\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resilience4j 2.0<\/h3>\n\n\n\n<p>By\u0142y czasy, gdy kr\u00f3l tak zwanego \u201cFault Tolerance\u201d w ramach JVM by\u0142 tylko jeden \u2013 tym \u015bwiatkiem niepodzielnie rz\u0105dzi\u0142 Hystrix od Netflixa. W pewnym momencie jednak firma porzuci\u0142a projekt i w wyniku dzia\u0142a\u0144 spo\u0142eczno\u015bci wyewoluowa\u0142 on w Resilience4j. O projekcie by\u0142o ostatnio raczej cicho, ale stwierdzi\u0142em, \u017ce warto o nim przypomnie\u0107, zw\u0142aszcza, \u017ce pojawi\u0142a si\u0119 do\u015b\u0107 dobra okazja &#8211; <a href=\"https:\/\/github.com\/resilience4j\/resilience4j\/releases\/tag\/v2.0.0\">wydano wersje 2.0 projektu<\/a>. Co si\u0119 takiego wydarzy\u0142o, \u017ce zas\u0142u\u017cy\u0142a ona na &#8222;du\u017cy&#8221; numer?<\/p>\n\n\n\n<p>Poza wsparciem Java 17, Spring Boot 2.7 (szkoda, \u017ce nie od razu 3.0) oraz Kotlina 1.7.20, nowe Resilience4J to pewna istotna zmiana pod mask\u0105. Ot\u00f3\u017c projekt pozby\u0142 si\u0119 dependencji na bibliotek\u0119 Vavr. Dla tych, kt\u00f3rzy Vavra nie kojarz\u0105, jest to zbi\u00f3r funkcyjnych &#8222;utili&#8221;, troch\u0119 przypominaj\u0105cy Guav\u0119 i Kotlin Arrow i swego czasu do\u015b\u0107 popularny. Sam projekt ma do\u015b\u0107 burzliw\u0105 histori\u0119, nazwa\u0142 si\u0119 kiedy\u015b Javaslang, ale Oracle oskar\u017cy\u0142 tw\u00f3rc\u00f3w o \u0142amanie ichniejszego trademarku na s\u0142owo Java, co wymusi\u0142a rebranding.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-1024x921.png\" alt=\"\" class=\"wp-image-12937\" width=\"512\" height=\"461\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-1024x921.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-300x270.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-768x691.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-1536x1382.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17.png 1552w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption>Jest to kolejny przyk\u0142ad tego, \u017ce nie tylko Jakarta EE historycznie oberwa\u0142a w ten spos\u00f3b<\/figcaption><\/figure><\/div>\n\n\n<p>Tw\u00f3rcy Resilience4j postanowili pozby\u0107 go z projektu, poniewa\u017c nie wykorzystywali go a\u017c tak ekstensywnie, a stanowi\u0142 spory balast kt\u00f3ry rzutowa\u0142 na wszystkie projekty u\u017cywaj\u0105ce Resilience4j. Wi\u0119cej kontekstu znajdziecie w <a href=\"https:\/\/github.com\/resilience4j\/resilience4j\/issues\/554\">Githubowej dyskusji<\/a>.<\/p>\n\n\n\n<p>A jako, \u017ce samym Resilience4j Java Developer nie \u017cyje, je\u015bli chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o rozwi\u0105zaniach do Fault Tolerance dost\u0119pnych w Javie zapraszam do lektury <a href=\"https:\/\/blog.frankel.ch\/comparison-fault-tolerance-libraries\/\">A tentative comparison of fault tolerance libraries on the JVM<\/a> &#8211; bardzo dobrej przegl\u0105d\u00f3wki od Nicolasa Fr\u00e4nkela.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gradle 7.6<\/h3>\n\n\n\n<p>Kolejnym wydaniem, o kt\u00f3rym chcia\u0142bym Wam dzisiaj opowiedzie\u0107 to nowe wydanie Gradle. Popularny Build Tool ma to do siebie, \u017ce wydania wypluwa dosy\u0107 regularnie, ale akurat praktycznie ka\u017cde z nich wnosi co\u015b ciekawego. Nie inaczej jest z <a href=\"https:\/\/docs.gradle.org\/7.6\/release-notes.html\">najnowsz\u0105 edycj\u0105 7.6<\/a>.<\/p>\n\n\n\n<p>To jest bowiem pierwsz\u0105 edycj\u0105, kt\u00f3ra pozwala nam kompilowa\u0107 do Javy 19, w zwi\u0105zku z tym je\u015bli do tej pory nie byli\u015bcie w stanie przepi\u0105\u0107 swoich produkcyjnych projekt\u00f3w na nowe Preview API (no bo tylko one si\u0119 ostanio pojawiaj\u0105), nareszcie Gradle ju\u017c nie jest dla Was \u017cadn\u0105 przeszkod\u0105. Gradle zreszt\u0105 sobie to JDK samodzielnie pobierze dzi\u0119ki wprowadzonemu ju\u017c par\u0119 edycji temu Java Toolchain, kt\u00f3ry obecnie wsparty zosta\u0142 o mo\u017cliwo\u015b\u0107 zdefiniowania konkretnego \u017ar\u00f3d\u0142a, z kt\u00f3rego chcemy JDK pobra\u0107. Dlatego te\u017c u\u017cytkownicy DragonFly JDK albo Liberica JDK nie b\u0119d\u0105 ju\u017c skazani na Adoptium. A \u017ce wariant\u00f3w JDK jest du\u017co (o czym przekona\u0107 si\u0119 mo\u017cna cho\u0107by na stronie <a href=\"https:\/\/whichjdk.com\/\">whichjdk.com<\/a>, opisuj\u0105cej istniej\u0105ce miedzy nimi r\u00f3\u017cnice).<\/p>\n\n\n\n<p>Fani silnego typowania i Kotlinowego DSL-a otrzymali za\u015b du\u017co lepsze podpowiadanie sk\u0142adni. Dodatkowo, usprawniona zosta\u0142a inkrementalna kompilacja w sytuacji b\u0142\u0119d\u00f3w, a dodatkowo umo\u017cliwiono te\u017c &#8222;rerun&#8221; pojedynczego taska. Ostatni\u0105 za\u015b du\u017c\u0105 rzecz\u0105 jest mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia si\u0119 do gradlowego debuggera nie tylko z lokalnej maszyny, ale r\u00f3wnie\u017c po sieci, co mo\u017ce by\u0107 przydatne np. w \u015brodowiskach CI\/CD.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WildFly 27<\/h3>\n\n\n\n<p>Przechodzimy dalej, tym razem mam co\u015b dla u\u017cytkownik\u00f3w Jakarty EE. &#8222;Ten fajny&#8221; serwer aplikacyjny &#8211; WildFly.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/9EsaWa1.jpg\" alt=\"\"\/><figcaption>WildFly &#8211; Nowoczesny serwer aplikacyjny<\/figcaption><\/figure><\/div>\n\n\n<p>Mo\u017cna si\u0119 \u015bmia\u0107 z powy\u017cszej zbitki, ale to w\u0142a\u015bnie WildFly ze wszystkich narz\u0119dzi maj\u0105cych jakiekolwiek powi\u0105zania z \u015bwiatem starej Java EE jest z pewno\u015bci\u0105 tym w najwi\u0119kszym stopniu eksperymentuj\u0105cym z nowoczesnymi technologiami. Niech za przyk\u0142ad pos\u0142u\u017cy to, \u017ce nowe wydanie jest kompatybilne z \u015bwie\u017cutk\u0105 Jakarta EE 10 &#8211; i to r\u00f3wnie\u017c \u015bwie\u017co dodanym do niej Core Profilem, konkurencj\u0105 dla MicroProfile. Ju\u017c samo to zwiastowa\u0142oby ciekawe wydanie, ale <a href=\"https:\/\/www.wildfly.org\/news\/2022\/11\/09\/WildFly27-Final-Released\/\">WildFly 27<\/a> przynosi sporo wi\u0119cej.<\/p>\n\n\n\n<p>Po pierwsze, jest to kolejna z technologii mocno integruj\u0105ca si\u0119 z Micrometer, kt\u00f3ry otrzyma\u0142 wsparcie, cho\u0107 narazie tylko jako Tech Preview. WildFly mocno inwestuje r\u00f3wnie\u017c we wsparcie chmury i og\u00f3lnie bycie cloud-native. \u015awiadczy\u0107 o tym mo\u017ce nie tylko dalszy aktywny rozw\u00f3j &#8222;b\u0142ogos\u0142awionych&#8221; obraz\u00f3w Dockerowych, ale tak\u017ce nowa architektura dla WildFly S2I. Pod tym szalenie enigmatycznym skr\u00f3tem kryje si\u0119 WildFly Source-to-Image, czyli narz\u0119dzie do wdra\u017cania aplikacji na serwery aplikacyjne w chmurze. S2I s\u0142u\u017cy do metoda budowania powtarzalnych obraz\u00f3w Docker bezpo\u015brednio z kodu \u017ar\u00f3d\u0142owego. W nowym wydaniu WildFly zmieniona zosta\u0142a architektura ca\u0142ego narz\u0119dzia. Zmian jest du\u017co, dlatego je\u015bli u\u017cywacie S2I, polecam sprawdzi\u0107 dedykowane temu narz\u0119dziu og\u0142oszenie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Async-Profiler 2.9<\/h3>\n\n\n\n<p><a href=\"https:\/\/vived.io\/much-ado-about-observability-jep-making-profiling-easier-and-quarkus-dropping-microprofile-standard\/\">Niedawno pisa\u0142em o narz\u0119dziu<\/a>, jakim jest Async-Profiler w kontek\u015bcie <a href=\"https:\/\/openjdk.org\/jeps\/435\">JEP 435: Asynchronous Stack Trace VM API<\/a>, kt\u00f3rego celem by\u0142o ustandaryzowanie API dla Stack Trace maszyny wirtualnej. Dzisiaj przysz\u0142o mi do tematu wr\u00f3ci\u0107, poniewa\u017c najlepszy profiler JVM dosta\u0142 now\u0105 wersj\u0119, a z ni\u0105 jedn\u0105 bardzo du\u017c\u0105 zmian\u0119: Heap Leak Profiler.<\/p>\n\n\n\n<p>Za t\u0105 niepozorn\u0105 nazw\u0105 kryje si\u0119 bowiem pot\u0119\u017cne narz\u0119dzie, b\u0119d\u0105ce w stanie wykrywa\u0107 wycieki pami\u0119ci w czasie rzeczywistym. Co wa\u017cne, ca\u0142o\u015b\u0107 zosta\u0142a zaprojektowana w celu minimalnego narzutu na wykonywany proces, ca\u0142o\u015b\u0107 opiera si\u0119 bowiem o pr\u00f3bkowanie danych, co znacznie zmniejsza zu\u017cycie zasob\u00f3w. Dzi\u0119ki temu ca\u0142o\u015b\u0107 nadaje si\u0119 do wykrywania tego typu problem\u00f3w w \u015brodowisku produkcyjnym.<\/p>\n\n\n\n<p>Je\u017celi jeste\u015bcie ciekawi detali, ca\u0142o\u015b\u0107 zosta\u0142a dobrze opracowana przez Krzysztofa \u015alusarskiego w jego tek\u015bcie <a href=\"https:\/\/krzysztofslusarski.github.io\/2022\/11\/27\/async-live.html\">Finding heap memory leaks with Async-profiler<\/a>. Tam te\u017c znajdziecie konkretne przypadki u\u017cycia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Batch 5.0<\/h3>\n\n\n\n<p>A na ko\u0144cu, wprawdzie o Springu ju\u017c ostatnio by\u0142o du\u017co, ale od tamtej pory pojawi\u0142y si\u0119 dwie ca\u0142kiem spore nowo\u015bci.<\/p>\n\n\n\n<p>Pierwsz\u0105 z nich jest Spring Batch w wersji 5.0, kt\u00f3ry mo\u017ce pochwali\u0107 si\u0119 do\u015b\u0107 imponuj\u0105c\u0105 ilo\u015bci\u0105 zmian. Jest to pakiet zapewnia funkcje potrzebne przy przetwarzaniu du\u017cych ilo\u015bci rekord\u00f3w, takie jak logowanie, zarz\u0105dzanie transakcjami, restartowanie i pomijanie job\u00f3w, a tak\u017ce zarz\u0105dzanie zasobami.<\/p>\n\n\n\n<p>Oczywi\u015bcie, mamy do czynienia z wyr\u00f3wnaniem do obowi\u0105zuj\u0105cych wersji Spring Framework, wi\u0119c w gratisie pojawi\u0142o si\u0119 cho\u0107by wsparcie Jakarty EE 9 i GraalVM. Ten ostatni ze wzgl\u0119du na charkaterystyk\u0119 pracy Spring Batcha (dzia\u0142anie na wielu, ale kr\u00f3tko \u017cyj\u0105cych w\u0105tkach) mo\u017ce wed\u0142ug zamieszczanych benchmark\u00f3w pochwali\u0107 si\u0119 przyspieszeniem nawet do dziesi\u0119ciu razy. Pe\u0142n\u0105 list\u0119 zmian (a jak wspomina\u0142em &#8211; jest ich troch\u0119) zobaczy\u0107 mo\u017cecie <a href=\"https:\/\/spring.io\/blog\/2022\/11\/24\/spring-batch-5-0-goes-ga\">w oficjalnym og\u0142oszeniu<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Integration 6.0<\/h3>\n\n\n\n<p>I na sam koniec <a href=\"https:\/\/spring.io\/blog\/2022\/11\/29\/spring-integration-6-0-goes-ga\">Spring Integration 6.0<\/a>. Spring Integration to framework do budowy szeroko rozumianych &#8222;integracji&#8221;, g\u0142\u00f3wnie w tym korporacyjnym wydaniu.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/eip-book-header.jpg\" alt=\"\" width=\"640\" height=\"335\"\/><figcaption>Je\u017celi kojarzycie ksi\u0105\u017ck\u0119 <strong>Enterprise Integration Patterns<\/strong>, to jest to jej wersja &#8222;stosowana&#8221;.<\/figcaption><\/figure><\/div>\n\n\n<p>Poza standardowymi usprawnieniami, nowy Spring Integration to przede wszystkim wsp arcie dla <a href=\"https:\/\/docs.spring.io\/spring-integration\/docs\/current\/reference\/html\/whats-new.html#whats-new\">GraphQL<\/a>, kt\u00f3ry bazuje na projekcie <a href=\"https:\/\/docs.spring.io\/spring-integration\/docs\/current\/reference\/html\/graphql.html#graphql\">spring-graphql<\/a>. Opr\u00f3cz tego fani Kotlina z pewno\u015bci\u0105 uciesz\u0105 si\u0119 z faktu, projekt mo\u017ce wreszcie pochwali\u0107 si\u0119 wsparciem dla Korutyn. Wi\u0119ksze lub mniejsze zmiany czy migracje dotkn\u0119\u0142y r\u00f3wnie\u017c integracji z wi\u0119kszo\u015bci\u0105 provider\u00f3w, takich jak Apache Camel (nowa integracja), Hazelcast, MQTT czy RabbitMQ.<\/p>\n\n\n\n<h2 id=\"3-log4shell-pamietamy\" data-num=3>3. Log4Shell &#8211; Pami\u0119tamy \ud83d\udd6f\ufe0f<\/h2>\n\n\n\n<p>Mija nam w\u0142a\u015bnie rok od jednego z najwi\u0119kszych incydent\u00f3w w historii Javy, czyli tak zwanego Log4Shell &#8211; je\u015bli nie byli\u015bcie wtedy z nami (szcz\u0119\u015bciarze) wi\u0119cej przeczytacie tutaj. Wydaje mi si\u0119, \u017ce nale\u017cy czci\u0107 jego pami\u0119\u0107 w spos\u00f3b godny takiej rocznicy, na przyk\u0142ad poprzez przypomnienie fali gorzkiego humoru, kt\u00f3ry towarzyszy\u0142 spo\u0142eczno\u015bci w tych trudnych dniach.<\/p>\n\n\n\n<p>Zatem niech poleci m\u00f3j ulubiony, kt\u00f3ry dodatkowo stawia spraw\u0119 w nieco szerszym kontek\u015bcie:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-14.png\" alt=\"\" class=\"wp-image-12929\" width=\"506\" height=\"283\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-14.png 674w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-14-300x168.png 300w\" sizes=\"auto, (max-width: 506px) 100vw, 506px\" \/><\/figure><\/div>\n\n\n<p><span style=\"font-size: revert; color: initial; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, sans-serif;\">Log4Shell, zawsze b\u0119dziesz w naszych sercach jako dzie\u0144, kt\u00f3ry zjednoczy\u0142 Java Developer\u00f3w na ca\u0142ym \u015bwiecie we wsp\u00f3lnych emocjach (cho\u0107by emocji przera\u017cenia i smutku) \u2764\ufe0f<\/span><\/p>\n\n\n\n<p>Log4Shell, zawsze b\u0119dziesz w naszych sercach jako dzie\u0144, kt\u00f3ry zjednoczy\u0142 Java Developer\u00f3w na ca\u0142ym \u015bwiecie we wsp\u00f3lnych emocjach (cho\u0107by emocji przera\u017cenia i smutku) \u2764\ufe0f<\/p>\n\n\n\n<p>Wi\u0119cej takowych znajdziecie na stronie <a href=\"https:\/\/log4jmemes.com\/\">log4jmemes.com<\/a> &#8211; tyle tego by\u0142o, \u017ce doczeka\u0142y si\u0119 swojego miejsca w sieci.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jako, \u017ce przez klika edycji zajmowali\u015bmy si\u0119 du\u017cymi zapowiedziami, w nowym wydaniu mamy spor\u0105 ilo\u015b\u0107 releas\u00f3w: Gradle, Wildfly, Resillience4j, Async-Profiler i Spring. G\u0142\u00f3wnym daniem pozostaje jednak Feature Freeze dla nowej JDK 20.<\/p>\n","protected":false},"author":10,"featured_media":12949,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-12927","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm"],"acf":{"estimated_reading_time":"11","feature_image_blog":{"ID":12948,"id":12948,"title":"ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5","filename":"ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","filesize":1628647,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","link":"https:\/\/vived.io\/pl\/arturskowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5-2\/","alt":"","author":"10","description":"","caption":"","name":"arturskowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5-2","status":"inherit","uploaded_to":0,"date":"2022-12-08 09:54:47","modified":"2022-12-08 09:54:47","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1024,"height":1024,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5-150x150.png","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5-300x300.png","medium-width":300,"medium-height":300,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5-768x768.png","medium_large-width":768,"medium_large-height":768,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5-1024x1024.png","large-width":1024,"large-height":1024,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","1536x1536-width":1024,"1536x1536-height":1024,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","2048x2048-width":1024,"2048x2048-height":1024,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":300,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","gform-image-choice-md-width":400,"gform-image-choice-md-height":400,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/ArturSkowronski_frozen_number_20_cc7d83ce-9d20-49c1-bb56-bb4f30dd25e5.png","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":600}},"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Feature Freeze dla JDK 20 - co przyniesie nowa edycja? - JVM Weekly 116 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature Freeze dla JDK 20 - co przyniesie nowa edycja? - JVM Weekly 116 - Vived\" \/>\n<meta property=\"og:description\" content=\"Jako, \u017ce przez klika edycji zajmowali\u015bmy si\u0119 du\u017cymi zapowiedziami, w nowym wydaniu mamy spor\u0105 ilo\u015b\u0107 releas\u00f3w: Gradle, Wildfly, Resillience4j, Async-Profiler i Spring. G\u0142\u00f3wnym daniem pozostaje jednak Feature Freeze dla nowej JDK 20.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-08T10:35:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-08T10:36:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Feature Freeze dla JDK 20 &#8211; co przyniesie nowa edycja? &#8211; JVM Weekly 116\",\"datePublished\":\"2022-12-08T10:35:58+00:00\",\"dateModified\":\"2022-12-08T10:36:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\"},\"wordCount\":2245,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\",\"url\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\",\"name\":\"Feature Freeze dla JDK 20 - co przyniesie nowa edycja? - JVM Weekly 116 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png\",\"datePublished\":\"2022-12-08T10:35:58+00:00\",\"dateModified\":\"2022-12-08T10:36:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature Freeze dla JDK 20 &#8211; co przyniesie nowa edycja? &#8211; JVM Weekly 116\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Feature Freeze dla JDK 20 - co przyniesie nowa edycja? - JVM Weekly 116 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/","og_locale":"pl_PL","og_type":"article","og_title":"Feature Freeze dla JDK 20 - co przyniesie nowa edycja? - JVM Weekly 116 - Vived","og_description":"Jako, \u017ce przez klika edycji zajmowali\u015bmy si\u0119 du\u017cymi zapowiedziami, w nowym wydaniu mamy spor\u0105 ilo\u015b\u0107 releas\u00f3w: Gradle, Wildfly, Resillience4j, Async-Profiler i Spring. G\u0142\u00f3wnym daniem pozostaje jednak Feature Freeze dla nowej JDK 20.","og_url":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/","og_site_name":"Vived","article_published_time":"2022-12-08T10:35:58+00:00","article_modified_time":"2022-12-08T10:36:00+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Feature Freeze dla JDK 20 &#8211; co przyniesie nowa edycja? &#8211; JVM Weekly 116","datePublished":"2022-12-08T10:35:58+00:00","dateModified":"2022-12-08T10:36:00+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/"},"wordCount":2245,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/","url":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/","name":"Feature Freeze dla JDK 20 - co przyniesie nowa edycja? - JVM Weekly 116 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png","datePublished":"2022-12-08T10:35:58+00:00","dateModified":"2022-12-08T10:36:00+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/feature-freeze-dla-jdk-20-co-przyniesie-nowa-edycja-jvm-weekly-116\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Feature Freeze dla JDK 20 &#8211; co przyniesie nowa edycja? &#8211; JVM Weekly 116"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>1. Feature Freeze dla JDK 20 - co przyniesie nowa edycja?<\/h2>\n","innerContent":["\n<h2>1. Feature Freeze dla JDK 20 - co przyniesie nowa edycja?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kiedy poprzednia Java sk\u0142ada\u0142a si\u0119 g\u0142\u00f3wnie z Preview, przyznam, \u017ce by\u0142o w tym co\u015b fascynuj\u0105cego. W ko\u0144cu to w\u0142a\u015bnie JDK 19 pozwala\u0142o nam spojrze\u0107 w przysz\u0142o\u015b\u0107 tego, jak rozwija\u0107 si\u0119 b\u0119dzie platforma w najbli\u017cszych latach i posmakowa\u0107 wynik\u00f3w kilku d\u0142ugo oczekiwanych projekt\u00f3w. Musz\u0119 jednak przyzna\u0107, \u017ce ci\u0119\u017cko wykrzesa\u0107 mi jest podobny entuzjazm w stosunku do JDK 20. Ponownie mamy do czynienia z zestawem Preview, ale s\u0105 to w zasadzie drobne iteracje (z wyj\u0105tkami o kt\u00f3rych za chwil\u0119) ju\u017c istniej\u0105cych API. A wraz z dzisiejszym dniem, nowa Java wchodzi w faz\u0119 Rampdown - oznacza ona, \u017ce lista funkcjonalno\u015bci zosta\u0142a zamro\u017cona i nie mo\u017cna spodziewa\u0107 si\u0119 \u017cadnych dalszych nowinek. <\/p>\n","innerContent":["\n<p>Kiedy poprzednia Java sk\u0142ada\u0142a si\u0119 g\u0142\u00f3wnie z Preview, przyznam, \u017ce by\u0142o w tym co\u015b fascynuj\u0105cego. W ko\u0144cu to w\u0142a\u015bnie JDK 19 pozwala\u0142o nam spojrze\u0107 w przysz\u0142o\u015b\u0107 tego, jak rozwija\u0107 si\u0119 b\u0119dzie platforma w najbli\u017cszych latach i posmakowa\u0107 wynik\u00f3w kilku d\u0142ugo oczekiwanych projekt\u00f3w. Musz\u0119 jednak przyzna\u0107, \u017ce ci\u0119\u017cko wykrzesa\u0107 mi jest podobny entuzjazm w stosunku do JDK 20. Ponownie mamy do czynienia z zestawem Preview, ale s\u0105 to w zasadzie drobne iteracje (z wyj\u0105tkami o kt\u00f3rych za chwil\u0119) ju\u017c istniej\u0105cych API. A wraz z dzisiejszym dniem, nowa Java wchodzi w faz\u0119 Rampdown - oznacza ona, \u017ce lista funkcjonalno\u015bci zosta\u0142a zamro\u017cona i nie mo\u017cna spodziewa\u0107 si\u0119 \u017cadnych dalszych nowinek. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Finalnie wi\u0119c lista nowo\u015bci w JDK 20 prezentuje si\u0119 wi\u0119c nast\u0119puj\u0105co:<\/p>\n","innerContent":["\n<p>Finalnie wi\u0119c lista nowo\u015bci w JDK 20 prezentuje si\u0119 wi\u0119c nast\u0119puj\u0105co:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/429\">429: Scoped Values (Incubator)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/432\">432: Record Patterns (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/433\">433: Pattern Matching for switch (Fourth Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/434\">434: Foreign Function &amp; Memory API (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/436\">436: Virtual Threads (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/437\">437: Structured Concurrency (Second Incubator)<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/429\">429: Scoped Values (Incubator)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/432\">432: Record Patterns (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/433\">433: Pattern Matching for switch (Fourth Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/434\">434: Foreign Function &amp; Memory API (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/436\">436: Virtual Threads (Second Preview)<\/a><\/li><li><a href=\"https:\/\/openjdk.org\/jeps\/437\">437: Structured Concurrency (Second Incubator)<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12940,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-18.png\" alt=\"\" class=\"wp-image-12940\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-18.png\" alt=\"\" class=\"wp-image-12940\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak widzicie, zupe\u0142nie nowych rzeczy jest jak na lekarstwo. I oczywi\u015bcie, sam fakt, \u017ce API w wersji preview przechodz\u0105 zmiany jest czym\u015b pozytywnym, a takie dodatki w <strong>Foreign Function &amp; Memory API<\/strong> s\u0105 ca\u0142kiem przyjemne - o nich mo\u017cecie przeczyta\u0107 cho\u0107by u <a href=\"https:\/\/twitter.com\/pminborg\">Pera Minborga<\/a>, kt\u00f3ry opublikowa\u0142 tekst <a href=\"https:\/\/minborgsjavapot.blogspot.com\/2022\/12\/java-20-sneak-peek-on-panama-ffm-api.html\">Java 20: A Sneak Peek on the Panama FFM API (Second Preview)<\/a>. Je\u017celi jeste\u015bcie za\u015b ciekawi szczeg\u00f3\u0142\u00f3w zmian w proposalach nowych rekord\u00f3w i pattern matchingu, o <a href=\"https:\/\/vived.io\/how-does-a-made-for-jvm-linux-distro-perform-alpaquita-linux-benchmarks-are-impressive-jvm-weekly-111\/\"><strong>Record Patterns (Second Preview)<\/strong> oraz <strong>Pattern Matching for switch (Fourth Preview)<\/strong> pisa\u0142em ju\u017c w jednej z poprzednich edycji<\/a>. Podobnie wygl\u0105da sytuacje nowych iteracji JEP\u00f3w powi\u0105zanych z Loomem - <strong>Virtual Threads (Second Preview)<\/strong> oraz <strong>Structured Concurrency (Second Incubator)<\/strong>, kt\u00f3re <a href=\"https:\/\/vived.io\/java-community-seeks-happiness-beyond-twitter-want-to-join-jvm-weekly-113\/\">r\u00f3wnie\u017c mia\u0142em okazj\u0119 ju\u017c opisa\u0107<\/a>. Nie robi\u0119 tego tu po raz kolejny, bo nowo\u015bci s\u0105 naprawd\u0119 raczej kosmetyczne.<\/p>\n","innerContent":["\n<p>Jak widzicie, zupe\u0142nie nowych rzeczy jest jak na lekarstwo. I oczywi\u015bcie, sam fakt, \u017ce API w wersji preview przechodz\u0105 zmiany jest czym\u015b pozytywnym, a takie dodatki w <strong>Foreign Function &amp; Memory API<\/strong> s\u0105 ca\u0142kiem przyjemne - o nich mo\u017cecie przeczyta\u0107 cho\u0107by u <a href=\"https:\/\/twitter.com\/pminborg\">Pera Minborga<\/a>, kt\u00f3ry opublikowa\u0142 tekst <a href=\"https:\/\/minborgsjavapot.blogspot.com\/2022\/12\/java-20-sneak-peek-on-panama-ffm-api.html\">Java 20: A Sneak Peek on the Panama FFM API (Second Preview)<\/a>. Je\u017celi jeste\u015bcie za\u015b ciekawi szczeg\u00f3\u0142\u00f3w zmian w proposalach nowych rekord\u00f3w i pattern matchingu, o <a href=\"https:\/\/vived.io\/how-does-a-made-for-jvm-linux-distro-perform-alpaquita-linux-benchmarks-are-impressive-jvm-weekly-111\/\"><strong>Record Patterns (Second Preview)<\/strong> oraz <strong>Pattern Matching for switch (Fourth Preview)<\/strong> pisa\u0142em ju\u017c w jednej z poprzednich edycji<\/a>. Podobnie wygl\u0105da sytuacje nowych iteracji JEP\u00f3w powi\u0105zanych z Loomem - <strong>Virtual Threads (Second Preview)<\/strong> oraz <strong>Structured Concurrency (Second Incubator)<\/strong>, kt\u00f3re <a href=\"https:\/\/vived.io\/java-community-seeks-happiness-beyond-twitter-want-to-join-jvm-weekly-113\/\">r\u00f3wnie\u017c mia\u0142em okazj\u0119 ju\u017c opisa\u0107<\/a>. Nie robi\u0119 tego tu po raz kolejny, bo nowo\u015bci s\u0105 naprawd\u0119 raczej kosmetyczne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Od tamtego czasu, <strong>437: Structured Concurrency (Second Incubator)<\/strong> doczeka\u0142a si\u0119 jednak pewnej zmiany, kt\u00f3r\u0105 mo\u017cna uzna\u0107 za jedyny realnie interesuj\u0105cy dodatek wprowadzony w JDK 20 - wsparcie dla Scope Values. I nimi si\u0119 w\u0142a\u015bnie teraz zajmiemy.<\/p>\n","innerContent":["\n<p>Od tamtego czasu, <strong>437: Structured Concurrency (Second Incubator)<\/strong> doczeka\u0142a si\u0119 jednak pewnej zmiany, kt\u00f3r\u0105 mo\u017cna uzna\u0107 za jedyny realnie interesuj\u0105cy dodatek wprowadzony w JDK 20 - wsparcie dla Scope Values. I nimi si\u0119 w\u0142a\u015bnie teraz zajmiemy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>O Scope Values<\/h3>\n","innerContent":["\n<h3>O Scope Values<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zapotrzebowanie na lokalne warto\u015bci wynika ze zmian wprowadzonych w JVM na potrzeby Loom. Ze wzgl\u0119du na fakt, \u017ce Loom opiera si\u0119 na bardzo leciutkich w\u0105tkach (dzi\u0119ki czemu mo\u017cliwe staje si\u0119 tworzenie ich w zasadzie nieograniczonej ilo\u015bci), musimy bardzo uwa\u017ca\u0107 na rozmiar struktur tworzonych na potrzeby ka\u017cdego w\u0105tku (bardzo fajny artyku\u0142 na ten temat znale\u017a\u0107 <a href=\"https:\/\/webtide.com\/do-looms-claims-stack-up-part-1\/\">mo\u017cecie tutaj<\/a>).<\/p>\n","innerContent":["\n<p>Zapotrzebowanie na lokalne warto\u015bci wynika ze zmian wprowadzonych w JVM na potrzeby Loom. Ze wzgl\u0119du na fakt, \u017ce Loom opiera si\u0119 na bardzo leciutkich w\u0105tkach (dzi\u0119ki czemu mo\u017cliwe staje si\u0119 tworzenie ich w zasadzie nieograniczonej ilo\u015bci), musimy bardzo uwa\u017ca\u0107 na rozmiar struktur tworzonych na potrzeby ka\u017cdego w\u0105tku (bardzo fajny artyku\u0142 na ten temat znale\u017a\u0107 <a href=\"https:\/\/webtide.com\/do-looms-claims-stack-up-part-1\/\">mo\u017cecie tutaj<\/a>).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Popularne Thread Locals (zmienne przypi\u0119te do w\u0105tku) od pocz\u0105tku by\u0142y kamieniem w bucie tw\u00f3rc\u00f3w wirtuaknych w\u0105tk\u00f3w. Rozwi\u0105zaniem na nie maj\u0105 by\u0107 wspomniane Scope Values \u2013 efektywnie finalne, niemutowalne zmienne lokalne, kt\u00f3re mog\u0105 by\u0107 w ramach potrzeb bezpiecznie dzielone mi\u0119dzy w\u0105tkami, zmniejszaj\u0105c ilo\u015b\u0107 niezb\u0119dnej pami\u0119ci. Ka\u017cdy w\u0105tek-dziecko posiada\u0107 ma dost\u0119p do pe\u0142nego kontekstu swojego rodzica. Pomys\u0142 realizacji tego zadania podkradziony zosta\u0142 z Common Lispa i jego \u201czmiennych specjalnych\u201d,<\/p>\n","innerContent":["\n<p>Popularne Thread Locals (zmienne przypi\u0119te do w\u0105tku) od pocz\u0105tku by\u0142y kamieniem w bucie tw\u00f3rc\u00f3w wirtuaknych w\u0105tk\u00f3w. Rozwi\u0105zaniem na nie maj\u0105 by\u0107 wspomniane Scope Values \u2013 efektywnie finalne, niemutowalne zmienne lokalne, kt\u00f3re mog\u0105 by\u0107 w ramach potrzeb bezpiecznie dzielone mi\u0119dzy w\u0105tkami, zmniejszaj\u0105c ilo\u015b\u0107 niezb\u0119dnej pami\u0119ci. Ka\u017cdy w\u0105tek-dziecko posiada\u0107 ma dost\u0119p do pe\u0142nego kontekstu swojego rodzica. Pomys\u0142 realizacji tego zadania podkradziony zosta\u0142 z Common Lispa i jego \u201czmiennych specjalnych\u201d,<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>O Scope Values mo\u017cna my\u015ble\u0107 jako niewidocznych parametrach, kt\u00f3re s\u0105 przekazywane do ka\u017cdej metody. Maj\u0105 one mo\u017cliwo\u015b\u0107 przypisania do zmiennej lokalnej warto\u015bci wy\u0142\u0105cznie na potrzeby konkretnego zakresu (scope) \u2013 po jego zako\u0144czeniu warto\u015bci zmiennych w nim ustawionych zostanie automatycznie przywr\u00f3cona. Zachowanie to pozwala np. na zakrycie warto\u015bci <code>x<\/code> i <code>y<\/code>, w kt\u00f3rym\u015b z \u201cdzieci\u201d, bez wp\u0142ywu na wszystkie inne w\u0105tki je u\u017cywaj\u0105ce.<\/p>\n","innerContent":["\n<p>O Scope Values mo\u017cna my\u015ble\u0107 jako niewidocznych parametrach, kt\u00f3re s\u0105 przekazywane do ka\u017cdej metody. Maj\u0105 one mo\u017cliwo\u015b\u0107 przypisania do zmiennej lokalnej warto\u015bci wy\u0142\u0105cznie na potrzeby konkretnego zakresu (scope) \u2013 po jego zako\u0144czeniu warto\u015bci zmiennych w nim ustawionych zostanie automatycznie przywr\u00f3cona. Zachowanie to pozwala np. na zakrycie warto\u015bci <code>x<\/code> i <code>y<\/code>, w kt\u00f3rym\u015b z \u201cdzieci\u201d, bez wp\u0142ywu na wszystkie inne w\u0105tki je u\u017cywaj\u0105ce.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Do\u015b\u0107 dobrze obrazuje to kod \u017ar\u00f3d\u0142owy z JEPa:<\/p>\n","innerContent":["\n<p>Do\u015b\u0107 dobrze obrazuje to kod \u017ar\u00f3d\u0142owy z JEPa:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>final static ScopedValue&lt;...&gt; x = new ScopedValue&lt;&gt;();\nfinal static ScopedValue&lt;...&gt; y = new ScopedValue&lt;&gt;();\n\n{\n    ScopedValue.where(x, expr1)\n        .where(y, expr2)\n        .run(() -&gt; ... code that uses x.get() and y.get() ...);\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>final static ScopedValue&lt;...&gt; x = new ScopedValue&lt;&gt;();\nfinal static ScopedValue&lt;...&gt; y = new ScopedValue&lt;&gt;();\n\n{\n    ScopedValue.where(x, expr1)\n        .where(y, expr2)\n        .run(() -&gt; ... code that uses x.get() and y.get() ...);\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak wida\u0107, sk\u0142adnia przypomina troch\u0119 znane wszystkim \u201catomiki\u201d na sterydach. Warto\u015bci <code>x<\/code> i <code>y<\/code> mog\u0105 by\u0107 przekazywane z w\u0105tku \u201crodzica\u201d do w\u0105tku \u201cdziecka\u201d. Metoda <code>run()<\/code> \u201ewi\u0105\u017ce\u201d za\u015b w tym przypadku <code>x<\/code> i <code>y<\/code> z warto\u015bciami <code>expr1<\/code> i <code>expr2<\/code>. Podczas wykonywania metody <code>run()<\/code> wszelkie wywo\u0142ania <code>x.get()<\/code> i <code>y.get()<\/code> zwracaj\u0105 w\u0142a\u015bnie je. Po jej opuszczeniu, warto\u015bci wracaj\u0105 do wersji poprzednich, odziedziczonych po rodzicu.<\/p>\n","innerContent":["\n<p>Jak wida\u0107, sk\u0142adnia przypomina troch\u0119 znane wszystkim \u201catomiki\u201d na sterydach. Warto\u015bci <code>x<\/code> i <code>y<\/code> mog\u0105 by\u0107 przekazywane z w\u0105tku \u201crodzica\u201d do w\u0105tku \u201cdziecka\u201d. Metoda <code>run()<\/code> \u201ewi\u0105\u017ce\u201d za\u015b w tym przypadku <code>x<\/code> i <code>y<\/code> z warto\u015bciami <code>expr1<\/code> i <code>expr2<\/code>. Podczas wykonywania metody <code>run()<\/code> wszelkie wywo\u0142ania <code>x.get()<\/code> i <code>y.get()<\/code> zwracaj\u0105 w\u0142a\u015bnie je. Po jej opuszczeniu, warto\u015bci wracaj\u0105 do wersji poprzednich, odziedziczonych po rodzicu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, jak to z Loomem bywa, sk\u0142adnia mo\u017ce si\u0119 jeszcze wielokrotnie zmieni\u0107 (zw\u0142aszcza, \u017ce mamy do czynienia z niczym innym jak inkubacj\u0105). Nie ukrywam te\u017c, \u017ce moja sympatia do tego JEPa na pewno pochodzi z faktu, \u017ce pod\u015bwiadomie troch\u0119 jednak jestem kryptoclojurowcem, wi\u0119c wszelkie nawi\u0105zania do Lispa w JDK przyjmuje z otwartymi ramionami.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, jak to z Loomem bywa, sk\u0142adnia mo\u017ce si\u0119 jeszcze wielokrotnie zmieni\u0107 (zw\u0142aszcza, \u017ce mamy do czynienia z niczym innym jak inkubacj\u0105). Nie ukrywam te\u017c, \u017ce moja sympatia do tego JEPa na pewno pochodzi z faktu, \u017ce pod\u015bwiadomie troch\u0119 jednak jestem kryptoclojurowcem, wi\u0119c wszelkie nawi\u0105zania do Lispa w JDK przyjmuje z otwartymi ramionami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Og\u00f3lnie wydaje mi si\u0119, \u017ce s\u0142owo klucz opisuj\u0105ce nowe wydanie Javy to \"stabilizacja\". Co mo\u017ce by\u0107 lepszym kierunkiem - wol\u0119 w nast\u0119pnym LTS dosta\u0107 ma\u0142\u0105 ilo\u015b\u0107 stabilnych, du\u017cych featury ni\u017c du\u017c\u0105 ilo\u015b\u0107 drobnicy. Na pewno cieszy mnie, \u017ce po dodaniu Scope Values, wirtualne w\u0105tki staj\u0105 si\u0119 coraz bardziej kompletne i u\u017cyteczne. <\/p>\n","innerContent":["\n<p>Og\u00f3lnie wydaje mi si\u0119, \u017ce s\u0142owo klucz opisuj\u0105ce nowe wydanie Javy to \"stabilizacja\". Co mo\u017ce by\u0107 lepszym kierunkiem - wol\u0119 w nast\u0119pnym LTS dosta\u0107 ma\u0142\u0105 ilo\u015b\u0107 stabilnych, du\u017cych featury ni\u017c du\u017c\u0105 ilo\u015b\u0107 drobnicy. Na pewno cieszy mnie, \u017ce po dodaniu Scope Values, wirtualne w\u0105tki staj\u0105 si\u0119 coraz bardziej kompletne i u\u017cyteczne. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12934,"width":512,"height":341,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16-1024x681.png\" alt=\"\" class=\"wp-image-12934\" width=\"512\" height=\"341\"\/><figcaption>A jakby\u015bcie si\u0119 zastanawiali czym jest JEP 435, kt\u00f3ry stanowi dziur\u0119 w li\u015bcie nowych JEP-\u00f3w - mowa o JEP 435: Asynchronous Stack Trace VM API, kt\u00f3ry po prostu si\u0119 do nowego wydania nie za\u0142apa\u0142. O nim r\u00f3wnie\u017c <a href=\"https:\/\/vived.io\/much-ado-about-observability-jep-making-profiling-easier-and-quarkus-dropping-microprofile-standard\/\">wi\u0119cej przeczytacie w jednej z poprzednich edycji<\/a>.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-16-1024x681.png\" alt=\"\" class=\"wp-image-12934\" width=\"512\" height=\"341\"\/><figcaption>A jakby\u015bcie si\u0119 zastanawiali czym jest JEP 435, kt\u00f3ry stanowi dziur\u0119 w li\u015bcie nowych JEP-\u00f3w - mowa o JEP 435: Asynchronous Stack Trace VM API, kt\u00f3ry po prostu si\u0119 do nowego wydania nie za\u0142apa\u0142. O nim r\u00f3wnie\u017c <a href=\"https:\/\/vived.io\/much-ado-about-observability-jep-making-profiling-easier-and-quarkus-dropping-microprofile-standard\/\">wi\u0119cej przeczytacie w jednej z poprzednich edycji<\/a>.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Release Radar - Gradle, Wildfly, Resillience4j, Async-Profiler i Spring <\/h2>\n","innerContent":["\n<h2>2. Release Radar - Gradle, Wildfly, Resillience4j, Async-Profiler i Spring <\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dawno nie by\u0142o Release Radaru, dlatego dzisiaj po\u015bwi\u0119cimy sporo miejsca premier\u0105 ostatnich tygodni - a takowych akurat by\u0142o troch\u0119.<\/p>\n","innerContent":["\n<p>Dawno nie by\u0142o Release Radaru, dlatego dzisiaj po\u015bwi\u0119cimy sporo miejsca premier\u0105 ostatnich tygodni - a takowych akurat by\u0142o troch\u0119.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Resilience4j 2.0<\/h3>\n","innerContent":["\n<h3>Resilience4j 2.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>By\u0142y czasy, gdy kr\u00f3l tak zwanego \u201cFault Tolerance\u201d w ramach JVM by\u0142 tylko jeden \u2013 tym \u015bwiatkiem niepodzielnie rz\u0105dzi\u0142 Hystrix od Netflixa. W pewnym momencie jednak firma porzuci\u0142a projekt i w wyniku dzia\u0142a\u0144 spo\u0142eczno\u015bci wyewoluowa\u0142 on w Resilience4j. O projekcie by\u0142o ostatnio raczej cicho, ale stwierdzi\u0142em, \u017ce warto o nim przypomnie\u0107, zw\u0142aszcza, \u017ce pojawi\u0142a si\u0119 do\u015b\u0107 dobra okazja - <a href=\"https:\/\/github.com\/resilience4j\/resilience4j\/releases\/tag\/v2.0.0\">wydano wersje 2.0 projektu<\/a>. Co si\u0119 takiego wydarzy\u0142o, \u017ce zas\u0142u\u017cy\u0142a ona na \"du\u017cy\" numer?<\/p>\n","innerContent":["\n<p>By\u0142y czasy, gdy kr\u00f3l tak zwanego \u201cFault Tolerance\u201d w ramach JVM by\u0142 tylko jeden \u2013 tym \u015bwiatkiem niepodzielnie rz\u0105dzi\u0142 Hystrix od Netflixa. W pewnym momencie jednak firma porzuci\u0142a projekt i w wyniku dzia\u0142a\u0144 spo\u0142eczno\u015bci wyewoluowa\u0142 on w Resilience4j. O projekcie by\u0142o ostatnio raczej cicho, ale stwierdzi\u0142em, \u017ce warto o nim przypomnie\u0107, zw\u0142aszcza, \u017ce pojawi\u0142a si\u0119 do\u015b\u0107 dobra okazja - <a href=\"https:\/\/github.com\/resilience4j\/resilience4j\/releases\/tag\/v2.0.0\">wydano wersje 2.0 projektu<\/a>. Co si\u0119 takiego wydarzy\u0142o, \u017ce zas\u0142u\u017cy\u0142a ona na \"du\u017cy\" numer?<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza wsparciem Java 17, Spring Boot 2.7 (szkoda, \u017ce nie od razu 3.0) oraz Kotlina 1.7.20, nowe Resilience4J to pewna istotna zmiana pod mask\u0105. Ot\u00f3\u017c projekt pozby\u0142 si\u0119 dependencji na bibliotek\u0119 Vavr. Dla tych, kt\u00f3rzy Vavra nie kojarz\u0105, jest to zbi\u00f3r funkcyjnych \"utili\", troch\u0119 przypominaj\u0105cy Guav\u0119 i Kotlin Arrow i swego czasu do\u015b\u0107 popularny. Sam projekt ma do\u015b\u0107 burzliw\u0105 histori\u0119, nazwa\u0142 si\u0119 kiedy\u015b Javaslang, ale Oracle oskar\u017cy\u0142 tw\u00f3rc\u00f3w o \u0142amanie ichniejszego trademarku na s\u0142owo Java, co wymusi\u0142a rebranding.<\/p>\n","innerContent":["\n<p>Poza wsparciem Java 17, Spring Boot 2.7 (szkoda, \u017ce nie od razu 3.0) oraz Kotlina 1.7.20, nowe Resilience4J to pewna istotna zmiana pod mask\u0105. Ot\u00f3\u017c projekt pozby\u0142 si\u0119 dependencji na bibliotek\u0119 Vavr. Dla tych, kt\u00f3rzy Vavra nie kojarz\u0105, jest to zbi\u00f3r funkcyjnych \"utili\", troch\u0119 przypominaj\u0105cy Guav\u0119 i Kotlin Arrow i swego czasu do\u015b\u0107 popularny. Sam projekt ma do\u015b\u0107 burzliw\u0105 histori\u0119, nazwa\u0142 si\u0119 kiedy\u015b Javaslang, ale Oracle oskar\u017cy\u0142 tw\u00f3rc\u00f3w o \u0142amanie ichniejszego trademarku na s\u0142owo Java, co wymusi\u0142a rebranding.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12937,"width":512,"height":461,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-1024x921.png\" alt=\"\" class=\"wp-image-12937\" width=\"512\" height=\"461\"\/><figcaption>Jest to kolejny przyk\u0142ad tego, \u017ce nie tylko Jakarta EE historycznie oberwa\u0142a w ten spos\u00f3b<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-17-1024x921.png\" alt=\"\" class=\"wp-image-12937\" width=\"512\" height=\"461\"\/><figcaption>Jest to kolejny przyk\u0142ad tego, \u017ce nie tylko Jakarta EE historycznie oberwa\u0142a w ten spos\u00f3b<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tw\u00f3rcy Resilience4j postanowili pozby\u0107 go z projektu, poniewa\u017c nie wykorzystywali go a\u017c tak ekstensywnie, a stanowi\u0142 spory balast kt\u00f3ry rzutowa\u0142 na wszystkie projekty u\u017cywaj\u0105ce Resilience4j. Wi\u0119cej kontekstu znajdziecie w <a href=\"https:\/\/github.com\/resilience4j\/resilience4j\/issues\/554\">Githubowej dyskusji<\/a>.<\/p>\n","innerContent":["\n<p>Tw\u00f3rcy Resilience4j postanowili pozby\u0107 go z projektu, poniewa\u017c nie wykorzystywali go a\u017c tak ekstensywnie, a stanowi\u0142 spory balast kt\u00f3ry rzutowa\u0142 na wszystkie projekty u\u017cywaj\u0105ce Resilience4j. Wi\u0119cej kontekstu znajdziecie w <a href=\"https:\/\/github.com\/resilience4j\/resilience4j\/issues\/554\">Githubowej dyskusji<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A jako, \u017ce samym Resilience4j Java Developer nie \u017cyje, je\u015bli chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o rozwi\u0105zaniach do Fault Tolerance dost\u0119pnych w Javie zapraszam do lektury <a href=\"https:\/\/blog.frankel.ch\/comparison-fault-tolerance-libraries\/\">A tentative comparison of fault tolerance libraries on the JVM<\/a> - bardzo dobrej przegl\u0105d\u00f3wki od Nicolasa Fr\u00e4nkela.<\/p>\n","innerContent":["\n<p>A jako, \u017ce samym Resilience4j Java Developer nie \u017cyje, je\u015bli chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o rozwi\u0105zaniach do Fault Tolerance dost\u0119pnych w Javie zapraszam do lektury <a href=\"https:\/\/blog.frankel.ch\/comparison-fault-tolerance-libraries\/\">A tentative comparison of fault tolerance libraries on the JVM<\/a> - bardzo dobrej przegl\u0105d\u00f3wki od Nicolasa Fr\u00e4nkela.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Gradle 7.6<\/h3>\n","innerContent":["\n<h3>Gradle 7.6<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Kolejnym wydaniem, o kt\u00f3rym chcia\u0142bym Wam dzisiaj opowiedzie\u0107 to nowe wydanie Gradle. Popularny Build Tool ma to do siebie, \u017ce wydania wypluwa dosy\u0107 regularnie, ale akurat praktycznie ka\u017cde z nich wnosi co\u015b ciekawego. Nie inaczej jest z <a href=\"https:\/\/docs.gradle.org\/7.6\/release-notes.html\">najnowsz\u0105 edycj\u0105 7.6<\/a>.<\/p>\n","innerContent":["\n<p>Kolejnym wydaniem, o kt\u00f3rym chcia\u0142bym Wam dzisiaj opowiedzie\u0107 to nowe wydanie Gradle. Popularny Build Tool ma to do siebie, \u017ce wydania wypluwa dosy\u0107 regularnie, ale akurat praktycznie ka\u017cde z nich wnosi co\u015b ciekawego. Nie inaczej jest z <a href=\"https:\/\/docs.gradle.org\/7.6\/release-notes.html\">najnowsz\u0105 edycj\u0105 7.6<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jest bowiem pierwsz\u0105 edycj\u0105, kt\u00f3ra pozwala nam kompilowa\u0107 do Javy 19, w zwi\u0105zku z tym je\u015bli do tej pory nie byli\u015bcie w stanie przepi\u0105\u0107 swoich produkcyjnych projekt\u00f3w na nowe Preview API (no bo tylko one si\u0119 ostanio pojawiaj\u0105), nareszcie Gradle ju\u017c nie jest dla Was \u017cadn\u0105 przeszkod\u0105. Gradle zreszt\u0105 sobie to JDK samodzielnie pobierze dzi\u0119ki wprowadzonemu ju\u017c par\u0119 edycji temu Java Toolchain, kt\u00f3ry obecnie wsparty zosta\u0142 o mo\u017cliwo\u015b\u0107 zdefiniowania konkretnego \u017ar\u00f3d\u0142a, z kt\u00f3rego chcemy JDK pobra\u0107. Dlatego te\u017c u\u017cytkownicy DragonFly JDK albo Liberica JDK nie b\u0119d\u0105 ju\u017c skazani na Adoptium. A \u017ce wariant\u00f3w JDK jest du\u017co (o czym przekona\u0107 si\u0119 mo\u017cna cho\u0107by na stronie <a href=\"https:\/\/whichjdk.com\/\">whichjdk.com<\/a>, opisuj\u0105cej istniej\u0105ce miedzy nimi r\u00f3\u017cnice).<\/p>\n","innerContent":["\n<p>To jest bowiem pierwsz\u0105 edycj\u0105, kt\u00f3ra pozwala nam kompilowa\u0107 do Javy 19, w zwi\u0105zku z tym je\u015bli do tej pory nie byli\u015bcie w stanie przepi\u0105\u0107 swoich produkcyjnych projekt\u00f3w na nowe Preview API (no bo tylko one si\u0119 ostanio pojawiaj\u0105), nareszcie Gradle ju\u017c nie jest dla Was \u017cadn\u0105 przeszkod\u0105. Gradle zreszt\u0105 sobie to JDK samodzielnie pobierze dzi\u0119ki wprowadzonemu ju\u017c par\u0119 edycji temu Java Toolchain, kt\u00f3ry obecnie wsparty zosta\u0142 o mo\u017cliwo\u015b\u0107 zdefiniowania konkretnego \u017ar\u00f3d\u0142a, z kt\u00f3rego chcemy JDK pobra\u0107. Dlatego te\u017c u\u017cytkownicy DragonFly JDK albo Liberica JDK nie b\u0119d\u0105 ju\u017c skazani na Adoptium. A \u017ce wariant\u00f3w JDK jest du\u017co (o czym przekona\u0107 si\u0119 mo\u017cna cho\u0107by na stronie <a href=\"https:\/\/whichjdk.com\/\">whichjdk.com<\/a>, opisuj\u0105cej istniej\u0105ce miedzy nimi r\u00f3\u017cnice).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Fani silnego typowania i Kotlinowego DSL-a otrzymali za\u015b du\u017co lepsze podpowiadanie sk\u0142adni. Dodatkowo, usprawniona zosta\u0142a inkrementalna kompilacja w sytuacji b\u0142\u0119d\u00f3w, a dodatkowo umo\u017cliwiono te\u017c \"rerun\" pojedynczego taska. Ostatni\u0105 za\u015b du\u017c\u0105 rzecz\u0105 jest mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia si\u0119 do gradlowego debuggera nie tylko z lokalnej maszyny, ale r\u00f3wnie\u017c po sieci, co mo\u017ce by\u0107 przydatne np. w \u015brodowiskach CI\/CD.<\/p>\n","innerContent":["\n<p>Fani silnego typowania i Kotlinowego DSL-a otrzymali za\u015b du\u017co lepsze podpowiadanie sk\u0142adni. Dodatkowo, usprawniona zosta\u0142a inkrementalna kompilacja w sytuacji b\u0142\u0119d\u00f3w, a dodatkowo umo\u017cliwiono te\u017c \"rerun\" pojedynczego taska. Ostatni\u0105 za\u015b du\u017c\u0105 rzecz\u0105 jest mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia si\u0119 do gradlowego debuggera nie tylko z lokalnej maszyny, ale r\u00f3wnie\u017c po sieci, co mo\u017ce by\u0107 przydatne np. w \u015brodowiskach CI\/CD.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>WildFly 27<\/h3>\n","innerContent":["\n<h3>WildFly 27<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przechodzimy dalej, tym razem mam co\u015b dla u\u017cytkownik\u00f3w Jakarty EE. \"Ten fajny\" serwer aplikacyjny - WildFly.<\/p>\n","innerContent":["\n<p>Przechodzimy dalej, tym razem mam co\u015b dla u\u017cytkownik\u00f3w Jakarty EE. \"Ten fajny\" serwer aplikacyjny - WildFly.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/9EsaWa1.jpg\" alt=\"\"\/><figcaption>WildFly - Nowoczesny serwer aplikacyjny<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/9EsaWa1.jpg\" alt=\"\"\/><figcaption>WildFly - Nowoczesny serwer aplikacyjny<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mo\u017cna si\u0119 \u015bmia\u0107 z powy\u017cszej zbitki, ale to w\u0142a\u015bnie WildFly ze wszystkich narz\u0119dzi maj\u0105cych jakiekolwiek powi\u0105zania z \u015bwiatem starej Java EE jest z pewno\u015bci\u0105 tym w najwi\u0119kszym stopniu eksperymentuj\u0105cym z nowoczesnymi technologiami. Niech za przyk\u0142ad pos\u0142u\u017cy to, \u017ce nowe wydanie jest kompatybilne z \u015bwie\u017cutk\u0105 Jakarta EE 10 - i to r\u00f3wnie\u017c \u015bwie\u017co dodanym do niej Core Profilem, konkurencj\u0105 dla MicroProfile. Ju\u017c samo to zwiastowa\u0142oby ciekawe wydanie, ale <a href=\"https:\/\/www.wildfly.org\/news\/2022\/11\/09\/WildFly27-Final-Released\/\">WildFly 27<\/a> przynosi sporo wi\u0119cej.<\/p>\n","innerContent":["\n<p>Mo\u017cna si\u0119 \u015bmia\u0107 z powy\u017cszej zbitki, ale to w\u0142a\u015bnie WildFly ze wszystkich narz\u0119dzi maj\u0105cych jakiekolwiek powi\u0105zania z \u015bwiatem starej Java EE jest z pewno\u015bci\u0105 tym w najwi\u0119kszym stopniu eksperymentuj\u0105cym z nowoczesnymi technologiami. Niech za przyk\u0142ad pos\u0142u\u017cy to, \u017ce nowe wydanie jest kompatybilne z \u015bwie\u017cutk\u0105 Jakarta EE 10 - i to r\u00f3wnie\u017c \u015bwie\u017co dodanym do niej Core Profilem, konkurencj\u0105 dla MicroProfile. Ju\u017c samo to zwiastowa\u0142oby ciekawe wydanie, ale <a href=\"https:\/\/www.wildfly.org\/news\/2022\/11\/09\/WildFly27-Final-Released\/\">WildFly 27<\/a> przynosi sporo wi\u0119cej.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Po pierwsze, jest to kolejna z technologii mocno integruj\u0105ca si\u0119 z Micrometer, kt\u00f3ry otrzyma\u0142 wsparcie, cho\u0107 narazie tylko jako Tech Preview. WildFly mocno inwestuje r\u00f3wnie\u017c we wsparcie chmury i og\u00f3lnie bycie cloud-native. \u015awiadczy\u0107 o tym mo\u017ce nie tylko dalszy aktywny rozw\u00f3j \"b\u0142ogos\u0142awionych\" obraz\u00f3w Dockerowych, ale tak\u017ce nowa architektura dla WildFly S2I. Pod tym szalenie enigmatycznym skr\u00f3tem kryje si\u0119 WildFly Source-to-Image, czyli narz\u0119dzie do wdra\u017cania aplikacji na serwery aplikacyjne w chmurze. S2I s\u0142u\u017cy do metoda budowania powtarzalnych obraz\u00f3w Docker bezpo\u015brednio z kodu \u017ar\u00f3d\u0142owego. W nowym wydaniu WildFly zmieniona zosta\u0142a architektura ca\u0142ego narz\u0119dzia. Zmian jest du\u017co, dlatego je\u015bli u\u017cywacie S2I, polecam sprawdzi\u0107 dedykowane temu narz\u0119dziu og\u0142oszenie.<\/p>\n","innerContent":["\n<p>Po pierwsze, jest to kolejna z technologii mocno integruj\u0105ca si\u0119 z Micrometer, kt\u00f3ry otrzyma\u0142 wsparcie, cho\u0107 narazie tylko jako Tech Preview. WildFly mocno inwestuje r\u00f3wnie\u017c we wsparcie chmury i og\u00f3lnie bycie cloud-native. \u015awiadczy\u0107 o tym mo\u017ce nie tylko dalszy aktywny rozw\u00f3j \"b\u0142ogos\u0142awionych\" obraz\u00f3w Dockerowych, ale tak\u017ce nowa architektura dla WildFly S2I. Pod tym szalenie enigmatycznym skr\u00f3tem kryje si\u0119 WildFly Source-to-Image, czyli narz\u0119dzie do wdra\u017cania aplikacji na serwery aplikacyjne w chmurze. S2I s\u0142u\u017cy do metoda budowania powtarzalnych obraz\u00f3w Docker bezpo\u015brednio z kodu \u017ar\u00f3d\u0142owego. W nowym wydaniu WildFly zmieniona zosta\u0142a architektura ca\u0142ego narz\u0119dzia. Zmian jest du\u017co, dlatego je\u015bli u\u017cywacie S2I, polecam sprawdzi\u0107 dedykowane temu narz\u0119dziu og\u0142oszenie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Async-Profiler 2.9<\/h3>\n","innerContent":["\n<h3>Async-Profiler 2.9<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><a href=\"https:\/\/vived.io\/much-ado-about-observability-jep-making-profiling-easier-and-quarkus-dropping-microprofile-standard\/\">Niedawno pisa\u0142em o narz\u0119dziu<\/a>, jakim jest Async-Profiler w kontek\u015bcie <a href=\"https:\/\/openjdk.org\/jeps\/435\">JEP 435: Asynchronous Stack Trace VM API<\/a>, kt\u00f3rego celem by\u0142o ustandaryzowanie API dla Stack Trace maszyny wirtualnej. Dzisiaj przysz\u0142o mi do tematu wr\u00f3ci\u0107, poniewa\u017c najlepszy profiler JVM dosta\u0142 now\u0105 wersj\u0119, a z ni\u0105 jedn\u0105 bardzo du\u017c\u0105 zmian\u0119: Heap Leak Profiler.<\/p>\n","innerContent":["\n<p><a href=\"https:\/\/vived.io\/much-ado-about-observability-jep-making-profiling-easier-and-quarkus-dropping-microprofile-standard\/\">Niedawno pisa\u0142em o narz\u0119dziu<\/a>, jakim jest Async-Profiler w kontek\u015bcie <a href=\"https:\/\/openjdk.org\/jeps\/435\">JEP 435: Asynchronous Stack Trace VM API<\/a>, kt\u00f3rego celem by\u0142o ustandaryzowanie API dla Stack Trace maszyny wirtualnej. Dzisiaj przysz\u0142o mi do tematu wr\u00f3ci\u0107, poniewa\u017c najlepszy profiler JVM dosta\u0142 now\u0105 wersj\u0119, a z ni\u0105 jedn\u0105 bardzo du\u017c\u0105 zmian\u0119: Heap Leak Profiler.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Za t\u0105 niepozorn\u0105 nazw\u0105 kryje si\u0119 bowiem pot\u0119\u017cne narz\u0119dzie, b\u0119d\u0105ce w stanie wykrywa\u0107 wycieki pami\u0119ci w czasie rzeczywistym. Co wa\u017cne, ca\u0142o\u015b\u0107 zosta\u0142a zaprojektowana w celu minimalnego narzutu na wykonywany proces, ca\u0142o\u015b\u0107 opiera si\u0119 bowiem o pr\u00f3bkowanie danych, co znacznie zmniejsza zu\u017cycie zasob\u00f3w. Dzi\u0119ki temu ca\u0142o\u015b\u0107 nadaje si\u0119 do wykrywania tego typu problem\u00f3w w \u015brodowisku produkcyjnym.<\/p>\n","innerContent":["\n<p>Za t\u0105 niepozorn\u0105 nazw\u0105 kryje si\u0119 bowiem pot\u0119\u017cne narz\u0119dzie, b\u0119d\u0105ce w stanie wykrywa\u0107 wycieki pami\u0119ci w czasie rzeczywistym. Co wa\u017cne, ca\u0142o\u015b\u0107 zosta\u0142a zaprojektowana w celu minimalnego narzutu na wykonywany proces, ca\u0142o\u015b\u0107 opiera si\u0119 bowiem o pr\u00f3bkowanie danych, co znacznie zmniejsza zu\u017cycie zasob\u00f3w. Dzi\u0119ki temu ca\u0142o\u015b\u0107 nadaje si\u0119 do wykrywania tego typu problem\u00f3w w \u015brodowisku produkcyjnym.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u017celi jeste\u015bcie ciekawi detali, ca\u0142o\u015b\u0107 zosta\u0142a dobrze opracowana przez Krzysztofa \u015alusarskiego w jego tek\u015bcie <a href=\"https:\/\/krzysztofslusarski.github.io\/2022\/11\/27\/async-live.html\">Finding heap memory leaks with Async-profiler<\/a>. Tam te\u017c znajdziecie konkretne przypadki u\u017cycia.<\/p>\n","innerContent":["\n<p>Je\u017celi jeste\u015bcie ciekawi detali, ca\u0142o\u015b\u0107 zosta\u0142a dobrze opracowana przez Krzysztofa \u015alusarskiego w jego tek\u015bcie <a href=\"https:\/\/krzysztofslusarski.github.io\/2022\/11\/27\/async-live.html\">Finding heap memory leaks with Async-profiler<\/a>. Tam te\u017c znajdziecie konkretne przypadki u\u017cycia.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Spring Batch 5.0<\/h3>\n","innerContent":["\n<h3>Spring Batch 5.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A na ko\u0144cu, wprawdzie o Springu ju\u017c ostatnio by\u0142o du\u017co, ale od tamtej pory pojawi\u0142y si\u0119 dwie ca\u0142kiem spore nowo\u015bci.<\/p>\n","innerContent":["\n<p>A na ko\u0144cu, wprawdzie o Springu ju\u017c ostatnio by\u0142o du\u017co, ale od tamtej pory pojawi\u0142y si\u0119 dwie ca\u0142kiem spore nowo\u015bci.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pierwsz\u0105 z nich jest Spring Batch w wersji 5.0, kt\u00f3ry mo\u017ce pochwali\u0107 si\u0119 do\u015b\u0107 imponuj\u0105c\u0105 ilo\u015bci\u0105 zmian. Jest to pakiet zapewnia funkcje potrzebne przy przetwarzaniu du\u017cych ilo\u015bci rekord\u00f3w, takie jak logowanie, zarz\u0105dzanie transakcjami, restartowanie i pomijanie job\u00f3w, a tak\u017ce zarz\u0105dzanie zasobami.<\/p>\n","innerContent":["\n<p>Pierwsz\u0105 z nich jest Spring Batch w wersji 5.0, kt\u00f3ry mo\u017ce pochwali\u0107 si\u0119 do\u015b\u0107 imponuj\u0105c\u0105 ilo\u015bci\u0105 zmian. Jest to pakiet zapewnia funkcje potrzebne przy przetwarzaniu du\u017cych ilo\u015bci rekord\u00f3w, takie jak logowanie, zarz\u0105dzanie transakcjami, restartowanie i pomijanie job\u00f3w, a tak\u017ce zarz\u0105dzanie zasobami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, mamy do czynienia z wyr\u00f3wnaniem do obowi\u0105zuj\u0105cych wersji Spring Framework, wi\u0119c w gratisie pojawi\u0142o si\u0119 cho\u0107by wsparcie Jakarty EE 9 i GraalVM. Ten ostatni ze wzgl\u0119du na charkaterystyk\u0119 pracy Spring Batcha (dzia\u0142anie na wielu, ale kr\u00f3tko \u017cyj\u0105cych w\u0105tkach) mo\u017ce wed\u0142ug zamieszczanych benchmark\u00f3w pochwali\u0107 si\u0119 przyspieszeniem nawet do dziesi\u0119ciu razy. Pe\u0142n\u0105 list\u0119 zmian (a jak wspomina\u0142em - jest ich troch\u0119) zobaczy\u0107 mo\u017cecie <a href=\"https:\/\/spring.io\/blog\/2022\/11\/24\/spring-batch-5-0-goes-ga\">w oficjalnym og\u0142oszeniu<\/a>.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, mamy do czynienia z wyr\u00f3wnaniem do obowi\u0105zuj\u0105cych wersji Spring Framework, wi\u0119c w gratisie pojawi\u0142o si\u0119 cho\u0107by wsparcie Jakarty EE 9 i GraalVM. Ten ostatni ze wzgl\u0119du na charkaterystyk\u0119 pracy Spring Batcha (dzia\u0142anie na wielu, ale kr\u00f3tko \u017cyj\u0105cych w\u0105tkach) mo\u017ce wed\u0142ug zamieszczanych benchmark\u00f3w pochwali\u0107 si\u0119 przyspieszeniem nawet do dziesi\u0119ciu razy. Pe\u0142n\u0105 list\u0119 zmian (a jak wspomina\u0142em - jest ich troch\u0119) zobaczy\u0107 mo\u017cecie <a href=\"https:\/\/spring.io\/blog\/2022\/11\/24\/spring-batch-5-0-goes-ga\">w oficjalnym og\u0142oszeniu<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Spring Integration 6.0<\/h3>\n","innerContent":["\n<h3>Spring Integration 6.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>I na sam koniec <a href=\"https:\/\/spring.io\/blog\/2022\/11\/29\/spring-integration-6-0-goes-ga\">Spring Integration 6.0<\/a>. Spring Integration to framework do budowy szeroko rozumianych \"integracji\", g\u0142\u00f3wnie w tym korporacyjnym wydaniu.<\/p>\n","innerContent":["\n<p>I na sam koniec <a href=\"https:\/\/spring.io\/blog\/2022\/11\/29\/spring-integration-6-0-goes-ga\">Spring Integration 6.0<\/a>. Spring Integration to framework do budowy szeroko rozumianych \"integracji\", g\u0142\u00f3wnie w tym korporacyjnym wydaniu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":640,"height":335},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/eip-book-header.jpg\" alt=\"\" width=\"640\" height=\"335\"\/><figcaption>Je\u017celi kojarzycie ksi\u0105\u017ck\u0119 <strong>Enterprise Integration Patterns<\/strong>, to jest to jej wersja \"stosowana\".<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/eip-book-header.jpg\" alt=\"\" width=\"640\" height=\"335\"\/><figcaption>Je\u017celi kojarzycie ksi\u0105\u017ck\u0119 <strong>Enterprise Integration Patterns<\/strong>, to jest to jej wersja \"stosowana\".<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza standardowymi usprawnieniami, nowy Spring Integration to przede wszystkim wsp arcie dla <a href=\"https:\/\/docs.spring.io\/spring-integration\/docs\/current\/reference\/html\/whats-new.html#whats-new\">GraphQL<\/a>, kt\u00f3ry bazuje na projekcie <a href=\"https:\/\/docs.spring.io\/spring-integration\/docs\/current\/reference\/html\/graphql.html#graphql\">spring-graphql<\/a>. Opr\u00f3cz tego fani Kotlina z pewno\u015bci\u0105 uciesz\u0105 si\u0119 z faktu, projekt mo\u017ce wreszcie pochwali\u0107 si\u0119 wsparciem dla Korutyn. Wi\u0119ksze lub mniejsze zmiany czy migracje dotkn\u0119\u0142y r\u00f3wnie\u017c integracji z wi\u0119kszo\u015bci\u0105 provider\u00f3w, takich jak Apache Camel (nowa integracja), Hazelcast, MQTT czy RabbitMQ.<\/p>\n","innerContent":["\n<p>Poza standardowymi usprawnieniami, nowy Spring Integration to przede wszystkim wsp arcie dla <a href=\"https:\/\/docs.spring.io\/spring-integration\/docs\/current\/reference\/html\/whats-new.html#whats-new\">GraphQL<\/a>, kt\u00f3ry bazuje na projekcie <a href=\"https:\/\/docs.spring.io\/spring-integration\/docs\/current\/reference\/html\/graphql.html#graphql\">spring-graphql<\/a>. Opr\u00f3cz tego fani Kotlina z pewno\u015bci\u0105 uciesz\u0105 si\u0119 z faktu, projekt mo\u017ce wreszcie pochwali\u0107 si\u0119 wsparciem dla Korutyn. Wi\u0119ksze lub mniejsze zmiany czy migracje dotkn\u0119\u0142y r\u00f3wnie\u017c integracji z wi\u0119kszo\u015bci\u0105 provider\u00f3w, takich jak Apache Camel (nowa integracja), Hazelcast, MQTT czy RabbitMQ.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Log4Shell - Pami\u0119tamy \ud83d\udd6f\ufe0f<\/h2>\n","innerContent":["\n<h2>3. Log4Shell - Pami\u0119tamy \ud83d\udd6f\ufe0f<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mija nam w\u0142a\u015bnie rok od jednego z najwi\u0119kszych incydent\u00f3w w historii Javy, czyli tak zwanego Log4Shell - je\u015bli nie byli\u015bcie wtedy z nami (szcz\u0119\u015bciarze) wi\u0119cej przeczytacie tutaj. Wydaje mi si\u0119, \u017ce nale\u017cy czci\u0107 jego pami\u0119\u0107 w spos\u00f3b godny takiej rocznicy, na przyk\u0142ad poprzez przypomnienie fali gorzkiego humoru, kt\u00f3ry towarzyszy\u0142 spo\u0142eczno\u015bci w tych trudnych dniach.<\/p>\n","innerContent":["\n<p>Mija nam w\u0142a\u015bnie rok od jednego z najwi\u0119kszych incydent\u00f3w w historii Javy, czyli tak zwanego Log4Shell - je\u015bli nie byli\u015bcie wtedy z nami (szcz\u0119\u015bciarze) wi\u0119cej przeczytacie tutaj. Wydaje mi si\u0119, \u017ce nale\u017cy czci\u0107 jego pami\u0119\u0107 w spos\u00f3b godny takiej rocznicy, na przyk\u0142ad poprzez przypomnienie fali gorzkiego humoru, kt\u00f3ry towarzyszy\u0142 spo\u0142eczno\u015bci w tych trudnych dniach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zatem niech poleci m\u00f3j ulubiony, kt\u00f3ry dodatkowo stawia spraw\u0119 w nieco szerszym kontek\u015bcie:<\/p>\n","innerContent":["\n<p>Zatem niech poleci m\u00f3j ulubiony, kt\u00f3ry dodatkowo stawia spraw\u0119 w nieco szerszym kontek\u015bcie:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12929,"width":506,"height":283,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-14.png\" alt=\"\" class=\"wp-image-12929\" width=\"506\" height=\"283\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-14.png\" alt=\"\" class=\"wp-image-12929\" width=\"506\" height=\"283\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><span style=\"font-size: revert; color: initial; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, sans-serif;\">Log4Shell, zawsze b\u0119dziesz w naszych sercach jako dzie\u0144, kt\u00f3ry zjednoczy\u0142 Java Developer\u00f3w na ca\u0142ym \u015bwiecie we wsp\u00f3lnych emocjach (cho\u0107by emocji przera\u017cenia i smutku) \u2764\ufe0f<\/span><\/p>\n","innerContent":["\n<p><span style=\"font-size: revert; color: initial; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, sans-serif;\">Log4Shell, zawsze b\u0119dziesz w naszych sercach jako dzie\u0144, kt\u00f3ry zjednoczy\u0142 Java Developer\u00f3w na ca\u0142ym \u015bwiecie we wsp\u00f3lnych emocjach (cho\u0107by emocji przera\u017cenia i smutku) \u2764\ufe0f<\/span><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Log4Shell, zawsze b\u0119dziesz w naszych sercach jako dzie\u0144, kt\u00f3ry zjednoczy\u0142 Java Developer\u00f3w na ca\u0142ym \u015bwiecie we wsp\u00f3lnych emocjach (cho\u0107by emocji przera\u017cenia i smutku) \u2764\ufe0f<\/p>\n","innerContent":["\n<p>Log4Shell, zawsze b\u0119dziesz w naszych sercach jako dzie\u0144, kt\u00f3ry zjednoczy\u0142 Java Developer\u00f3w na ca\u0142ym \u015bwiecie we wsp\u00f3lnych emocjach (cho\u0107by emocji przera\u017cenia i smutku) \u2764\ufe0f<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wi\u0119cej takowych znajdziecie na stronie <a href=\"https:\/\/log4jmemes.com\/\">log4jmemes.com<\/a> - tyle tego by\u0142o, \u017ce doczeka\u0142y si\u0119 swojego miejsca w sieci.<\/p>\n","innerContent":["\n<p>Wi\u0119cej takowych znajdziecie na stronie <a href=\"https:\/\/log4jmemes.com\/\">log4jmemes.com<\/a> - tyle tego by\u0142o, \u017ce doczeka\u0142y si\u0119 swojego miejsca w sieci.<\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/12927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=12927"}],"version-history":[{"count":35,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/12927\/revisions"}],"predecessor-version":[{"id":12976,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/12927\/revisions\/12976"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/12949"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=12927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=12927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=12927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}