SpringBoot下Akka的简单使用

Akka框架实现一个异步消息传输,通过定义演员来处理业务逻辑。

首先引入依赖

com.typesafe.akka

akka-actor_2.13

2.6.0

然后编写一个不带构造函数的演员——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 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 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

 

 

原文链接:

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。

发表评论

返回顶部暗黑模式