{"id":17050,"date":"2023-11-23T08:27:54","date_gmt":"2023-11-23T07:27:54","guid":{"rendered":"https:\/\/vived.io\/?p=17050"},"modified":"2023-11-24T07:03:31","modified_gmt":"2023-11-24T06:03:31","slug":"spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/","title":{"rendered":"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski &#8211; JVM Weekly vol. 154"},"content":{"rendered":"\n<p class=\"has-text-align-left\">Spring bowiem postanowi\u0142 bowiem dogoni\u0107 reszt\u0119 ekosystemu i wprowadzi\u0142 wsparcie dla dw\u00f3ch bardzo istotnych nowo\u015bci z punktu widzenia wysokowydajnych aplikacji: Wirtualnych W\u0105tk\u00f3w oraz Projektu CRAC.<\/p>\n\n\n\n<h2 id=\"virtual-threads\" data-num=1>Virtual Threads<\/h2>\n\n\n\n<p>Dobra, jako \u017ce pewnie na ten tekst trafi\u0105 ludzie, kt\u00f3rzy programuj\u0105 w Springu, wi\u0119c z za\u0142o\u017cenia mogli jeszcze nie zapozna\u0107 si\u0119 jeszcze z konceptem Wirtualnych W\u0105tk\u00f3w (bo takowych w ekosystemie za bardzo jeszcze nie by\u0142o), bardzo kr\u00f3tkie wprowadzenie do tematu.<\/p>\n\n\n\n<p>Wirtualne W\u0105tki, wprowadzone w JDK 21 w ramach Projektu Loom, mieszaj\u0105 w podej\u015bciu Javy do wsp\u00f3\u0142bie\u017cno\u015bci. W przeciwie\u0144stwie do tradycyjnych w\u0105tk\u00f3w, kt\u00f3re s\u0105 bezpo\u015brednio zarz\u0105dzane przez system operacyjny i s\u0105 stosunkowo ci\u0119\u017ckie (gdzie to s\u0142owo rozumiem tutaj jako &#8222;generyczne&#8221;, w\u0105tki wirtualne s\u0105 lekkie i zarz\u0105dzane przez JVM. Pozwala to na tworzenie du\u017cej liczby w\u0105tk\u00f3w bez narzutu, kt\u00f3re zwykle wi\u0105\u017ce si\u0119 z tradycyjnymi w\u0105tkami. Virtual Thready s\u0105 szczeg\u00f3lnie korzystne w aplikacjach intensywnie korzystaj\u0105cych z I\/O, umo\u017cliwiaj\u0105c im obs\u0142ug\u0119 wsp\u00f3\u0142bie\u017cno\u015bci przy zmniejszonym zu\u017cyciu pami\u0119ci, szczeg\u00f3lnie w scenariuszach zwi\u0105zanych z operacjami blokuj\u0105cymi. Oczywi\u015bcie to tylko wierzcho\u0142ek g\u00f3ry lodowej, wi\u0119c je\u015bli chcecie o Wirtualnych W\u0105tkach dowiedzie\u0107 si\u0119 wi\u0119cej, idealnym miejscem b\u0119dzie, jak sama nazwa wskazuje, <a href=\"https:\/\/blog.rockthejvm.com\/ultimate-guide-to-java-virtual-threads\/\">The Ultimate Guide to Java Virtual Threads<\/a>, gdzie zamiast jednego akapitu jak tutaj macie po prostu godzin\u0119+ czytania. Bo z wirtualnymi w\u0105tkami jest jednak jak z t\u0105 legendarn\u0105 sow\u0105 &#8211; za\u0142o\u017cenia s\u0105 proste, interesuj\u0105co robi si\u0119 gdy trafiamy na szczeg\u00f3\u0142y.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"816\" height=\"360\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-19.png\" alt=\"\" class=\"wp-image-17058\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-19.png 816w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-19-300x132.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-19-768x339.png 768w\" sizes=\"auto, (max-width: 816px) 100vw, 816px\" \/><figcaption class=\"wp-element-caption\">Chocia\u017c akurat ten mem to si\u0119 mocno zestarza\u0142 na naszych oczach<\/figcaption><\/figure><\/div>\n\n\n<p>Spring eksperymentowa\u0142 z tymi w\u0105tkami ju\u017c dawno, kiedy znanymi jako Fibers (kurcze, stary jestem, <a href=\"https:\/\/www.slideshare.net\/ArturSkowroski\/to-be-continued-multithreading-with-project-loom-and-kotlins-coroutines\">jeszcze w 2018 mia\u0142em o nich talka<\/a>). Zamiast jednak rzuci\u0107 si\u0119 na ca\u0142o\u015b\u0107 jak sroka na b\u0142yskotki, podej\u015bcie Springa obejmuje bardziej ewolucyjn\u0105 rewizj\u0119 modeli wsp\u00f3\u0142bie\u017cno\u015bci w frameworku, tak aby wykorzysta\u0107 wirtualne w\u0105tki bez wywracania API do g\u00f3ry nogami.<\/p>\n\n\n\n<p>Wsparcie w Springu jest wi\u0119c warunkowe i zale\u017cy od dw\u00f3ch czynnik\u00f3w: uruchomienia aplikacji z u\u017cyciem JDK 21 oraz w\u0142\u0105czenia opcji konfiguracyjnej <code>spring.threads.virtual.enabled<\/code>. Wtedy to zar\u00f3wno serwery Tomcat, jak i Jetty w Spring Boot u\u017cywaj\u0105 w\u0105tk\u00f3w wirtualnych do przetwarzania zapyta\u0144. Oznacza to, \u017ce kod aplikacji, jak cho\u0107by metody kontroler\u00f3w obs\u0142uguj\u0105ce requesty sieciowe, b\u0119dzie dzia\u0142a\u0142 na w\u0105tkach wirtualnych, oferuj\u0105c potencjalne lepsz\u0105 w wydajno\u015bci aplikacji (aczkolwiek osobi\u015bcie sugeruje sprawdzi\u0107 to bardziej empirycznie, ka\u017cda aplikacja mo\u017ce mie\u0107 nieco inne bootlenecki).<\/p>\n\n\n\n<p>To jednak nie koniec: integracja w\u0105tk\u00f3w wirtualnych w Spring obejmuje te\u017c troch\u0119 dodatkowych atrakcji. Powsta\u0142 dedykowany a dedicated <code>VirtualThreadTaskExecutor<\/code>, a gdy w\u0105tki wirtualne s\u0105 w\u0142\u0105czone, zar\u00f3wno <code>SimpleAsyncTaskExecutor<\/code> jak i <code>SimpleAsyncTaskScheduler<\/code> skonfigurowane zostaj\u0105 domy\u015blnie do ich u\u017cycia. Afektuje to sporo zachowa\u0144 Springa, w tym metod u\u017cycia metod <code>@EnableAsync<\/code>, asynchronicznego przetwarzania \u017c\u0105da\u0144 w Spring MVC oraz wsparcia dla blokuj\u0105cego wykonania w Spring WebFlux. Wp\u0142ywa to te\u017c na dzia\u0142anie poszczeg\u00f3lnych integracji, takich jak listenery dla RabbitMQ czy Kafki, Spring Data Redis oraz Apache Pulsar (o kt\u00f3rym za chwil\u0119). Przyznam, \u017ce z mojej strony brakuje mi troch\u0119 wi\u0119kszej granularno\u015bci i mo\u017cliwo\u015bci wyboru, w kt\u00f3rych miejscach realnie chcemy Wirtualnych W\u0105tk\u00f3w u\u017cywa\u0107 &#8211; u\u0142atwi\u0142oby to z pewno\u015bci\u0105 migracje wi\u0119kszych projekt\u00f3w. C\u00f3\u017c, mo\u017ce w kolejnych edycjach.<\/p>\n\n\n\n<p>Sam Spring na razie nie opublikowa\u0142 konkretniejszych analiz wp\u0142ywu Virtual Thread\u00f3w na aplikacje webowe, ale jako \u017ce konkurencja ju\u017c ten temat rozgrzebywa\u0142a polecam \u015bwietn\u0105 <a href=\"https:\/\/quarkus.io\/blog\/virtual-thread-1\/#five-things-you-need-to-know-before-using-virtual-threads-for-everything\">seri\u0119 od Quarkusa<\/a> &#8211; implikacje i dobre praktyki powinny by\u0107 zbli\u017cone.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"815\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20-1024x815.png\" alt=\"\" class=\"wp-image-17060\" style=\"width:591px;height:auto\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20-1024x815.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20-300x239.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20-768x611.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20-1536x1222.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20.png 1910w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Bo Spring to jest takie Apple \u015bwiata JVM &#8211; wprowadza technologie dopiero wtedy, jak ju\u017c si\u0119 mocno u konkurencji wygrzej\u0105.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"project-crac\" data-num=2>Project CRAC<\/h2>\n\n\n\n<p>Zanim b\u0119dzie o drugiej wa\u017cnej nowo\u015bci, projekcie CRaC, najpierw musz\u0119 wspomnie\u0107 o tym czym jest tak zwany problem Zimnego Startu.<\/p>\n\n\n\n<p>Jak pewnie wiecie, \u017ce aplikacje napisane w Javie \u2013 zanim jeszcze b\u0119d\u0105 w stanie \u201eprzyjmowa\u0107\u201d ruch \u2013 zwykle potrzebuj\u0105 troch\u0119 czasu na rozruch. Cechuje to zar\u00f3wno klasyczne aplikacje serwerowe (kt\u00f3re do osi\u0105gni\u0119cia pe\u0142nej wydajno\u015bci wymagaj\u0105 procesu kompilacji JiT, odpalanej na bazie dynamicznej charakterystyki ruchu), jak i aplikacji Serverless (kt\u00f3re po prostu w sytuacjach brzegowych wymagaj\u0105 ca\u0142ej maszynerii pod spodem). <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"760\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JUIsCzo.jpg\" alt=\"\" class=\"wp-image-17063\" style=\"width:555px;height:auto\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JUIsCzo.jpg 840w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JUIsCzo-300x271.jpg 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JUIsCzo-768x695.jpg 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><figcaption class=\"wp-element-caption\">Cho\u0107 i na to chc\u0105cy znajdzie spos\u00f3b.<\/figcaption><\/figure><\/div>\n\n\n<p>Na szcz\u0119\u015bcie, istnieje kilka rozwi\u0105za\u0144 kt\u00f3re ten &#8222;zimny start&#8221; nam zredukuj\u0105 &#8211; taki GraalVM pozwala nam na tworzenie &#8222;natywnych&#8221; wersji aplikacji Java, ale istniej\u0105 te\u017c metody jak Fast Startup czy AppCDS s\u0142u\u017cy\u0142y do cache\u2019owania poszczeg\u00f3lnych fragment\u00f3w runtime JVM-a, aby nie trzeba by\u0142o ich inicjowa\u0107 od zera przy starcie. Co jednak, je\u015bli mogliby\u015bmy za ka\u017cdym razem odczytywa\u0107 rozgrzany, od\u0142o\u017cony na p\u00f3\u017aniej kod aplikacji, a mo\u017ce i kompletn\u0105 pami\u0119\u0107 ju\u017c z wczytanymi danymi, cho\u0107by dla modeli ML? By to osi\u0105gn\u0105\u0107, na naszym radarze powinno pojawi\u0107 si\u0119 mechanizm, CRIU.<\/p>\n\n\n\n<p>Checkpoint\/Restore in Userspace (CRIU) to funkcja Linuxa, kt\u00f3ra umo\u017cliwia wykonanie \u201ezrzutu\u201d na dysk ca\u0142ego dzia\u0142aj\u0105cego procesu aplikacji. Nast\u0119pnie, kolejna instancja mo\u017ce by\u0107 uruchomiona z tego punktu, w kt\u00f3rym wykonano wspomniany zrzut, co skraca czas rozruchu.<\/p>\n\n\n\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach. Metody takie jak AppCDS przypominaj\u0105 klasyczne zapisywanie \u2013 wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje \u2013 jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk (co w wypadku starych konsol mo\u017ce by\u0107 np. zawrotnym 1Mb) i potem sobie odtwarzamy 1:1 gdy jest to potrzebne.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"366\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-21.png\" alt=\"\" class=\"wp-image-17065\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-21.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-21-300x143.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">Tak dzia\u0142a r\u00f3wnie\u017c w\u0142a\u015bnie CRIU.<\/figcaption><\/figure><\/div>\n\n\n<p>CRIU posiada swoje problemy \u2013 zar\u00f3wno z punktu widzenia bezpiecze\u0144stwa, jak i wygody u\u017cytkowania \u2013 m\u00f3wimy tutaj bowiem o generycznej funkcji systemu operacyjnego, znajduj\u0105cej si\u0119 poza JVM. Ka\u017cda aplikacja ma za\u015b nieco inn\u0105 charakterystyk\u0119 i w zale\u017cno\u015bci od tego, czy m\u00f3wimy o serwerze aplikacyjnym, aplikacji webowej czy batchowym jobie zapis na dysk powinien odbywa\u0107 si\u0119 w innym momencie, kt\u00f3ry mo\u017ce by\u0107 trudny do wychwycenia bez kontekstu maszyny wirtualnej. Jak pisze OpenLiberty w swoim tek\u015bcie <a href=\"https:\/\/openliberty.io\/blog\/2020\/02\/12\/faster-startup-Java-applications-criu.html\">Faster start-up for Java applications on Open Liberty with CRIU<\/a>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>It would be useful to have an API so that the application can specify when it would like a snapshot to be taken; this would be a valuable addition to the Java specification.<\/p>\n<\/blockquote>\n\n\n\n<p>OpenLiberty od tamtem pory dorobi\u0142o si\u0119 w\u0142asnego mechanizmu u\u017cywaj\u0105cego CRIU.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Christine Flood \u2014 CRIU and Java opportunities and challenges\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/XXbJNaFF-8A?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><figcaption class=\"wp-element-caption\">PS: Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o CRiU, Christine Flood z RedHata nagra\u0142a dog\u0142\u0119bnego talka CRIU and Java opportunities and challenges o kontek\u015bcie u\u017cycia tej technologii w Javie.<\/figcaption><\/figure>\n\n\n\n<p>Spring zdecydowa\u0142 si\u0119 jednak na konkurencyjne rozwi\u0105zanie &#8211; i to najwy\u017cszy czas aby wreszcie przej\u015b\u0107 do CRaC.<\/p>\n\n\n\n<p>Project CRaC (Checkpoint\/Restore in Application Continuation) to tooling umo\u017cliwiaj\u0105cych u\u017cycie mechanizmu checkpoint\/restore z aplikacjami Java. Pozwala to na zapisanie stanu dzia\u0142aj\u0105cej JVM (checkpoint) i p\u00f3\u017aniejsze jego przywr\u00f3cenie, umo\u017cliwiaj\u0105c szybsze uruchomienie aplikacji poprzez omini\u0119cie pocz\u0105tkowego \u0142adowania i proces\u00f3w rozgrzewania. Stosunku do &#8222;go\u0142ego&#8221; CRIU wprowadza on odpowiednie hooki i usprawnienia usprawniaj\u0105ce u\u017cycie ca\u0142o\u015bci z JVM.<\/p>\n\n\n\n<p>Tak jak w wypadku Wirtualnych w\u0105tk\u00f3w, aby korzysta\u0107 z Integracja Spring Framework z Project CRaC, musz\u0105 by\u0107 spe\u0142nione pewne warunki: JVM z w\u0142\u0105czon\u0105 funkcj\u0105 checkpoint\/restore (obecnie opcja ta jest dost\u0119pna tylko na Linuxie, wspiera je cho\u0107by <a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">Azul<\/a> czy <a href=\"https:\/\/bell-sw.com\/libericajdk-with-crac\/\">Liberica<\/a>, cho\u0107 tylko ta ostatnia w wersji 21 umo\u017clwiaj\u0105cej r\u00f3wnoczesne u\u017cycie Wirtualnych W\u0105tk\u00f3w), do\u0142\u0105czenie biblioteki <code>org.crac:crac<\/code> (wersja 1.4.0 lub wy\u017csza) do classpath oraz okre\u015blenie specyficznych parametr\u00f3w linii polece\u0144, takich jak <code>-XX:CRaCCheckpointTo=PATH<\/code>. Proces checkpoint tworzy pliki, kt\u00f3re reprezentuj\u0105 pe\u0142ny stan pami\u0119ci JVM, w tym potencjalnie wra\u017cliwe dane, co wymaga starannego rozwa\u017cenia implikacji bezpiecze\u0144stwa. Ca\u0142o\u015b\u0107 wp\u0142ywa te\u017c na losowo\u015b\u0107 <code>java.util.Random<\/code>, kt\u00f3ry staje si\u0119 &#8222;nieco&#8221; mniej losowy, poniewa\u017c wszystkie procesy odpalane s\u0105 na tym samym seedzie.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"820\" height=\"257\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-22.png\" alt=\"\" class=\"wp-image-17067\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-22.png 820w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-22-300x94.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-22-768x241.png 768w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><figcaption class=\"wp-element-caption\">Ju\u017c widz\u0119 te przysz\u0142e pytania na StackOverflow &#8211; &#8222;Dlaczego Spring zawsze generuje ten sam unikalny identyfikator&#8221;.<\/figcaption><\/figure><\/div>\n\n\n<p>Integracja w Springu jest do\u015b\u0107 bogata, efektywnie bowiem wpina si\u0119 w naturalny cykl \u017cycia aplikacji. Checkpoint mo\u017cna wywo\u0142a\u0107 za pomoc\u0105 polecenia <code>jcmd application.jar JDK.checkpoint<\/code>, co skutkuje zatrzymaniem przez Spring wszystkich dzia\u0142aj\u0105cych bean\u00f3w i umo\u017cliwieniem im zamkni\u0119cia zasob\u00f3w. Po przywr\u00f3ceniu te same beany s\u0105 ponownie uruchamiane, otwieraj\u0105c zasoby tam, gdzie to odpowiednie. Poza jednak r\u0119cznym wywo\u0142aniem, kluczowa funkcja tej integracji to mo\u017cliwo\u015b\u0107 konfiguracji automatycznego uruchomienia checkpoint\/restore przy starcie aplikacji. Ustawienie w\u0142a\u015bciwo\u015bci systemu Java <code>-Dspring.context.checkpoint=onRefresh<\/code> powoduje automatyczne utworzenie checkpointu podczas startu na etapie <code>LifecycleProcessor.onRefresh<\/code>. W praktyce oznacza to, \u017ce wszystkie (nie leniwe) singletony s\u0105 ju\u017c zinstancjonowane, wywo\u0142ywane s\u0105 te\u017c callbacki <code>InitializingBean.afterPropertiesSet<\/code>, ale nie wyst\u0105pi\u0142y jeszcze metody <code>Lifecycle.start<\/code>, a <code>ContextRefreshedEvent<\/code> nie zosta\u0142 jeszcze opublikowany.<\/p>\n\n\n\n<h2 id=\"co-wiecej-w-nowym-wydaniu\" data-num=3>Co wi\u0119cej w nowym wydaniu?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Framework 6.1<\/h3>\n\n\n\n<p>Spring Framework 6.1 to na pewno szeroko rozumiana kompatybilno\u015b\u0107 z JDK 21. Nowa wersja wprowadzi\u0142a te\u017c troch\u0119 ulepsze\u0144 w kontek\u015bcie samego &#8222;kontenera aplikacji&#8221;, szczeg\u00f3lnie w zakresie funkcji zarz\u0105dzania cyklem \u017cycia. Teraz integruje on w sobie funkcje takie jak mo\u017cliwo\u015b\u0107 wstrzymania i wznawiania zada\u0144 oraz lepsz\u0105 kontrol\u0119 nad zamykaniem zada\u0144 w <code>ThreadPoolTaskExecutor<\/code> i <code>ThreadPoolTaskScheduler<\/code>. Nowa wersja wprowadza r\u00f3wnie\u017c lepsze observability dla metod <code>@Scheduled<\/code> i lepsze &#8222;fabryki&#8221; do tworzenia walidator\u00f3w, a tak\u017ce wbudowane wsparcie walidacji metod dla parametr\u00f3w metod kontroler\u00f3w zar\u00f3wno w Spring MVC, jak i WebFlux. Eliminuje to potrzeb\u0119 stosowania adnotacji <code>@Validated<\/code> na poziomie klasy kontrolera. A jak ju\u017c przy anotacjach jeste\u015bmy, <code>@PropertySource<\/code> poszerza wsparcie symboli w wyra\u017ceniach SpEL (Spring Expression Language).<\/p>\n\n\n\n<p>Wprowadzenie te\u017c RestClient, nowego synchronicznego klienta HTTP podobnego do WebClient, ale prekonfigurowanego i dopasowanego pod zapytania REST-owe. Interesuj\u0105co wygl\u0105daj\u0105 te\u017c zmiany w kontek\u015bcie dost\u0119pu do bazy danych &#8211; ciekawym aspektem wydanie jest bowiem wprowadzenie JdbcClient, zunifikowanej fasady dla JDBC. Co wi\u0119cej, nowych mo\u017cliwo\u015bci doczeka\u0142 si\u0119 te\u017c wsparcie dla R2DBC. List\u0119 zmian dotycz\u0105c\u0105 warstwy danych zamykaj\u0105 za\u015b usprawnienia cyklu \u017cycia aplikacji je\u015bli chodzi o transakcyjno\u015b\u0107.<\/p>\n\n\n\n<p>List\u0119 wszystkich zmian <a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/wiki\/What's-New-in-Spring-Framework-6.x\">znajdziecie tutaj<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Boot 3.2.0<\/h3>\n\n\n\n<p>Poza nowo\u015bciami z Spring Framework 6.1, <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/wiki\/Spring-Boot-3.2.0-Release-Notes\">Spring Boot 3.2.0<\/a> wprowadza te\u017c kilka nowych integracji i funkcji. W\u015br\u00f3d nich wyr\u00f3\u017cnia si\u0119 rozszerzone wsparcie dla Apache Pulsara (kt\u00f3rym zajmiemy si\u0119 ju\u017c za chwil\u0119). Wsparcie wspomnianych ju\u017c interfejsu <code>RestClient<\/code> z Spring Framework 6.1 zapewnia za\u015b programistom funkcjonalne, blokuj\u0105ce API HTTP. Pojawi\u0142o si\u0119 r\u00f3wnie\u017c wsparcie dla <code>JdbcClient<\/code>. Wa\u017cnym dodatkiem jest automatyczne logowanie Correlation Id podczas korzystania z Micrometera, co pewnie uchroni nie jednego programist\u0119 przed przykr\u0105 sytuacj\u0105 braku wystarczaj\u0105cej ilo\u015bci informacji w wypadku awarii. Wsparcie auto-configuration doczeka\u0142y si\u0119 te\u017c adnotacji z Micrometera: <code>@Timed<\/code>, <code>@Counted<\/code>, <code>@NewSpan<\/code>, <code>@ContinueSpan<\/code> i <code>@Observed<\/code>.<\/p>\n\n\n\n<p>Wersja 3.2.0 ulepsza budowanie obraz\u00f3w Docker w oparciu o standard <a href=\"https:\/\/buildpacks.io\/\">Cloud-Native Buildpacks<\/a> od Cloud Native Foundation, task do budowania Dockerowych obraz\u00f3w domy\u015blnie za\u015b u\u017cywaj\u0105 teraz konfiguracji z hosta.<\/p>\n\n\n\n<p>Ponownie, mniejszych zmian jest znacznie wi\u0119cej, list\u0119 wszystkich <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/wiki\/Spring-Boot-3.2.0-Release-Notes\">znajdziecie tutaj<\/a>.<\/p>\n\n\n\n<h2 id=\"najciekawsze-wydania-towarzyszace\" data-num=4>Najciekawsze wydania towarzysz\u0105ce<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Spring dla Apache Pulsar<\/h3>\n\n\n\n<p><strong>Apache Pulsar<\/strong> to konkurent Kafki, kt\u00f3ry zosta\u0142 oparty o architektur\u0105, kt\u00f3ra oddziela przestrze\u0144 do przechowywania danych od mocy obliczeniowej. Umo\u017cliwiaj\u0105c to elastyczne skalowanie tych cz\u0119\u015bci niezale\u017cnie, osi\u0105gaj\u0105c r\u00f3\u017cne poziomy izolacji zasob\u00f3w. Kontrastuje to z monolityczn\u0105 architektur\u0105 Kafki, kt\u00f3ra \u015bci\u015ble \u0142\u0105czy moc obliczeniow\u0105 z przechowywaniem, wymagaj\u0105c wsp\u00f3lnego skalowania zasob\u00f3w.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"377\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-1024x377.png\" alt=\"\" class=\"wp-image-17075\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-1024x377.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-300x110.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-768x283.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-1536x566.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-2048x754.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/jack-vanlightly.com\/sketches\/2018\/10\/2\/kafka-vs-pulsar-rebalancing-sketch\">Obrazek jeszcze z 2018 roku<\/a>, ale rewolucja si\u0119 od tamtej pory nie wydarzy\u0142a w temacie<\/figcaption><\/figure><\/div>\n\n\n<p><strong><a href=\"https:\/\/github.com\/spring-projects\/spring-pulsar\/releases\/tag\/v1.0.0\">Spring for Apache Pulsar 1.0.0<\/a><\/strong> to integracja u\u0142atwiaj\u0105ca tworzenie aplikacji opartych o Apache Pulsar. G\u0142\u00f3wn\u0105 zale\u017cno\u015bci\u0105 jest modu\u0142 <code>spring-pulsar-spring-boot-starter<\/code>, kt\u00f3ry upraszcza proces konfiguracji i rozwijania aplikacji. Integracja ta zapewnia automatyczn\u0105 konfiguracj\u0119 wa\u017cnych komponent\u00f3w, takich jak <code>PulsarClient<\/code>, kt\u00f3ry jest wykorzystywany zar\u00f3wno przez producent\u00f3w, jak i konsument\u00f3w wiadomo\u015bci. Umo\u017cliwia tak\u017ce wygodn\u0105 produkcj\u0119 i konsumpcj\u0119 wiadomo\u015bci za pomoc\u0105 <code>PulsarTemplate<\/code> oraz \u0142atwe subskrybowanie i reagowanie na wiadomo\u015bci z wykorzystaniem adnotacji <code>@PulsarListener<\/code>. Dodatkowo, integracja ta oferuje wsparcie dla TLS i r\u00f3\u017cnych mechanizm\u00f3w autentykacji.<\/p>\n\n\n\n<p>Przy okazji wspomn\u0119 te\u017c o <a href=\"https:\/\/docs.spring.io\/spring-integration\/reference\/whats-new.html#whats-new\">Spring Integration 6.2<\/a>. W nim jak zwykle bardzo du\u017co, ale nic co jako\u015b odmieni\u0142oby czyje\u015b \u017cycie. Je\u015bli jednak u\u017cywacie Kafki, MongoDB czy Debezium &#8211; warto zerkn\u0105\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Security 6.2 i Spring Session 3.2.0<\/h3>\n\n\n\n<p>Najwa\u017cniejsze zmiany w <a href=\"https:\/\/docs.spring.io\/spring-security\/reference\/whats-new.html\">Spring Security 6.2<\/a> obejmuj\u0105 automatyczne w\u0142\u0105czanie <code>.cors()<\/code> w wypadku obecno\u015bci bean <code>CorsConfigurationSource<\/code>, a tak\u017ce u\u0142atwienie tworzenia wszelakich konfiguracji: now\u0105 metod\u0119 <code>AbstractConfiguredSecurityBuilder.with(\u2026\u200b)<\/code>, oraz uproszczenie konfiguracji komponentu klienta OAuth2. Ponadto, dodano wsparcie dla wylogowania OIDC Back-channel, usprawnienia propagacji <code>SecurityContext<\/code>, konfigurowalne <code>RedirectStrategy<\/code> i parsowanie \u017c\u0105da\u0144 HTTP Basic..<\/p>\n\n\n\n<p>Z kolei <a href=\"https:\/\/spring.io\/blog\/2023\/11\/21\/spring-session-3-2-goes-ga\">Spring Session 3.2.0<\/a> (kt\u00f3re w mojej g\u0142owie zawsze by\u0142o bardzo blisko spi\u0119te z security) skupia si\u0119 na dw\u00f3ch kluczowych ulepszeniach. Pierwszym jest wprowadzenie <code>SessionIdGenerator<\/code>, umo\u017cliwiaj\u0105cego generowanie niestandardowych identyfikator\u00f3w sesji. Drugie to znacz\u0105ce ulepszenie mo\u017cliwo\u015b\u0107 bezpiecznej deserializacji sesji Redis.<\/p>\n\n\n\n<p>Pojawi\u0142 si\u0119 te\u017c Spring Authorization Server 1.2, ale w jego wypadku prawie wszystkie zmiany to patchnotes wi\u0119c troch\u0119 \ud83e\udd37.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Towarzysz\u0105cych wyda\u0144 jest wi\u0119cej, ja skupi\u0142em si\u0119 na tych z mojej perspektywy najbardziej interesuj\u0105cych. Chyba moim ulubionym sposobem na \u015bledzenie nowych wyda\u0144 jest <a href=\"https:\/\/calendar.spring.io\/\">Kalendarzu Springowym<\/a>, kt\u00f3ry i Wam polecam.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"638\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-23-1024x638.png\" alt=\"\" class=\"wp-image-17069\" style=\"width:618px;height:auto\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-23-1024x638.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-23-300x187.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-23-768x478.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-23.png 1399w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>Dwa tygodnie temu mieli\u015bmy Spring Framework 6.1.0, w dniu dzisiejszym za\u015b na produkcje trafi\u0142 Spring Boot 3.2.0, dlatego calutk\u0105 now\u0105 edycje po\u015bwi\u0119cimy na nowo\u015bci w ekosystemie Springa &#8211; bo tych jest ca\u0142kiem sporo, a niekt\u00f3re z nich s\u0105 szczeg\u00f3lne istotne.<\/p>\n","protected":false},"author":10,"featured_media":17079,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259,1],"tags":[],"class_list":["post-17050","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl","category-no-category"],"acf":{"estimated_reading_time":"11","feature_image_blog":false,"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.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>Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski - JVM Weekly vol. 154 - 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\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski - JVM Weekly vol. 154 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dwa tygodnie temu mieli\u015bmy Spring Framework 6.1.0, w dniu dzisiejszym za\u015b na produkcje trafi\u0142 Spring Boot 3.2.0, dlatego calutk\u0105 now\u0105 edycje po\u015bwi\u0119cimy na nowo\u015bci w ekosystemie Springa - bo tych jest ca\u0142kiem sporo, a niekt\u00f3re z nich s\u0105 szczeg\u00f3lne istotne.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-23T07:27:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-24T06:03:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.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\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski &#8211; JVM Weekly vol. 154\",\"datePublished\":\"2023-11-23T07:27:54+00:00\",\"dateModified\":\"2023-11-24T06:03:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\"},\"wordCount\":2269,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png\",\"articleSection\":[\"JVM\",\"No category\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\",\"url\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\",\"name\":\"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski - JVM Weekly vol. 154 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png\",\"datePublished\":\"2023-11-23T07:27:54+00:00\",\"dateModified\":\"2023-11-24T06:03:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski &#8211; JVM Weekly vol. 154\"}]},{\"@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":"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski - JVM Weekly vol. 154 - 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\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/","og_locale":"pl_PL","og_type":"article","og_title":"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski - JVM Weekly vol. 154 - Vived","og_description":"Dwa tygodnie temu mieli\u015bmy Spring Framework 6.1.0, w dniu dzisiejszym za\u015b na produkcje trafi\u0142 Spring Boot 3.2.0, dlatego calutk\u0105 now\u0105 edycje po\u015bwi\u0119cimy na nowo\u015bci w ekosystemie Springa - bo tych jest ca\u0142kiem sporo, a niekt\u00f3re z nich s\u0105 szczeg\u00f3lne istotne.","og_url":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/","og_site_name":"Vived","article_published_time":"2023-11-23T07:27:54+00:00","article_modified_time":"2023-11-24T06:03:31+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.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\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski &#8211; JVM Weekly vol. 154","datePublished":"2023-11-23T07:27:54+00:00","dateModified":"2023-11-24T06:03:31+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/"},"wordCount":2269,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png","articleSection":["JVM","No category"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/","url":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/","name":"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski - JVM Weekly vol. 154 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png","datePublished":"2023-11-23T07:27:54+00:00","dateModified":"2023-11-24T06:03:31+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JVM-Weekly-1200x628_V2.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/spring-framework-6-1-i-spring-boot-3-2-najsmakowitsze-kaski-jvm-weekly-vol-154\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Spring Framework 6.1 i Spring Boot 3.2: najsmakowitsze k\u0105ski &#8211; JVM Weekly vol. 154"}]},{"@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\/paragraph","attrs":{"align":"left"},"innerBlocks":[],"innerHTML":"\n<p class=\"has-text-align-left\">Spring bowiem postanowi\u0142 bowiem dogoni\u0107 reszt\u0119 ekosystemu i wprowadzi\u0142 wsparcie dla dw\u00f3ch bardzo istotnych nowo\u015bci z punktu widzenia wysokowydajnych aplikacji: Wirtualnych W\u0105tk\u00f3w oraz Projektu CRAC.<\/p>\n","innerContent":["\n<p class=\"has-text-align-left\">Spring bowiem postanowi\u0142 bowiem dogoni\u0107 reszt\u0119 ekosystemu i wprowadzi\u0142 wsparcie dla dw\u00f3ch bardzo istotnych nowo\u015bci z punktu widzenia wysokowydajnych aplikacji: Wirtualnych W\u0105tk\u00f3w oraz Projektu CRAC.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Virtual Threads<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Virtual Threads<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dobra, jako \u017ce pewnie na ten tekst trafi\u0105 ludzie, kt\u00f3rzy programuj\u0105 w Springu, wi\u0119c z za\u0142o\u017cenia mogli jeszcze nie zapozna\u0107 si\u0119 jeszcze z konceptem Wirtualnych W\u0105tk\u00f3w (bo takowych w ekosystemie za bardzo jeszcze nie by\u0142o), bardzo kr\u00f3tkie wprowadzenie do tematu.<\/p>\n","innerContent":["\n<p>Dobra, jako \u017ce pewnie na ten tekst trafi\u0105 ludzie, kt\u00f3rzy programuj\u0105 w Springu, wi\u0119c z za\u0142o\u017cenia mogli jeszcze nie zapozna\u0107 si\u0119 jeszcze z konceptem Wirtualnych W\u0105tk\u00f3w (bo takowych w ekosystemie za bardzo jeszcze nie by\u0142o), bardzo kr\u00f3tkie wprowadzenie do tematu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wirtualne W\u0105tki, wprowadzone w JDK 21 w ramach Projektu Loom, mieszaj\u0105 w podej\u015bciu Javy do wsp\u00f3\u0142bie\u017cno\u015bci. W przeciwie\u0144stwie do tradycyjnych w\u0105tk\u00f3w, kt\u00f3re s\u0105 bezpo\u015brednio zarz\u0105dzane przez system operacyjny i s\u0105 stosunkowo ci\u0119\u017ckie (gdzie to s\u0142owo rozumiem tutaj jako \"generyczne\", w\u0105tki wirtualne s\u0105 lekkie i zarz\u0105dzane przez JVM. Pozwala to na tworzenie du\u017cej liczby w\u0105tk\u00f3w bez narzutu, kt\u00f3re zwykle wi\u0105\u017ce si\u0119 z tradycyjnymi w\u0105tkami. Virtual Thready s\u0105 szczeg\u00f3lnie korzystne w aplikacjach intensywnie korzystaj\u0105cych z I\/O, umo\u017cliwiaj\u0105c im obs\u0142ug\u0119 wsp\u00f3\u0142bie\u017cno\u015bci przy zmniejszonym zu\u017cyciu pami\u0119ci, szczeg\u00f3lnie w scenariuszach zwi\u0105zanych z operacjami blokuj\u0105cymi. Oczywi\u015bcie to tylko wierzcho\u0142ek g\u00f3ry lodowej, wi\u0119c je\u015bli chcecie o Wirtualnych W\u0105tkach dowiedzie\u0107 si\u0119 wi\u0119cej, idealnym miejscem b\u0119dzie, jak sama nazwa wskazuje, <a href=\"https:\/\/blog.rockthejvm.com\/ultimate-guide-to-java-virtual-threads\/\">The Ultimate Guide to Java Virtual Threads<\/a>, gdzie zamiast jednego akapitu jak tutaj macie po prostu godzin\u0119+ czytania. Bo z wirtualnymi w\u0105tkami jest jednak jak z t\u0105 legendarn\u0105 sow\u0105 - za\u0142o\u017cenia s\u0105 proste, interesuj\u0105co robi si\u0119 gdy trafiamy na szczeg\u00f3\u0142y.<\/p>\n","innerContent":["\n<p>Wirtualne W\u0105tki, wprowadzone w JDK 21 w ramach Projektu Loom, mieszaj\u0105 w podej\u015bciu Javy do wsp\u00f3\u0142bie\u017cno\u015bci. W przeciwie\u0144stwie do tradycyjnych w\u0105tk\u00f3w, kt\u00f3re s\u0105 bezpo\u015brednio zarz\u0105dzane przez system operacyjny i s\u0105 stosunkowo ci\u0119\u017ckie (gdzie to s\u0142owo rozumiem tutaj jako \"generyczne\", w\u0105tki wirtualne s\u0105 lekkie i zarz\u0105dzane przez JVM. Pozwala to na tworzenie du\u017cej liczby w\u0105tk\u00f3w bez narzutu, kt\u00f3re zwykle wi\u0105\u017ce si\u0119 z tradycyjnymi w\u0105tkami. Virtual Thready s\u0105 szczeg\u00f3lnie korzystne w aplikacjach intensywnie korzystaj\u0105cych z I\/O, umo\u017cliwiaj\u0105c im obs\u0142ug\u0119 wsp\u00f3\u0142bie\u017cno\u015bci przy zmniejszonym zu\u017cyciu pami\u0119ci, szczeg\u00f3lnie w scenariuszach zwi\u0105zanych z operacjami blokuj\u0105cymi. Oczywi\u015bcie to tylko wierzcho\u0142ek g\u00f3ry lodowej, wi\u0119c je\u015bli chcecie o Wirtualnych W\u0105tkach dowiedzie\u0107 si\u0119 wi\u0119cej, idealnym miejscem b\u0119dzie, jak sama nazwa wskazuje, <a href=\"https:\/\/blog.rockthejvm.com\/ultimate-guide-to-java-virtual-threads\/\">The Ultimate Guide to Java Virtual Threads<\/a>, gdzie zamiast jednego akapitu jak tutaj macie po prostu godzin\u0119+ czytania. Bo z wirtualnymi w\u0105tkami jest jednak jak z t\u0105 legendarn\u0105 sow\u0105 - za\u0142o\u017cenia s\u0105 proste, interesuj\u0105co robi si\u0119 gdy trafiamy na szczeg\u00f3\u0142y.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17058,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-19.png\" alt=\"\" class=\"wp-image-17058\"\/><figcaption class=\"wp-element-caption\">Chocia\u017c akurat ten mem to si\u0119 mocno zestarza\u0142 na naszych oczach<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-19.png\" alt=\"\" class=\"wp-image-17058\"\/><figcaption class=\"wp-element-caption\">Chocia\u017c akurat ten mem to si\u0119 mocno zestarza\u0142 na naszych oczach<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Spring eksperymentowa\u0142 z tymi w\u0105tkami ju\u017c dawno, kiedy znanymi jako Fibers (kurcze, stary jestem, <a href=\"https:\/\/www.slideshare.net\/ArturSkowroski\/to-be-continued-multithreading-with-project-loom-and-kotlins-coroutines\">jeszcze w 2018 mia\u0142em o nich talka<\/a>). Zamiast jednak rzuci\u0107 si\u0119 na ca\u0142o\u015b\u0107 jak sroka na b\u0142yskotki, podej\u015bcie Springa obejmuje bardziej ewolucyjn\u0105 rewizj\u0119 modeli wsp\u00f3\u0142bie\u017cno\u015bci w frameworku, tak aby wykorzysta\u0107 wirtualne w\u0105tki bez wywracania API do g\u00f3ry nogami.<\/p>\n","innerContent":["\n<p>Spring eksperymentowa\u0142 z tymi w\u0105tkami ju\u017c dawno, kiedy znanymi jako Fibers (kurcze, stary jestem, <a href=\"https:\/\/www.slideshare.net\/ArturSkowroski\/to-be-continued-multithreading-with-project-loom-and-kotlins-coroutines\">jeszcze w 2018 mia\u0142em o nich talka<\/a>). Zamiast jednak rzuci\u0107 si\u0119 na ca\u0142o\u015b\u0107 jak sroka na b\u0142yskotki, podej\u015bcie Springa obejmuje bardziej ewolucyjn\u0105 rewizj\u0119 modeli wsp\u00f3\u0142bie\u017cno\u015bci w frameworku, tak aby wykorzysta\u0107 wirtualne w\u0105tki bez wywracania API do g\u00f3ry nogami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wsparcie w Springu jest wi\u0119c warunkowe i zale\u017cy od dw\u00f3ch czynnik\u00f3w: uruchomienia aplikacji z u\u017cyciem JDK 21 oraz w\u0142\u0105czenia opcji konfiguracyjnej <code>spring.threads.virtual.enabled<\/code>. Wtedy to zar\u00f3wno serwery Tomcat, jak i Jetty w Spring Boot u\u017cywaj\u0105 w\u0105tk\u00f3w wirtualnych do przetwarzania zapyta\u0144. Oznacza to, \u017ce kod aplikacji, jak cho\u0107by metody kontroler\u00f3w obs\u0142uguj\u0105ce requesty sieciowe, b\u0119dzie dzia\u0142a\u0142 na w\u0105tkach wirtualnych, oferuj\u0105c potencjalne lepsz\u0105 w wydajno\u015bci aplikacji (aczkolwiek osobi\u015bcie sugeruje sprawdzi\u0107 to bardziej empirycznie, ka\u017cda aplikacja mo\u017ce mie\u0107 nieco inne bootlenecki).<\/p>\n","innerContent":["\n<p>Wsparcie w Springu jest wi\u0119c warunkowe i zale\u017cy od dw\u00f3ch czynnik\u00f3w: uruchomienia aplikacji z u\u017cyciem JDK 21 oraz w\u0142\u0105czenia opcji konfiguracyjnej <code>spring.threads.virtual.enabled<\/code>. Wtedy to zar\u00f3wno serwery Tomcat, jak i Jetty w Spring Boot u\u017cywaj\u0105 w\u0105tk\u00f3w wirtualnych do przetwarzania zapyta\u0144. Oznacza to, \u017ce kod aplikacji, jak cho\u0107by metody kontroler\u00f3w obs\u0142uguj\u0105ce requesty sieciowe, b\u0119dzie dzia\u0142a\u0142 na w\u0105tkach wirtualnych, oferuj\u0105c potencjalne lepsz\u0105 w wydajno\u015bci aplikacji (aczkolwiek osobi\u015bcie sugeruje sprawdzi\u0107 to bardziej empirycznie, ka\u017cda aplikacja mo\u017ce mie\u0107 nieco inne bootlenecki).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jednak nie koniec: integracja w\u0105tk\u00f3w wirtualnych w Spring obejmuje te\u017c troch\u0119 dodatkowych atrakcji. Powsta\u0142 dedykowany a dedicated <code>VirtualThreadTaskExecutor<\/code>, a gdy w\u0105tki wirtualne s\u0105 w\u0142\u0105czone, zar\u00f3wno <code>SimpleAsyncTaskExecutor<\/code> jak i <code>SimpleAsyncTaskScheduler<\/code> skonfigurowane zostaj\u0105 domy\u015blnie do ich u\u017cycia. Afektuje to sporo zachowa\u0144 Springa, w tym metod u\u017cycia metod <code>@EnableAsync<\/code>, asynchronicznego przetwarzania \u017c\u0105da\u0144 w Spring MVC oraz wsparcia dla blokuj\u0105cego wykonania w Spring WebFlux. Wp\u0142ywa to te\u017c na dzia\u0142anie poszczeg\u00f3lnych integracji, takich jak listenery dla RabbitMQ czy Kafki, Spring Data Redis oraz Apache Pulsar (o kt\u00f3rym za chwil\u0119). Przyznam, \u017ce z mojej strony brakuje mi troch\u0119 wi\u0119kszej granularno\u015bci i mo\u017cliwo\u015bci wyboru, w kt\u00f3rych miejscach realnie chcemy Wirtualnych W\u0105tk\u00f3w u\u017cywa\u0107 - u\u0142atwi\u0142oby to z pewno\u015bci\u0105 migracje wi\u0119kszych projekt\u00f3w. C\u00f3\u017c, mo\u017ce w kolejnych edycjach.<\/p>\n","innerContent":["\n<p>To jednak nie koniec: integracja w\u0105tk\u00f3w wirtualnych w Spring obejmuje te\u017c troch\u0119 dodatkowych atrakcji. Powsta\u0142 dedykowany a dedicated <code>VirtualThreadTaskExecutor<\/code>, a gdy w\u0105tki wirtualne s\u0105 w\u0142\u0105czone, zar\u00f3wno <code>SimpleAsyncTaskExecutor<\/code> jak i <code>SimpleAsyncTaskScheduler<\/code> skonfigurowane zostaj\u0105 domy\u015blnie do ich u\u017cycia. Afektuje to sporo zachowa\u0144 Springa, w tym metod u\u017cycia metod <code>@EnableAsync<\/code>, asynchronicznego przetwarzania \u017c\u0105da\u0144 w Spring MVC oraz wsparcia dla blokuj\u0105cego wykonania w Spring WebFlux. Wp\u0142ywa to te\u017c na dzia\u0142anie poszczeg\u00f3lnych integracji, takich jak listenery dla RabbitMQ czy Kafki, Spring Data Redis oraz Apache Pulsar (o kt\u00f3rym za chwil\u0119). Przyznam, \u017ce z mojej strony brakuje mi troch\u0119 wi\u0119kszej granularno\u015bci i mo\u017cliwo\u015bci wyboru, w kt\u00f3rych miejscach realnie chcemy Wirtualnych W\u0105tk\u00f3w u\u017cywa\u0107 - u\u0142atwi\u0142oby to z pewno\u015bci\u0105 migracje wi\u0119kszych projekt\u00f3w. C\u00f3\u017c, mo\u017ce w kolejnych edycjach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sam Spring na razie nie opublikowa\u0142 konkretniejszych analiz wp\u0142ywu Virtual Thread\u00f3w na aplikacje webowe, ale jako \u017ce konkurencja ju\u017c ten temat rozgrzebywa\u0142a polecam \u015bwietn\u0105 <a href=\"https:\/\/quarkus.io\/blog\/virtual-thread-1\/#five-things-you-need-to-know-before-using-virtual-threads-for-everything\">seri\u0119 od Quarkusa<\/a> - implikacje i dobre praktyki powinny by\u0107 zbli\u017cone.<\/p>\n","innerContent":["\n<p>Sam Spring na razie nie opublikowa\u0142 konkretniejszych analiz wp\u0142ywu Virtual Thread\u00f3w na aplikacje webowe, ale jako \u017ce konkurencja ju\u017c ten temat rozgrzebywa\u0142a polecam \u015bwietn\u0105 <a href=\"https:\/\/quarkus.io\/blog\/virtual-thread-1\/#five-things-you-need-to-know-before-using-virtual-threads-for-everything\">seri\u0119 od Quarkusa<\/a> - implikacje i dobre praktyki powinny by\u0107 zbli\u017cone.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17060,"width":"591px","height":"auto","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\/2023\/11\/image-20-1024x815.png\" alt=\"\" class=\"wp-image-17060\" style=\"width:591px;height:auto\"\/><figcaption class=\"wp-element-caption\">Bo Spring to jest takie Apple \u015bwiata JVM - wprowadza technologie dopiero wtedy, jak ju\u017c si\u0119 mocno u konkurencji wygrzej\u0105.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-20-1024x815.png\" alt=\"\" class=\"wp-image-17060\" style=\"width:591px;height:auto\"\/><figcaption class=\"wp-element-caption\">Bo Spring to jest takie Apple \u015bwiata JVM - wprowadza technologie dopiero wtedy, jak ju\u017c si\u0119 mocno u konkurencji wygrzej\u0105.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Project CRAC<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Project CRAC<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zanim b\u0119dzie o drugiej wa\u017cnej nowo\u015bci, projekcie CRaC, najpierw musz\u0119 wspomnie\u0107 o tym czym jest tak zwany problem Zimnego Startu.<\/p>\n","innerContent":["\n<p>Zanim b\u0119dzie o drugiej wa\u017cnej nowo\u015bci, projekcie CRaC, najpierw musz\u0119 wspomnie\u0107 o tym czym jest tak zwany problem Zimnego Startu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Jak pewnie wiecie, \u017ce aplikacje napisane w Javie \u2013 zanim jeszcze b\u0119d\u0105 w stanie \u201eprzyjmowa\u0107\u201d ruch \u2013 zwykle potrzebuj\u0105 troch\u0119 czasu na rozruch. Cechuje to zar\u00f3wno klasyczne aplikacje serwerowe (kt\u00f3re do osi\u0105gni\u0119cia pe\u0142nej wydajno\u015bci wymagaj\u0105 procesu kompilacji JiT, odpalanej na bazie dynamicznej charakterystyki ruchu), jak i aplikacji Serverless (kt\u00f3re po prostu w sytuacjach brzegowych wymagaj\u0105 ca\u0142ej maszynerii pod spodem). <\/p>\n","innerContent":["\n<p>Jak pewnie wiecie, \u017ce aplikacje napisane w Javie \u2013 zanim jeszcze b\u0119d\u0105 w stanie \u201eprzyjmowa\u0107\u201d ruch \u2013 zwykle potrzebuj\u0105 troch\u0119 czasu na rozruch. Cechuje to zar\u00f3wno klasyczne aplikacje serwerowe (kt\u00f3re do osi\u0105gni\u0119cia pe\u0142nej wydajno\u015bci wymagaj\u0105 procesu kompilacji JiT, odpalanej na bazie dynamicznej charakterystyki ruchu), jak i aplikacji Serverless (kt\u00f3re po prostu w sytuacjach brzegowych wymagaj\u0105 ca\u0142ej maszynerii pod spodem). <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17063,"width":"555px","height":"auto","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\/2023\/11\/JUIsCzo.jpg\" alt=\"\" class=\"wp-image-17063\" style=\"width:555px;height:auto\"\/><figcaption class=\"wp-element-caption\">Cho\u0107 i na to chc\u0105cy znajdzie spos\u00f3b.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/JUIsCzo.jpg\" alt=\"\" class=\"wp-image-17063\" style=\"width:555px;height:auto\"\/><figcaption class=\"wp-element-caption\">Cho\u0107 i na to chc\u0105cy znajdzie spos\u00f3b.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Na szcz\u0119\u015bcie, istnieje kilka rozwi\u0105za\u0144 kt\u00f3re ten \"zimny start\" nam zredukuj\u0105 - taki GraalVM pozwala nam na tworzenie \"natywnych\" wersji aplikacji Java, ale istniej\u0105 te\u017c metody jak Fast Startup czy AppCDS s\u0142u\u017cy\u0142y do cache\u2019owania poszczeg\u00f3lnych fragment\u00f3w runtime JVM-a, aby nie trzeba by\u0142o ich inicjowa\u0107 od zera przy starcie. Co jednak, je\u015bli mogliby\u015bmy za ka\u017cdym razem odczytywa\u0107 rozgrzany, od\u0142o\u017cony na p\u00f3\u017aniej kod aplikacji, a mo\u017ce i kompletn\u0105 pami\u0119\u0107 ju\u017c z wczytanymi danymi, cho\u0107by dla modeli ML? By to osi\u0105gn\u0105\u0107, na naszym radarze powinno pojawi\u0107 si\u0119 mechanizm, CRIU.<\/p>\n","innerContent":["\n<p>Na szcz\u0119\u015bcie, istnieje kilka rozwi\u0105za\u0144 kt\u00f3re ten \"zimny start\" nam zredukuj\u0105 - taki GraalVM pozwala nam na tworzenie \"natywnych\" wersji aplikacji Java, ale istniej\u0105 te\u017c metody jak Fast Startup czy AppCDS s\u0142u\u017cy\u0142y do cache\u2019owania poszczeg\u00f3lnych fragment\u00f3w runtime JVM-a, aby nie trzeba by\u0142o ich inicjowa\u0107 od zera przy starcie. Co jednak, je\u015bli mogliby\u015bmy za ka\u017cdym razem odczytywa\u0107 rozgrzany, od\u0142o\u017cony na p\u00f3\u017aniej kod aplikacji, a mo\u017ce i kompletn\u0105 pami\u0119\u0107 ju\u017c z wczytanymi danymi, cho\u0107by dla modeli ML? By to osi\u0105gn\u0105\u0107, na naszym radarze powinno pojawi\u0107 si\u0119 mechanizm, CRIU.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Checkpoint\/Restore in Userspace (CRIU) to funkcja Linuxa, kt\u00f3ra umo\u017cliwia wykonanie \u201ezrzutu\u201d na dysk ca\u0142ego dzia\u0142aj\u0105cego procesu aplikacji. Nast\u0119pnie, kolejna instancja mo\u017ce by\u0107 uruchomiona z tego punktu, w kt\u00f3rym wykonano wspomniany zrzut, co skraca czas rozruchu.<\/p>\n","innerContent":["\n<p>Checkpoint\/Restore in Userspace (CRIU) to funkcja Linuxa, kt\u00f3ra umo\u017cliwia wykonanie \u201ezrzutu\u201d na dysk ca\u0142ego dzia\u0142aj\u0105cego procesu aplikacji. Nast\u0119pnie, kolejna instancja mo\u017ce by\u0107 uruchomiona z tego punktu, w kt\u00f3rym wykonano wspomniany zrzut, co skraca czas rozruchu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach. Metody takie jak AppCDS przypominaj\u0105 klasyczne zapisywanie \u2013 wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje \u2013 jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk (co w wypadku starych konsol mo\u017ce by\u0107 np. zawrotnym 1Mb) i potem sobie odtwarzamy 1:1 gdy jest to potrzebne.<\/p>\n","innerContent":["\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach. Metody takie jak AppCDS przypominaj\u0105 klasyczne zapisywanie \u2013 wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje \u2013 jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk (co w wypadku starych konsol mo\u017ce by\u0107 np. zawrotnym 1Mb) i potem sobie odtwarzamy 1:1 gdy jest to potrzebne.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17065,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-21.png\" alt=\"\" class=\"wp-image-17065\"\/><figcaption class=\"wp-element-caption\">Tak dzia\u0142a r\u00f3wnie\u017c w\u0142a\u015bnie CRIU.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-21.png\" alt=\"\" class=\"wp-image-17065\"\/><figcaption class=\"wp-element-caption\">Tak dzia\u0142a r\u00f3wnie\u017c w\u0142a\u015bnie CRIU.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>CRIU posiada swoje problemy \u2013 zar\u00f3wno z punktu widzenia bezpiecze\u0144stwa, jak i wygody u\u017cytkowania \u2013 m\u00f3wimy tutaj bowiem o generycznej funkcji systemu operacyjnego, znajduj\u0105cej si\u0119 poza JVM. Ka\u017cda aplikacja ma za\u015b nieco inn\u0105 charakterystyk\u0119 i w zale\u017cno\u015bci od tego, czy m\u00f3wimy o serwerze aplikacyjnym, aplikacji webowej czy batchowym jobie zapis na dysk powinien odbywa\u0107 si\u0119 w innym momencie, kt\u00f3ry mo\u017ce by\u0107 trudny do wychwycenia bez kontekstu maszyny wirtualnej. Jak pisze OpenLiberty w swoim tek\u015bcie <a href=\"https:\/\/openliberty.io\/blog\/2020\/02\/12\/faster-startup-Java-applications-criu.html\">Faster start-up for Java applications on Open Liberty with CRIU<\/a>:<\/p>\n","innerContent":["\n<p>CRIU posiada swoje problemy \u2013 zar\u00f3wno z punktu widzenia bezpiecze\u0144stwa, jak i wygody u\u017cytkowania \u2013 m\u00f3wimy tutaj bowiem o generycznej funkcji systemu operacyjnego, znajduj\u0105cej si\u0119 poza JVM. Ka\u017cda aplikacja ma za\u015b nieco inn\u0105 charakterystyk\u0119 i w zale\u017cno\u015bci od tego, czy m\u00f3wimy o serwerze aplikacyjnym, aplikacji webowej czy batchowym jobie zapis na dysk powinien odbywa\u0107 si\u0119 w innym momencie, kt\u00f3ry mo\u017ce by\u0107 trudny do wychwycenia bez kontekstu maszyny wirtualnej. Jak pisze OpenLiberty w swoim tek\u015bcie <a href=\"https:\/\/openliberty.io\/blog\/2020\/02\/12\/faster-startup-Java-applications-criu.html\">Faster start-up for Java applications on Open Liberty with CRIU<\/a>:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/quote","attrs":[],"innerBlocks":[{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>It would be useful to have an API so that the application can specify when it would like a snapshot to be taken; this would be a valuable addition to the Java specification.<\/p>\n","innerContent":["\n<p>It would be useful to have an API so that the application can specify when it would like a snapshot to be taken; this would be a valuable addition to the Java specification.<\/p>\n"]}],"innerHTML":"\n<blockquote class=\"wp-block-quote\"><\/blockquote>\n","innerContent":["\n<blockquote class=\"wp-block-quote\">",null,"<\/blockquote>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>OpenLiberty od tamtem pory dorobi\u0142o si\u0119 w\u0142asnego mechanizmu u\u017cywaj\u0105cego CRIU.<\/p>\n","innerContent":["\n<p>OpenLiberty od tamtem pory dorobi\u0142o si\u0119 w\u0142asnego mechanizmu u\u017cywaj\u0105cego CRIU.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/embed","attrs":{"url":"https:\/\/www.youtube.com\/watch?v=XXbJNaFF-8A","type":"video","providerNameSlug":"youtube","responsive":true,"className":"wp-embed-aspect-16-9 wp-has-aspect-ratio"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=XXbJNaFF-8A\n<\/div><figcaption class=\"wp-element-caption\">PS: Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o CRiU, Christine Flood z RedHata nagra\u0142a dog\u0142\u0119bnego talka CRIU and Java opportunities and challenges o kontek\u015bcie u\u017cycia tej technologii w Javie.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.youtube.com\/watch?v=XXbJNaFF-8A\n<\/div><figcaption class=\"wp-element-caption\">PS: Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o CRiU, Christine Flood z RedHata nagra\u0142a dog\u0142\u0119bnego talka CRIU and Java opportunities and challenges o kontek\u015bcie u\u017cycia tej technologii w Javie.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Spring zdecydowa\u0142 si\u0119 jednak na konkurencyjne rozwi\u0105zanie - i to najwy\u017cszy czas aby wreszcie przej\u015b\u0107 do CRaC.<\/p>\n","innerContent":["\n<p>Spring zdecydowa\u0142 si\u0119 jednak na konkurencyjne rozwi\u0105zanie - i to najwy\u017cszy czas aby wreszcie przej\u015b\u0107 do CRaC.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Project CRaC (Checkpoint\/Restore in Application Continuation) to tooling umo\u017cliwiaj\u0105cych u\u017cycie mechanizmu checkpoint\/restore z aplikacjami Java. Pozwala to na zapisanie stanu dzia\u0142aj\u0105cej JVM (checkpoint) i p\u00f3\u017aniejsze jego przywr\u00f3cenie, umo\u017cliwiaj\u0105c szybsze uruchomienie aplikacji poprzez omini\u0119cie pocz\u0105tkowego \u0142adowania i proces\u00f3w rozgrzewania. Stosunku do \"go\u0142ego\" CRIU wprowadza on odpowiednie hooki i usprawnienia usprawniaj\u0105ce u\u017cycie ca\u0142o\u015bci z JVM.<\/p>\n","innerContent":["\n<p>Project CRaC (Checkpoint\/Restore in Application Continuation) to tooling umo\u017cliwiaj\u0105cych u\u017cycie mechanizmu checkpoint\/restore z aplikacjami Java. Pozwala to na zapisanie stanu dzia\u0142aj\u0105cej JVM (checkpoint) i p\u00f3\u017aniejsze jego przywr\u00f3cenie, umo\u017cliwiaj\u0105c szybsze uruchomienie aplikacji poprzez omini\u0119cie pocz\u0105tkowego \u0142adowania i proces\u00f3w rozgrzewania. Stosunku do \"go\u0142ego\" CRIU wprowadza on odpowiednie hooki i usprawnienia usprawniaj\u0105ce u\u017cycie ca\u0142o\u015bci z JVM.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tak jak w wypadku Wirtualnych w\u0105tk\u00f3w, aby korzysta\u0107 z Integracja Spring Framework z Project CRaC, musz\u0105 by\u0107 spe\u0142nione pewne warunki: JVM z w\u0142\u0105czon\u0105 funkcj\u0105 checkpoint\/restore (obecnie opcja ta jest dost\u0119pna tylko na Linuxie, wspiera je cho\u0107by <a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">Azul<\/a> czy <a href=\"https:\/\/bell-sw.com\/libericajdk-with-crac\/\">Liberica<\/a>, cho\u0107 tylko ta ostatnia w wersji 21 umo\u017clwiaj\u0105cej r\u00f3wnoczesne u\u017cycie Wirtualnych W\u0105tk\u00f3w), do\u0142\u0105czenie biblioteki <code>org.crac:crac<\/code> (wersja 1.4.0 lub wy\u017csza) do classpath oraz okre\u015blenie specyficznych parametr\u00f3w linii polece\u0144, takich jak <code>-XX:CRaCCheckpointTo=PATH<\/code>. Proces checkpoint tworzy pliki, kt\u00f3re reprezentuj\u0105 pe\u0142ny stan pami\u0119ci JVM, w tym potencjalnie wra\u017cliwe dane, co wymaga starannego rozwa\u017cenia implikacji bezpiecze\u0144stwa. Ca\u0142o\u015b\u0107 wp\u0142ywa te\u017c na losowo\u015b\u0107 <code>java.util.Random<\/code>, kt\u00f3ry staje si\u0119 \"nieco\" mniej losowy, poniewa\u017c wszystkie procesy odpalane s\u0105 na tym samym seedzie.<\/p>\n","innerContent":["\n<p>Tak jak w wypadku Wirtualnych w\u0105tk\u00f3w, aby korzysta\u0107 z Integracja Spring Framework z Project CRaC, musz\u0105 by\u0107 spe\u0142nione pewne warunki: JVM z w\u0142\u0105czon\u0105 funkcj\u0105 checkpoint\/restore (obecnie opcja ta jest dost\u0119pna tylko na Linuxie, wspiera je cho\u0107by <a href=\"https:\/\/www.azul.com\/products\/components\/crac\/\">Azul<\/a> czy <a href=\"https:\/\/bell-sw.com\/libericajdk-with-crac\/\">Liberica<\/a>, cho\u0107 tylko ta ostatnia w wersji 21 umo\u017clwiaj\u0105cej r\u00f3wnoczesne u\u017cycie Wirtualnych W\u0105tk\u00f3w), do\u0142\u0105czenie biblioteki <code>org.crac:crac<\/code> (wersja 1.4.0 lub wy\u017csza) do classpath oraz okre\u015blenie specyficznych parametr\u00f3w linii polece\u0144, takich jak <code>-XX:CRaCCheckpointTo=PATH<\/code>. Proces checkpoint tworzy pliki, kt\u00f3re reprezentuj\u0105 pe\u0142ny stan pami\u0119ci JVM, w tym potencjalnie wra\u017cliwe dane, co wymaga starannego rozwa\u017cenia implikacji bezpiecze\u0144stwa. Ca\u0142o\u015b\u0107 wp\u0142ywa te\u017c na losowo\u015b\u0107 <code>java.util.Random<\/code>, kt\u00f3ry staje si\u0119 \"nieco\" mniej losowy, poniewa\u017c wszystkie procesy odpalane s\u0105 na tym samym seedzie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17067,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-22.png\" alt=\"\" class=\"wp-image-17067\"\/><figcaption class=\"wp-element-caption\">Ju\u017c widz\u0119 te przysz\u0142e pytania na StackOverflow - \"Dlaczego Spring zawsze generuje ten sam unikalny identyfikator\".<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-22.png\" alt=\"\" class=\"wp-image-17067\"\/><figcaption class=\"wp-element-caption\">Ju\u017c widz\u0119 te przysz\u0142e pytania na StackOverflow - \"Dlaczego Spring zawsze generuje ten sam unikalny identyfikator\".<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Integracja w Springu jest do\u015b\u0107 bogata, efektywnie bowiem wpina si\u0119 w naturalny cykl \u017cycia aplikacji. Checkpoint mo\u017cna wywo\u0142a\u0107 za pomoc\u0105 polecenia <code>jcmd application.jar JDK.checkpoint<\/code>, co skutkuje zatrzymaniem przez Spring wszystkich dzia\u0142aj\u0105cych bean\u00f3w i umo\u017cliwieniem im zamkni\u0119cia zasob\u00f3w. Po przywr\u00f3ceniu te same beany s\u0105 ponownie uruchamiane, otwieraj\u0105c zasoby tam, gdzie to odpowiednie. Poza jednak r\u0119cznym wywo\u0142aniem, kluczowa funkcja tej integracji to mo\u017cliwo\u015b\u0107 konfiguracji automatycznego uruchomienia checkpoint\/restore przy starcie aplikacji. Ustawienie w\u0142a\u015bciwo\u015bci systemu Java <code>-Dspring.context.checkpoint=onRefresh<\/code> powoduje automatyczne utworzenie checkpointu podczas startu na etapie <code>LifecycleProcessor.onRefresh<\/code>. W praktyce oznacza to, \u017ce wszystkie (nie leniwe) singletony s\u0105 ju\u017c zinstancjonowane, wywo\u0142ywane s\u0105 te\u017c callbacki <code>InitializingBean.afterPropertiesSet<\/code>, ale nie wyst\u0105pi\u0142y jeszcze metody <code>Lifecycle.start<\/code>, a <code>ContextRefreshedEvent<\/code> nie zosta\u0142 jeszcze opublikowany.<\/p>\n","innerContent":["\n<p>Integracja w Springu jest do\u015b\u0107 bogata, efektywnie bowiem wpina si\u0119 w naturalny cykl \u017cycia aplikacji. Checkpoint mo\u017cna wywo\u0142a\u0107 za pomoc\u0105 polecenia <code>jcmd application.jar JDK.checkpoint<\/code>, co skutkuje zatrzymaniem przez Spring wszystkich dzia\u0142aj\u0105cych bean\u00f3w i umo\u017cliwieniem im zamkni\u0119cia zasob\u00f3w. Po przywr\u00f3ceniu te same beany s\u0105 ponownie uruchamiane, otwieraj\u0105c zasoby tam, gdzie to odpowiednie. Poza jednak r\u0119cznym wywo\u0142aniem, kluczowa funkcja tej integracji to mo\u017cliwo\u015b\u0107 konfiguracji automatycznego uruchomienia checkpoint\/restore przy starcie aplikacji. Ustawienie w\u0142a\u015bciwo\u015bci systemu Java <code>-Dspring.context.checkpoint=onRefresh<\/code> powoduje automatyczne utworzenie checkpointu podczas startu na etapie <code>LifecycleProcessor.onRefresh<\/code>. W praktyce oznacza to, \u017ce wszystkie (nie leniwe) singletony s\u0105 ju\u017c zinstancjonowane, wywo\u0142ywane s\u0105 te\u017c callbacki <code>InitializingBean.afterPropertiesSet<\/code>, ale nie wyst\u0105pi\u0142y jeszcze metody <code>Lifecycle.start<\/code>, a <code>ContextRefreshedEvent<\/code> nie zosta\u0142 jeszcze opublikowany.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Co wi\u0119cej w nowym wydaniu?<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Co wi\u0119cej w nowym wydaniu?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Spring Framework 6.1<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Spring Framework 6.1<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Spring Framework 6.1 to na pewno szeroko rozumiana kompatybilno\u015b\u0107 z JDK 21. Nowa wersja wprowadzi\u0142a te\u017c troch\u0119 ulepsze\u0144 w kontek\u015bcie samego \"kontenera aplikacji\", szczeg\u00f3lnie w zakresie funkcji zarz\u0105dzania cyklem \u017cycia. Teraz integruje on w sobie funkcje takie jak mo\u017cliwo\u015b\u0107 wstrzymania i wznawiania zada\u0144 oraz lepsz\u0105 kontrol\u0119 nad zamykaniem zada\u0144 w <code>ThreadPoolTaskExecutor<\/code> i <code>ThreadPoolTaskScheduler<\/code>. Nowa wersja wprowadza r\u00f3wnie\u017c lepsze observability dla metod <code>@Scheduled<\/code> i lepsze \"fabryki\" do tworzenia walidator\u00f3w, a tak\u017ce wbudowane wsparcie walidacji metod dla parametr\u00f3w metod kontroler\u00f3w zar\u00f3wno w Spring MVC, jak i WebFlux. Eliminuje to potrzeb\u0119 stosowania adnotacji <code>@Validated<\/code> na poziomie klasy kontrolera. A jak ju\u017c przy anotacjach jeste\u015bmy, <code>@PropertySource<\/code> poszerza wsparcie symboli w wyra\u017ceniach SpEL (Spring Expression Language).<\/p>\n","innerContent":["\n<p>Spring Framework 6.1 to na pewno szeroko rozumiana kompatybilno\u015b\u0107 z JDK 21. Nowa wersja wprowadzi\u0142a te\u017c troch\u0119 ulepsze\u0144 w kontek\u015bcie samego \"kontenera aplikacji\", szczeg\u00f3lnie w zakresie funkcji zarz\u0105dzania cyklem \u017cycia. Teraz integruje on w sobie funkcje takie jak mo\u017cliwo\u015b\u0107 wstrzymania i wznawiania zada\u0144 oraz lepsz\u0105 kontrol\u0119 nad zamykaniem zada\u0144 w <code>ThreadPoolTaskExecutor<\/code> i <code>ThreadPoolTaskScheduler<\/code>. Nowa wersja wprowadza r\u00f3wnie\u017c lepsze observability dla metod <code>@Scheduled<\/code> i lepsze \"fabryki\" do tworzenia walidator\u00f3w, a tak\u017ce wbudowane wsparcie walidacji metod dla parametr\u00f3w metod kontroler\u00f3w zar\u00f3wno w Spring MVC, jak i WebFlux. Eliminuje to potrzeb\u0119 stosowania adnotacji <code>@Validated<\/code> na poziomie klasy kontrolera. A jak ju\u017c przy anotacjach jeste\u015bmy, <code>@PropertySource<\/code> poszerza wsparcie symboli w wyra\u017ceniach SpEL (Spring Expression Language).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wprowadzenie te\u017c RestClient, nowego synchronicznego klienta HTTP podobnego do WebClient, ale prekonfigurowanego i dopasowanego pod zapytania REST-owe. Interesuj\u0105co wygl\u0105daj\u0105 te\u017c zmiany w kontek\u015bcie dost\u0119pu do bazy danych - ciekawym aspektem wydanie jest bowiem wprowadzenie JdbcClient, zunifikowanej fasady dla JDBC. Co wi\u0119cej, nowych mo\u017cliwo\u015bci doczeka\u0142 si\u0119 te\u017c wsparcie dla R2DBC. List\u0119 zmian dotycz\u0105c\u0105 warstwy danych zamykaj\u0105 za\u015b usprawnienia cyklu \u017cycia aplikacji je\u015bli chodzi o transakcyjno\u015b\u0107.<\/p>\n","innerContent":["\n<p>Wprowadzenie te\u017c RestClient, nowego synchronicznego klienta HTTP podobnego do WebClient, ale prekonfigurowanego i dopasowanego pod zapytania REST-owe. Interesuj\u0105co wygl\u0105daj\u0105 te\u017c zmiany w kontek\u015bcie dost\u0119pu do bazy danych - ciekawym aspektem wydanie jest bowiem wprowadzenie JdbcClient, zunifikowanej fasady dla JDBC. Co wi\u0119cej, nowych mo\u017cliwo\u015bci doczeka\u0142 si\u0119 te\u017c wsparcie dla R2DBC. List\u0119 zmian dotycz\u0105c\u0105 warstwy danych zamykaj\u0105 za\u015b usprawnienia cyklu \u017cycia aplikacji je\u015bli chodzi o transakcyjno\u015b\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>List\u0119 wszystkich zmian <a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/wiki\/What's-New-in-Spring-Framework-6.x\">znajdziecie tutaj<\/a>.<\/p>\n","innerContent":["\n<p>List\u0119 wszystkich zmian <a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/wiki\/What's-New-in-Spring-Framework-6.x\">znajdziecie tutaj<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Spring Boot 3.2.0<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Spring Boot 3.2.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poza nowo\u015bciami z Spring Framework 6.1, <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/wiki\/Spring-Boot-3.2.0-Release-Notes\">Spring Boot 3.2.0<\/a> wprowadza te\u017c kilka nowych integracji i funkcji. W\u015br\u00f3d nich wyr\u00f3\u017cnia si\u0119 rozszerzone wsparcie dla Apache Pulsara (kt\u00f3rym zajmiemy si\u0119 ju\u017c za chwil\u0119). Wsparcie wspomnianych ju\u017c interfejsu <code>RestClient<\/code> z Spring Framework 6.1 zapewnia za\u015b programistom funkcjonalne, blokuj\u0105ce API HTTP. Pojawi\u0142o si\u0119 r\u00f3wnie\u017c wsparcie dla <code>JdbcClient<\/code>. Wa\u017cnym dodatkiem jest automatyczne logowanie Correlation Id podczas korzystania z Micrometera, co pewnie uchroni nie jednego programist\u0119 przed przykr\u0105 sytuacj\u0105 braku wystarczaj\u0105cej ilo\u015bci informacji w wypadku awarii. Wsparcie auto-configuration doczeka\u0142y si\u0119 te\u017c adnotacji z Micrometera: <code>@Timed<\/code>, <code>@Counted<\/code>, <code>@NewSpan<\/code>, <code>@ContinueSpan<\/code> i <code>@Observed<\/code>.<\/p>\n","innerContent":["\n<p>Poza nowo\u015bciami z Spring Framework 6.1, <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/wiki\/Spring-Boot-3.2.0-Release-Notes\">Spring Boot 3.2.0<\/a> wprowadza te\u017c kilka nowych integracji i funkcji. W\u015br\u00f3d nich wyr\u00f3\u017cnia si\u0119 rozszerzone wsparcie dla Apache Pulsara (kt\u00f3rym zajmiemy si\u0119 ju\u017c za chwil\u0119). Wsparcie wspomnianych ju\u017c interfejsu <code>RestClient<\/code> z Spring Framework 6.1 zapewnia za\u015b programistom funkcjonalne, blokuj\u0105ce API HTTP. Pojawi\u0142o si\u0119 r\u00f3wnie\u017c wsparcie dla <code>JdbcClient<\/code>. Wa\u017cnym dodatkiem jest automatyczne logowanie Correlation Id podczas korzystania z Micrometera, co pewnie uchroni nie jednego programist\u0119 przed przykr\u0105 sytuacj\u0105 braku wystarczaj\u0105cej ilo\u015bci informacji w wypadku awarii. Wsparcie auto-configuration doczeka\u0142y si\u0119 te\u017c adnotacji z Micrometera: <code>@Timed<\/code>, <code>@Counted<\/code>, <code>@NewSpan<\/code>, <code>@ContinueSpan<\/code> i <code>@Observed<\/code>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wersja 3.2.0 ulepsza budowanie obraz\u00f3w Docker w oparciu o standard <a href=\"https:\/\/buildpacks.io\/\">Cloud-Native Buildpacks<\/a> od Cloud Native Foundation, task do budowania Dockerowych obraz\u00f3w domy\u015blnie za\u015b u\u017cywaj\u0105 teraz konfiguracji z hosta.<\/p>\n","innerContent":["\n<p>Wersja 3.2.0 ulepsza budowanie obraz\u00f3w Docker w oparciu o standard <a href=\"https:\/\/buildpacks.io\/\">Cloud-Native Buildpacks<\/a> od Cloud Native Foundation, task do budowania Dockerowych obraz\u00f3w domy\u015blnie za\u015b u\u017cywaj\u0105 teraz konfiguracji z hosta.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Ponownie, mniejszych zmian jest znacznie wi\u0119cej, list\u0119 wszystkich <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/wiki\/Spring-Boot-3.2.0-Release-Notes\">znajdziecie tutaj<\/a>.<\/p>\n","innerContent":["\n<p>Ponownie, mniejszych zmian jest znacznie wi\u0119cej, list\u0119 wszystkich <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/wiki\/Spring-Boot-3.2.0-Release-Notes\">znajdziecie tutaj<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2 class=\"wp-block-heading\">Najciekawsze wydania towarzysz\u0105ce<\/h2>\n","innerContent":["\n<h2 class=\"wp-block-heading\">Najciekawsze wydania towarzysz\u0105ce<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Spring dla Apache Pulsar<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Spring dla Apache Pulsar<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong>Apache Pulsar<\/strong> to konkurent Kafki, kt\u00f3ry zosta\u0142 oparty o architektur\u0105, kt\u00f3ra oddziela przestrze\u0144 do przechowywania danych od mocy obliczeniowej. Umo\u017cliwiaj\u0105c to elastyczne skalowanie tych cz\u0119\u015bci niezale\u017cnie, osi\u0105gaj\u0105c r\u00f3\u017cne poziomy izolacji zasob\u00f3w. Kontrastuje to z monolityczn\u0105 architektur\u0105 Kafki, kt\u00f3ra \u015bci\u015ble \u0142\u0105czy moc obliczeniow\u0105 z przechowywaniem, wymagaj\u0105c wsp\u00f3lnego skalowania zasob\u00f3w.<\/p>\n","innerContent":["\n<p><strong>Apache Pulsar<\/strong> to konkurent Kafki, kt\u00f3ry zosta\u0142 oparty o architektur\u0105, kt\u00f3ra oddziela przestrze\u0144 do przechowywania danych od mocy obliczeniowej. Umo\u017cliwiaj\u0105c to elastyczne skalowanie tych cz\u0119\u015bci niezale\u017cnie, osi\u0105gaj\u0105c r\u00f3\u017cne poziomy izolacji zasob\u00f3w. Kontrastuje to z monolityczn\u0105 architektur\u0105 Kafki, kt\u00f3ra \u015bci\u015ble \u0142\u0105czy moc obliczeniow\u0105 z przechowywaniem, wymagaj\u0105c wsp\u00f3lnego skalowania zasob\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17075,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-1024x377.png\" alt=\"\" class=\"wp-image-17075\"\/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/jack-vanlightly.com\/sketches\/2018\/10\/2\/kafka-vs-pulsar-rebalancing-sketch\">Obrazek jeszcze z 2018 roku<\/a>, ale rewolucja si\u0119 od tamtej pory nie wydarzy\u0142a w temacie<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/Group-764-1024x377.png\" alt=\"\" class=\"wp-image-17075\"\/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/jack-vanlightly.com\/sketches\/2018\/10\/2\/kafka-vs-pulsar-rebalancing-sketch\">Obrazek jeszcze z 2018 roku<\/a>, ale rewolucja si\u0119 od tamtej pory nie wydarzy\u0142a w temacie<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><strong><a href=\"https:\/\/github.com\/spring-projects\/spring-pulsar\/releases\/tag\/v1.0.0\">Spring for Apache Pulsar 1.0.0<\/a><\/strong> to integracja u\u0142atwiaj\u0105ca tworzenie aplikacji opartych o Apache Pulsar. G\u0142\u00f3wn\u0105 zale\u017cno\u015bci\u0105 jest modu\u0142 <code>spring-pulsar-spring-boot-starter<\/code>, kt\u00f3ry upraszcza proces konfiguracji i rozwijania aplikacji. Integracja ta zapewnia automatyczn\u0105 konfiguracj\u0119 wa\u017cnych komponent\u00f3w, takich jak <code>PulsarClient<\/code>, kt\u00f3ry jest wykorzystywany zar\u00f3wno przez producent\u00f3w, jak i konsument\u00f3w wiadomo\u015bci. Umo\u017cliwia tak\u017ce wygodn\u0105 produkcj\u0119 i konsumpcj\u0119 wiadomo\u015bci za pomoc\u0105 <code>PulsarTemplate<\/code> oraz \u0142atwe subskrybowanie i reagowanie na wiadomo\u015bci z wykorzystaniem adnotacji <code>@PulsarListener<\/code>. Dodatkowo, integracja ta oferuje wsparcie dla TLS i r\u00f3\u017cnych mechanizm\u00f3w autentykacji.<\/p>\n","innerContent":["\n<p><strong><a href=\"https:\/\/github.com\/spring-projects\/spring-pulsar\/releases\/tag\/v1.0.0\">Spring for Apache Pulsar 1.0.0<\/a><\/strong> to integracja u\u0142atwiaj\u0105ca tworzenie aplikacji opartych o Apache Pulsar. G\u0142\u00f3wn\u0105 zale\u017cno\u015bci\u0105 jest modu\u0142 <code>spring-pulsar-spring-boot-starter<\/code>, kt\u00f3ry upraszcza proces konfiguracji i rozwijania aplikacji. Integracja ta zapewnia automatyczn\u0105 konfiguracj\u0119 wa\u017cnych komponent\u00f3w, takich jak <code>PulsarClient<\/code>, kt\u00f3ry jest wykorzystywany zar\u00f3wno przez producent\u00f3w, jak i konsument\u00f3w wiadomo\u015bci. Umo\u017cliwia tak\u017ce wygodn\u0105 produkcj\u0119 i konsumpcj\u0119 wiadomo\u015bci za pomoc\u0105 <code>PulsarTemplate<\/code> oraz \u0142atwe subskrybowanie i reagowanie na wiadomo\u015bci z wykorzystaniem adnotacji <code>@PulsarListener<\/code>. Dodatkowo, integracja ta oferuje wsparcie dla TLS i r\u00f3\u017cnych mechanizm\u00f3w autentykacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Przy okazji wspomn\u0119 te\u017c o <a href=\"https:\/\/docs.spring.io\/spring-integration\/reference\/whats-new.html#whats-new\">Spring Integration 6.2<\/a>. W nim jak zwykle bardzo du\u017co, ale nic co jako\u015b odmieni\u0142oby czyje\u015b \u017cycie. Je\u015bli jednak u\u017cywacie Kafki, MongoDB czy Debezium - warto zerkn\u0105\u0107.<\/p>\n","innerContent":["\n<p>Przy okazji wspomn\u0119 te\u017c o <a href=\"https:\/\/docs.spring.io\/spring-integration\/reference\/whats-new.html#whats-new\">Spring Integration 6.2<\/a>. W nim jak zwykle bardzo du\u017co, ale nic co jako\u015b odmieni\u0142oby czyje\u015b \u017cycie. Je\u015bli jednak u\u017cywacie Kafki, MongoDB czy Debezium - warto zerkn\u0105\u0107.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3 class=\"wp-block-heading\">Spring Security 6.2 i Spring Session 3.2.0<\/h3>\n","innerContent":["\n<h3 class=\"wp-block-heading\">Spring Security 6.2 i Spring Session 3.2.0<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najwa\u017cniejsze zmiany w <a href=\"https:\/\/docs.spring.io\/spring-security\/reference\/whats-new.html\">Spring Security 6.2<\/a> obejmuj\u0105 automatyczne w\u0142\u0105czanie <code>.cors()<\/code> w wypadku obecno\u015bci bean <code>CorsConfigurationSource<\/code>, a tak\u017ce u\u0142atwienie tworzenia wszelakich konfiguracji: now\u0105 metod\u0119 <code>AbstractConfiguredSecurityBuilder.with(\u2026\u200b)<\/code>, oraz uproszczenie konfiguracji komponentu klienta OAuth2. Ponadto, dodano wsparcie dla wylogowania OIDC Back-channel, usprawnienia propagacji <code>SecurityContext<\/code>, konfigurowalne <code>RedirectStrategy<\/code> i parsowanie \u017c\u0105da\u0144 HTTP Basic..<\/p>\n","innerContent":["\n<p>Najwa\u017cniejsze zmiany w <a href=\"https:\/\/docs.spring.io\/spring-security\/reference\/whats-new.html\">Spring Security 6.2<\/a> obejmuj\u0105 automatyczne w\u0142\u0105czanie <code>.cors()<\/code> w wypadku obecno\u015bci bean <code>CorsConfigurationSource<\/code>, a tak\u017ce u\u0142atwienie tworzenia wszelakich konfiguracji: now\u0105 metod\u0119 <code>AbstractConfiguredSecurityBuilder.with(\u2026\u200b)<\/code>, oraz uproszczenie konfiguracji komponentu klienta OAuth2. Ponadto, dodano wsparcie dla wylogowania OIDC Back-channel, usprawnienia propagacji <code>SecurityContext<\/code>, konfigurowalne <code>RedirectStrategy<\/code> i parsowanie \u017c\u0105da\u0144 HTTP Basic..<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Z kolei <a href=\"https:\/\/spring.io\/blog\/2023\/11\/21\/spring-session-3-2-goes-ga\">Spring Session 3.2.0<\/a> (kt\u00f3re w mojej g\u0142owie zawsze by\u0142o bardzo blisko spi\u0119te z security) skupia si\u0119 na dw\u00f3ch kluczowych ulepszeniach. Pierwszym jest wprowadzenie <code>SessionIdGenerator<\/code>, umo\u017cliwiaj\u0105cego generowanie niestandardowych identyfikator\u00f3w sesji. Drugie to znacz\u0105ce ulepszenie mo\u017cliwo\u015b\u0107 bezpiecznej deserializacji sesji Redis.<\/p>\n","innerContent":["\n<p>Z kolei <a href=\"https:\/\/spring.io\/blog\/2023\/11\/21\/spring-session-3-2-goes-ga\">Spring Session 3.2.0<\/a> (kt\u00f3re w mojej g\u0142owie zawsze by\u0142o bardzo blisko spi\u0119te z security) skupia si\u0119 na dw\u00f3ch kluczowych ulepszeniach. Pierwszym jest wprowadzenie <code>SessionIdGenerator<\/code>, umo\u017cliwiaj\u0105cego generowanie niestandardowych identyfikator\u00f3w sesji. Drugie to znacz\u0105ce ulepszenie mo\u017cliwo\u015b\u0107 bezpiecznej deserializacji sesji Redis.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pojawi\u0142 si\u0119 te\u017c Spring Authorization Server 1.2, ale w jego wypadku prawie wszystkie zmiany to patchnotes wi\u0119c troch\u0119 \ud83e\udd37.<\/p>\n","innerContent":["\n<p>Pojawi\u0142 si\u0119 te\u017c Spring Authorization Server 1.2, ale w jego wypadku prawie wszystkie zmiany to patchnotes wi\u0119c troch\u0119 \ud83e\udd37.<\/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>Towarzysz\u0105cych wyda\u0144 jest wi\u0119cej, ja skupi\u0142em si\u0119 na tych z mojej perspektywy najbardziej interesuj\u0105cych. Chyba moim ulubionym sposobem na \u015bledzenie nowych wyda\u0144 jest <a href=\"https:\/\/calendar.spring.io\/\">Kalendarzu Springowym<\/a>, kt\u00f3ry i Wam polecam.<\/p>\n","innerContent":["\n<p>Towarzysz\u0105cych wyda\u0144 jest wi\u0119cej, ja skupi\u0142em si\u0119 na tych z mojej perspektywy najbardziej interesuj\u0105cych. Chyba moim ulubionym sposobem na \u015bledzenie nowych wyda\u0144 jest <a href=\"https:\/\/calendar.spring.io\/\">Kalendarzu Springowym<\/a>, kt\u00f3ry i Wam polecam.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":17069,"width":"618px","height":"auto","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\/2023\/11\/image-23-1024x638.png\" alt=\"\" class=\"wp-image-17069\" style=\"width:618px;height:auto\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2023\/11\/image-23-1024x638.png\" alt=\"\" class=\"wp-image-17069\" style=\"width:618px;height:auto\"\/><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17050","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=17050"}],"version-history":[{"count":12,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17050\/revisions"}],"predecessor-version":[{"id":17084,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/17050\/revisions\/17084"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/17079"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=17050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=17050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=17050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}