Tyle się w tym tygodniu wydarzyło, że aż ciężko stwierdzić co należy uznać za największą premierę. O ten tytuł mierzyć będą się bowiem Preview JEPy związane z Projectem Loom, nowe duże wydanie Kotlina i kolejny Spring Boot. Jeśli jesteście ciekawi, jak każde z nich wypada – zapraszamy do lektury.
1. Projekt Loom: Wirtualne wątki i Strukturalna Współbieżność 🎈
JEPy, zwłaszcza te w preview rzadko kiedy są głównymi daniami naszych przeglądów, ale to nie jest byle jaki JEP. Otóż nareszcie, po latach iteracji i zmian koncepcji – nareszcie światło dzienne ujrzał preview Projektu Loom.
To właśnie efekty projektu Loom znajdziecie bowiem w JEPie o znamiennej nazwie: Wirtualne Wątki.
Thread thread = Thread.ofVirtual().name("duke").unstarted(runnable);
Jak widzicie, wątki dostały statyczny konstruktor, pozwalający stworzyć jego wirtualną wersję. Ciężko tutaj w bardzo krótkim podsumowaniu przejść przez wszystkie niuanse dla tych, którzy nigdy o Loomie nie słyszeli, ale w skrócie wątki wirtualne (notabene – elegancka nazwa) to takie tworzone po stronie maszyny wirtualnej Javy, nie systemu operacyjnego. Sprawia to, że jako zasób są bardzo mało zasobożerne, dzięki czemu nie musimy bawić się w tworzenie Thread Pooli, tylko konstruować je ad hoc – przynajmniej marketingowo, temat jest znacznie bardziej zniuansowany, bo RAM na StackTraces też nie jest z gumy. Ogólnie celem jest możliwość ucieczki od narzutu powodowanego przez potrzebę używania skomplikowanych struktur programowania współbieżnego tylko dlatego, że nie jesteśmy w stanie stworzyć nad nimi odpowiedniej abstrakcji. Czy tak się rzeczywiście stanie? Sam próbuje sobie odpowiedzieć na to pytanie od paru lat – będę obserwować z ostrożnym entuzjazmem.
Tak jak wspominałem, przyglądam się Loomowi od dłuższego czasu, miałem okazję obserwować najistotniejsze zmiany głównej koncepcji. Myślę, że punktem zwrotnym dla projektu było podpatrzenie od Kotlina (który sam miał swoje inspiracje) tak zwaną. współbieżnością strukturalną. Wtedy to oryginalny plan na Looma został nieco zaorany, a sama koncepcja przeszła wiele zmian. Strukturalna konkurencja to ogólnie fascynujący koncept, który doczekał się zarówno swojego własnego JEPa, jak i świetnych talków, z których chyba najlepsze pochodzą od Romana Elizarova, obecnego leada Kotlina. Znowu mocno w skrócie – konkurencja strukturalna ułatwia zarządzanie cyklem życia poszczególnych wątków, zwłaszcza gdy te tworzone są w hierarchii i np. wraz ze śmiercią rodzica chcemy też ubić wszystkie jego dzieci. Myślę, że całość konceptu najlepiej wyłoży Wam właśnie pan Elizarov.
Kiedy Looma zobaczymy? Ciężko wyczuć, raczej nie spodziewałbym się JDK 18 biorąc pod uwagę, że do czynienia mamy dopiero z wersją preview. Powoli pojawiają się za to informacje o kolejnych potwierdzonych featurach następnego wydania Javy – ale ten temat opracujemy sobie kiedyś myślę zbiorczo.
PS: Chcielibyście poczytać o tym, jak prezentuje się Loom w prawie-że-ostatecznej wersji? Akurat w weekend odpaliłem sobie testowe JDK i jeśli do przyszłego tygodnia nie wydarzy się nic bardzo “łamiącego”, to planuje całą edycje poświęcić wyłącznie na najciekawsze smaczki z tego projektu.
Źródła:
- JEP draft: Structured Concurrency (Preview)
- JEP draft: Virtual Threads (Preview)
- 250bpm – Structured Concurrency
- Roman Elizarov — Structured concurrency
Zainstaluj teraz i czytaj tylko dobre teksty!
2. Premiera Kotlin 1.6 🍅
Co prawda poprzednią edycję w całość poświęciliśmy Kotlinowi, ale od jego publikacji w międzyczasie zdążyła się ukazać wersja 1.6 języka. Nowe numerki kiedyś kojarzyły się nam z naprawdę dużymi zmianami i zestawami nowości, ale od pewnego czasu przestały mieć mam wrażenie, aż takie znaczenie. Filozofia “Ciągłego Dostarczania” przeciekła też do twórców języków, co powoduje, że jak z karabinu dostajemy nowe możliwości również w językach programowania. Poszczególne wydanie mają równocześnie znacznie mniejszy zakres, niż kiedyś bywało. Jak więc to wygląda w przypadku Kotlina?
Tak naprawdę jeżeli chodzi o sam język, nowa edycja przynosi jeden, ale bardzo istotny dodatek: exhaustive when. W praktyce oznacza to, że jeżeli tworzymy instancje zamkniętej klasy, to kompilator jest w stanie złapać za nas pewne klasy błędów. Weźmy sobie przykład pochodzący z dokumentacji samego Kotlina:
sealed class Contact {
data class PhoneCall(val number: String) : Contact()
data class TextMessage(val number: String) : Contact()
data class InstantMessage(val type: IMType, val user: String) : Contact()
}
Od Kotlina 1.6, jeżeli nie obsłużymy w naszym whenie któregoś z wariantów, kod po prostu się nie skompiluje. Dzięki temu używanie Kotlinowego wariantu switchy staje się jeszcze bardziej potężnym wzorcem:
fun sendAnnouncement(contact: Contact, announcement: Announcement) {
when (contact) {
is Contact.PhoneCall -> schedulePhoneCall(contact.number, announcement)
is Contact.TextMessage -> sendTextMessage(contact.number, announcement)
}
}
Oczywiście, na when się nie kończy. Kotlin to również zmiana sposobu działania funkcji suspend, która (nareszcie!) stała się superinterfejsem, a także stabilizacja słowa kluczowego typeof. Sporo zmian znajdą też dla siebie użytkownicy Kotlin Native.
Premierze nowych wersji “głównego” Kotlina towarzyszą zwykle wydania kolejnych edycji korutyn, ale w tym wypadku raczej przyjdzie nam jeszcze chwilę poczekać. kotlinx-coroutines 1.6 doczekał się w poniedziałkowy wieczór swojego Release Candidate, aczkolwiek i tutaj nie spodziewajcie się jakiejś rewolucji. Zmian jest sporo, ale większość z nich dotyczy testowalności korutyn – co z pewnością ucieszy każdego używającego korutyn, ale dotknie głównie developer experience 🙂
W stosunku do tego, co pokazano tydzień temu (K2, nowe narzędzia, zmiany w multiplatform) – niewiele. Odnoszę wrażenie, że jeżeli chodzi o Kotlina to najciekawsze rzeczy dzieją się poza biblioteką standardową. Aczkolwiek chyba taki już los projektów, które weszły w tryb “pociągu releasowego”.
Źródła
- Kotlin 1.6.0 Released | The Kotlin Blog
- What’s new in Kotlin 1.6.0
- Kotlin Standard Library Changes in 1.6
Zainstaluj teraz i czytaj tylko dobre teksty!
3. Spring Boot 2.6 przynosi podbicie ważnych zależności
Rzadko się zdarza, żeby najmniej istotną nowością javowego tygodnia był nowy Spring Boot, ale to chyba najlepiej opisuje ostatnie, jak szalone było ostatnie siedem dni.
Lista zmian we frameworku wydaje się być na pierwszy rzut oka minimalna – wprowadzono min. wzbogacono endpoint healthcheckowy /info o informacje o środowisku uruchomieniowym Javy czy wsparcie dla testowania aplikacji Spring MVC za pomocą interfejsu WebTestClient. Ziew 🥱. Oczywiście, to nie jedyne zmiany w Spring Boot 2.6 – nowe wydanie broni się ilością podbitych zależności.
Osoby posiadające w swoich projektach kolejki powinny zainteresować się nowymi wydaniami Spring Kafka 2.8.0 oraz Spring AMQP 2.4.0, aczkolwiek nie spodziewajcie się po nich rewolucji, aczkolwiek zawierają min. podbicie klienta Kafki do najnowszej wersji czy wsparcie dla nieuporządkowanego commitowania wiadomości. Ciekawe jest również wstępne wsparcie w AMQP dla RabbitMQ Streams, ale na coś stabilnego przyjdzie mi jeszcze pewnie trochę poczekać. Znacznie ciekawszą zmianą jest Spring Security 5.6.0, w którym znajdziecie sporo usprawnień zarówno dla OAuth, jak i mechanizmu SAML, a także istotny nowy interfejs – SecurityContextChangedListener. Ostatni z dużych upgradów to Spring Data 2021.1 – tutaj znowu głównym daniem jest upgrade Querydsl.
Jako mały bonus dorzucę bardzo interesujący projekt, o którego istnieniu wcześniej nie wiedziałem – Kalendarz Springowy. Dzięki temu projektowi można śledzić terminy planowanych wydań każdego ze Springowych podprojektów.
Źródła
- Kalendarz Springowy
- Spring for Apache Kafka 2.8 is Now Available
- Spring AMQP 2.4.0
- What’s New in Spring Security 5.6
- SecurityContextChangedListener (spring-security-docs 6.0.0-SNAPSHOT API)
- Spring Data 2021.1.0 goes GA