Úvod do jari s Akkou

1. Úvod

V tomto článku sa zameriame na integráciu Akky s jarným rámcom - aby sme umožnili injekciu služieb založených na jar do aktérov Akky.

Pred prečítaním tohto článku sa odporúča predbežná znalosť základov Akky.

2. Injekcia závislostí v Akke

Akka je výkonný aplikačný rámec založený na hercovom súbežnom modeli. Rámec je napísaný v jazyku Scala, vďaka čomu je samozrejme plne použiteľný aj v aplikáciách založených na prostredí Java. A tak veľmi často budeme chcieť integrovať Akku do existujúcej aplikácie založenej na jar alebo jednoducho použite Spring na zapojenie fazule do hercov.

Problém s integráciou Spring / Akka spočíva v rozdiele medzi manažmentom fazule na jar a manažmentom aktérov v Akke: herci majú špecifický životný cyklus, ktorý sa líši od typického životného cyklu jarných bôbov.

Okrem toho sú herci rozdelení na samotného herca (čo je detail internej implementácie a nemôže byť spravovaný Springom) a hercovho odkazu, ktorý je prístupný v kóde klienta, a tiež serializovateľný a prenosný medzi rôznymi runtime Akka.

Našťastie Akka poskytuje mechanizmus, konkrétne rozšírenia Akka, vďaka ktorým je použitie externých rámcov na vkladanie závislostí pomerne ľahkou úlohou.

3. Závislosti Maven

Aby sme demonštrovali použitie Akky v našom jarnom projekte, budeme potrebovať minimálnu jarnú závislosť - jarný kontext knižnica a tiež akka-herec knižnica. Verzie knižnice je možné extrahovať do priečinka časť pom:

 4.3.1.RELEASE 2.4.8 org.springframework spring-context $ {spring.version} com.typesafe.akka akka-actor_2.11 $ {akka.version} 

Nezabudnite skontrolovať najnovšie verzie servera Maven Central jarný kontext a akka-herec závislosti.

A všimnite si, ako akka-herec závislosť má a _2.11 postfix vo svojom názve, čo znamená, že táto verzia rámca Akka bola postavená proti verzii Scala 2.11. Zodpovedajúca verzia knižnice Scala bude prechodne zahrnutá do vašej zostavy.

4. Injekcia jarných bôbov do aktérov Akky

Vytvorme jednoduchú aplikáciu Spring / Akka pozostávajúcu z jediného herca, ktorý dokáže odpovedať na meno osoby pozdravom. Logika pozdravu bude extrahovaná do samostatnej služby. Budeme chcieť túto službu autowire na inštanciu herec. V tejto úlohe nám pomôže jarná integrácia.

4.1. Definovanie herca a služby

Na demonštráciu zavedenia služby do herca vytvoríme jednoduchú triedu Pozdrav herec definovaný ako netypový herec (rozširujúci Akka UntypedActor základná trieda). Hlavnou metódou každého herca Akka je na Prijať metóda, ktorá prijme správu a spracuje ju podľa určitej špecifikovanej logiky.

V našom prípade Pozdrav herec implementácia kontroluje, či je správa preddefinovaného typu Zdravím ťa, potom prevezme meno osoby z Zdravím ťa inštancia potom použije znak Pozdravná služba prijať pozdrav pre túto osobu a odpovedať odosielateľovi prijatým pozdravným reťazcom. Ak je správa iného neznámeho typu, odošle sa preddefinovanému hercovi neošetrený metóda.

Pozrime sa na to:

@Component @Scope (ConfigurableBeanFactory.SCOPE_PROTOTYPE) verejná trieda GreetingActor rozširuje UntypedActor {private GreetingService greetingService; // konštruktor @Override public void onReceive (Object message) hodí Throwable {if (message instanceof Greet) {String name = ((Greet) message) .getName (); getSender (). tell (greetingService.greet (name), getSelf ()); } else {nespracovana (sprava); }} verejná statická trieda Pozdrav {súkromné ​​meno reťazca; // štandardné konštruktory / getre}}

Všimnite si, že Zdravím ťa typ správy je definovaný ako statická vnútorná trieda vo vnútri tohto aktéra, čo sa považuje za dobrú prax. Prijaté typy správ by mali byť definované čo najbližšie k aktérovi, aby sa predišlo nejasnostiam, ktoré typy správ môže tento aktér spracovať.

Všimnite si tiež jarné anotácie @ Komponent a @Rozsah - tieto definujú triedu ako fazuľa spravovanú Springom s prototyp rozsah.

Rozsah je veľmi dôležitý, pretože každá požiadavka na získanie fazule by mala vyústiť do novovytvorenej inštancie, pretože toto správanie sa zhoduje s životným cyklom herca Akky. Ak implementujete tento fazuľa s nejakým iným rozsahom, typický prípad reštartu hercov v Akke bude s najväčšou pravdepodobnosťou fungovať nesprávne.

Na záver si všimnite, že sme to nemuseli výslovne robiť @Autowire the Pozdravná služba inštancia - je to možné vďaka novej funkcii jari 4.3 zvanej Implicitné vstrekovanie konštruktora.

Vykonávanie GreeterService je dosť priamy, všimnite si, že sme ho definovali ako fazuľa riadenú jarou pridaním @ Komponent anotácia k nej (s predvoleným nastavením singleton rozsah):

@ Verejná trieda komponentu GreetingService {public String greet (String name) {return "Hello," + name; }}

4.2. Pridanie podpory pružiny prostredníctvom rozšírenia Akka

Najjednoduchší spôsob, ako integrovať Spring do Akky, je rozšírenie Akka.

Prípona je jednotlivá inštancia vytvorená pre každý herec systému. Skladá sa zo samotnej triedy rozšírenia, ktorá implementuje značkovacie rozhranie Predĺženiea trieda id rozšírenia, ktorá zvyčajne dedí AbstractExtensionId.

Pretože sú tieto dve triedy úzko spojené, má zmysel implementovať Predĺženie trieda vnorená do ExtensionId trieda:

public class SpringExtension extends AbstractExtensionId {public static final SpringExtension SPRING_EXTENSION_PROVIDER = new SpringExtension (); @Override public SpringExt createExtension (systém ExtendedActorSystem) {vrátiť nový SpringExt (); } verejná statická trieda SpringExt implementuje rozšírenie {private volatile ApplicationContext applicationContext; public void initialize (ApplicationContext applicationContext) {this.applicationContext = applicationContext; } verejné rekvizity rekvizity (String actorBeanName) {návrat Props.create (SpringActorProducer.class, applicationContext, actorBeanName); }}}

najprvSpringExtension realizuje singel createExtension metóda z AbstractExtensionId trieda - ktorá zodpovedá za vytvorenie inštancie rozšírenia, SpringExt objekt.

The SpringExtension trieda má aj statické pole SPRING_EXTENSION_PROVIDER ktorá obsahuje odkaz na svoju jedinú inštanciu. Často má zmysel pridať súkromného konštruktora, ktorý to výslovne uvedie SpringExtention má byť singletonovou triedou, ale kvôli jasnosti ju vynecháme.

Po druhé, statická vnútorná trieda SpringExt je samotné rozšírenie. Ako Predĺženie je jednoducho značkovacie rozhranie, môžeme definovať obsah tejto triedy podľa vlastného uváženia.

V našom prípade budeme potrebovať inicializovať spôsob udržania jari ApplicationContext inštancia - táto metóda bude volaná iba raz na inicializáciu prípony.

Budeme tiež požadovať rekvizity metóda na vytvorenie a Rekvizity objekt. Rekvizity príklad je vzorom pre herca av našom prípade Rekvizity.vytvárajte metóda prijíma a SpringActorProducer argumenty triedy a konštruktora pre túto triedu. Toto sú argumenty, s ktorými sa bude volať konštruktor tejto triedy.

The rekvizity metóda sa vykoná zakaždým, keď budeme potrebovať odkaz na Spring riadeného herca.

Tretia a posledný kúsok skladačky je SpringActorProducer trieda. Implementuje Akka’s IndirectActorProducer rozhranie, ktoré umožňuje prepísať inštančný proces pre aktéra implementáciou vyrábať a herecTrieda metódy.

Ako ste už pravdepodobne uhádli, namiesto priamej inštancie vždy načíta inštanciu herca z Spring’s ApplicationContext. Ako sme z herca urobili prototyp- fazuľa, každý hovor do vyrábať metóda vráti novú inštanciu aktéra:

verejná trieda SpringActorProducer implementuje IndirectActorProducer {private ApplicationContext applicationContext; private String beanActorName; public SpringActorProducer (ApplicationContext applicationContext, reťazec beanActorName) {this.applicationContext = applicationContext; this.beanActorName = beanActorName; } @Override public Actor produce () {return (Actor) applicationContext.getBean (beanActorName); } @Override public Class actorClass () {return (Class) applicationContext .getType (beanActorName); }}

4.3. Dávať to všetko dokopy

Ostáva už len vytvoriť triedu konfigurácie Spring (označenú @ Konfigurácia anotácia), ktorá povie Springovi, aby skenoval aktuálny balík spolu so všetkými vnorenými balíčkami (to zaisťuje @ComponentScan anotácia) a vytvorte kontajner Spring.

Potrebujeme pridať iba jednu ďalšiu fazuľu - ActorSystem inštancia - a inicializovať v tomto prípade rozšírenie Spring ActorSystem:

@Configuration @ComponentScan verejná trieda AppConfiguration {@Autowired súkromná ApplicationContext applicationContext; @Bean public ActorSystem actorSystem () {ActorSystem system = ActorSystem.create ("akka-spring-demo"); SPRING_EXTENSION_PROVIDER.get (system) .initialize (applicationContext); návratový systém; }}

4.4. Získavanie aktérov zapojených do siete Spring

Na vyskúšanie, či všetko funguje správne, môžeme podať injekciu ActorSystem inštancie do nášho kódu (buď nejaký aplikačný kód spravovaný pomocou Spring, alebo test založený na Spring), vytvorte a Rekvizity objekt pre herca pomocou nášho rozšírenia, načítajte odkaz na herca pomocou Rekvizity namietajte a pokúste sa niekoho pozdraviť:

ActorRef greeter = system.actorOf (SPRING_EXTENSION_PROVIDER.get (system) .props ("greetingActor"), "greeter"); FiniteDuration duration = FiniteDuration.create (1, TimeUnit.SECONDS); Timeout timeout = Timeout.durationToTimeout (duration); Budúci výsledok = opýtať sa (pozdraviť, nový pozdraviť („John“), časový limit); Assert.assertEquals ("Dobrý deň, John", Await.result (výsledok, trvanie));

Tu používame typické akka.pattern.Patterns.ask vzor, ​​ktorý vráti Scalu Budúcnosť inštancia. Po dokončení výpočtu sa zobrazí Budúcnosť je vyriešený s hodnotou, ktorú sme vrátili v našom GreetingActor.onMessasge metóda.

Možno si počkáme na výsledok použitím Scaly Výsledok metóda do Budúcnosť, alebo výhodnejšie zostaviť celú aplikáciu s asynchrónnymi vzormi.

5. Záver

V tomto článku sme si ukázali, ako integrovať Spring Framework s Akkou a fazuľami autowire do hercov.

Zdrojový kód článku je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found