SpringBoot下Akka的简单使用
Akka框架实现一个异步消息传输,通过定义演员来处理业务逻辑。
首先引入依赖
1 2 3 4 5 6 | <!-- akka --> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-actor_2. 13 </artifactId> <version> 2.6 . 0 </version> </dependency> |
然后编写一个不带构造函数的演员——Actor类,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 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
https://www.cnblogs.com/kiba/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)