SpringBoot下Akka的簡單使用

SpringBoot下Akka的簡單使用

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章