Akka podstawy część 3 – Akka Java 8

Czy możemy używając aktorów pobawić się elementami funkcyjnymi z Java 8?

Jasne.

Akka ma specjalne interfejsy do obsługi Java 8. Są one na razie oznaczone jako experimental, ale sprawdzić je w działaniu warto !

Używać będę najnowszej aktualnie Akki w wersji 2.3.9

Tym razem nie użyję activatora, tylko zrobię projekt ręcznie za pomocą mvn. Cały projekt na github – https://github.com/najavie/akka-mvn

Cała instalacja za pomocą mvn sprowadza się do dodania dependency do pom.xml:

 

Czas napisać jakiegoś aktora…

Mój aktor będzie robił prostą rzecz – wypisywał na ekran to co mu prześlę w formie stringa.

W porównaniu do „zwykłego” aktora używającego UntypedActor, kod nie wygląda na prosty… ale popatrzmy na różnice…

Pierwsza jaka się rzuca w oczy – AbstractActor zamiast UntypedActor. Spoko.

Następnie mamy konstruktor, który ma uruchomianą metodę receive… to praktycznie to samo co metoda onReceive() z implementacji UntypedActor, natomiast z kilkoma różnicami – jako parametr przyjmuje ona klasy typu PartialFunction (o nich za chwilkę). I mamy helpera ReceiveBuildera – jest to UWAGA – trait scalowy! Tak, zaczynamy powoli wchodzić w zabawę ze scalą, ale to Java, więc nie będziemy nic w niej pisać, jedynie użyjemy jakiegoś jej elementu 🙂 Trait to taki bardziej rozbudowany interfejs, nie ma konieczności, aby się na tym w tej chwili znać.
Ważne jest to, że metoda receive() jako parametr przyjmuje PartialFunction, a ReceiveBuilder nam to udostępnia…
W metodzie match mamy podobnie jak w przypadku onReceive zwykłego aktora – porównanie do Obiektu (w moim przypadku do Stringa, i następnie obsługę wiadomości, jako funkcji.. I na samym końcu mamy metodę build, która mi z tego zbuduje PartialFunction.
Wydaje się proste? Bo takie jest !
Jeszcze na koniec statyczna metoda Props, która nam stworzy aktora. Props to „konstruktor” aktora. Nie jest dobrą i polecaną praktyką tworzenie aktorów poza systemem aktorów, należy to robić poprzez jakiś taki factory method z pomocą klasy Props. Dzięki niej możemy też przekazywać parametry dla konstruktora aktora, ale to pokażę pod koniec wpisu.

Ok… to teraz odpalmy tego aktora i niech coś powie!

Tutaj bez niespodzianek, właściwie ta sama składnia. Jak uruchomimy przykład to bez niespodzianek – hello world! wypowiedziany przez aktora…

Dobra, a co jeśli bym chciał obsłużyć więcej niż jeden typ wiadomości? Różne obiekty? Da się to zrobić bardzo prosto!

Oto nieco przerobiony aktor 🙂

I tutaj zaczyna się dopiero fajna zabawa!

Kod zaczyna być bardziej przejrzysty, wydzielamy metody…
Po kolei…
stworzyłem dwie metody –
repeat() oraz notFound()
Obie metody zwracają PartialFunction

PartialFunction w swoim traicie ma fajne funkcjonalności… tworzenia funkcji z wielu funkcji… i do tego są właśnie PartialFunctions. Tworzymy częściową implementację w jednym miejscu, w innym kolejną, nastepnie robimy z nich łańcuszek…

Spójrzmy na metodę notFound() – jeśli cokolwiek wejdzie co nie podpasuje pod Stringa poleci do metody notFound.

To teraz uruchomimy tego aktora…

Raz wysyłam Stringa, raz wysyłam date… pewnie bez niespodzianek raz dostane stringa, raz komunikat o błędzi

 

Jeszcze jedna sprawa została. Jakbym chciał jakoś sparametryzować aktora? Jak uruchomić go z jakimiś parametrami? Jak zauważyliście aktora nie tworzymy przez proste „new JakisAktor()”. A więc jak to zrobić?

Bardzo prosto 🙂 Odpowiedzią jest klasa Props.

Utworzyłem sobie takiego prostego aktora:

I proszę bardzo – Props może mieć metody z parametrem, i on zajmuje się prawidłowym tworzeniem aktora(też z parametrami 🙂 ). Proste i prawie tak samo łatwe jakbyśmy pracowali ze zwykłym obiektem…

Definicja takiego aktora wygląda tak:

Proste? Tworzenie za pomocą Props, podanie klasy aktora, i w parametrze 5tka 🙂

Po odpaleniu brak niespodzianek.

 

Jak widać, tworzenie u używanie aktorów razem z Java 8 nie jest trudne, dodaje kilka ciekawych funkcjonalności poprzez dodanie PartialFunction, i jeśli to fajnie ułożymy, możemy pisać aktorów z nieco większą … elegancją 🙂 Pamiętajmy jednak, że są to funkcjonalności póki co oznaczone jako experimental, więc nie do końca jeszcze ukończone, nie do końca wydajne, ale warto się z nimi już zaznajomić, aby za jakiś czas zacząć pisać tylko w ten sposób 🙂