Akka框架實現一個異步消息傳輸,通過定義演員來處理業務邏輯。
首先引入依賴
<!-- akka --> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-actor_2.13</artifactId> <version>2.6.0</version> </dependency>
然後編寫一個不帶構造函數的演員——Actor類,如下:
import akka.actor.AbstractActor; public class ActorNormal extends AbstractActor { //處理消息 @Override public Receive createReceive() { //處理一個具體類型的消息,比如是字符串類型的消息 Receive build = receiveBuilder().match(String.class,(msg)-> { System.out.println(msg); sender().tell("response", self()); }).match(Integer.class,(msg)-> { System.out.println(msg+"1"); }).build(); return build; } }
ActorNormal重寫createReceive函數,然後使用receiveBuilder構造一個接收器Receive,然後使用Receive的Match函數,對不同類型的請求進行分別處理;在處理內部可以使用 sender().tell發送返回值給請求者。
然後編寫一個帶構造函數的演員——ActorStruct。
import akka.actor.AbstractActor; import com.example.dynamicdb.dbmodel.User; /** * 保護構造函數的演員 */ public class ActorStruct extends AbstractActor { private final User user; public ActorStruct(User userModel){ this.user = userModel; } //處理消息 @Override public Receive createReceive() { //處理一個具體類型的消息,比如是字符串類型的消息 Receive build = receiveBuilder().match(String.class,(msg)-> { System.out.println(msg); sender().tell("我是ActorStruct返回結果", self()); }).match(Integer.class,(msg)-> { System.out.println(msg+"1"); }).build(); return build; } }
然後編寫一個Controller——AkkaController,測試AKKA,如下:
package com.example.dynamicdb.controller; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.pattern.Patterns; import akka.util.Timeout; import com.example.dynamicdb.akka.ActorNormal; import com.example.dynamicdb.akka.ActorStruct; import com.example.dynamicdb.dbmodel.User; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.duration.Duration; import java.util.concurrent.TimeUnit; @RestController public class AkkaController { @GetMapping(value = "/Akka/AkkaSendString") @ResponseBody @ApiOperation(value = "Akka使用tell發送字符串", notes = "發送數值", httpMethod = "Get") public void AkkaSendString() { //創建所有管理actor的系統管理對象 ActorSystem actorSystem = ActorSystem.create(); //通過這個系統管理對象創建actor,並返回當前actor的地址,可以理解成現實生活中用戶的一個郵箱地址 //使用actorSystem.actorOf定義一個名爲actorNormal的ActorRef ActorRef actor = actorSystem.actorOf(Props.create(ActorNormal.class), "actorNormal"); //發送消息Object msg(發送消息的內容,任何類型的數據), final ActorRef sender(表示沒有發送者(其實是一個叫做deadLetters的Actor)) actor.tell("kiba", ActorRef.noSender()); } @GetMapping(value = "/Akka/AkkaSendInt") @ResponseBody @ApiOperation(value = "Akka使用tell發送數值", notes = "發送數值", httpMethod = "Get") public void AkkaSendInt() { ActorSystem actorSystem = ActorSystem.create(); ActorRef actor = actorSystem.actorOf(Props.create(ActorNormal.class), "actorNormal"); actor.tell(518, ActorRef.noSender());//發送數值 } @GetMapping(value = "/Akka/AkkaAsk") @ResponseBody @ApiOperation(value = "Akka使用Ask請求", notes = "Ask請求可以接受演員的返回值", httpMethod = "Get") public void AkkaAsk() { ActorSystem actorSystem = ActorSystem.create(); ActorRef actor = actorSystem.actorOf(Props.create(ActorNormal.class), "actorNormal"); Timeout timeout = new Timeout(Duration.create(2, TimeUnit.SECONDS)); Future<Object> future = Patterns.ask(actor, "我是接收遊戲返回值", timeout); try { Object obj = Await.result(future, timeout.duration()); String reply = obj.toString(); System.out.println("回覆的消息: " + reply);//返回值獲取不到 } catch (Exception e) { e.printStackTrace(); } } @GetMapping(value = "/Akka/AkkaAskStruct") @ResponseBody @ApiOperation(value = "Akka使用Ask請求帶構造函數的演員", notes = "帶構造函數的演員", httpMethod = "Get") public void AkkaAskStruct() { ActorSystem actorSystem = ActorSystem.create(); ActorRef actor = actorSystem.actorOf(Props.create(ActorStruct.class,new User(1,"kiba")), "actorNormal"); Timeout timeout = new Timeout(Duration.create(2, TimeUnit.SECONDS)); Future<Object> future = Patterns.ask(actor, "我是帶構造函數的演員接收遊戲返回值", timeout); try { Object obj = Await.result(future, timeout.duration()); String reply = obj.toString(); System.out.println("回覆的消息: " + reply);//返回值獲取不到 } catch (Exception e) { e.printStackTrace(); } } }
----------------------------------------------------------------------------------------------------
注:此文章爲原創,任何形式的轉載都請聯繫作者獲得授權並註明出處!
若您覺得這篇文章還不錯,請點擊下方的【推薦】,非常感謝!
https://www.cnblogs.com/kiba/p/17494029.html