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

SpringBoot下Akka的简单使用的更多相关文章
- Java结合SpringBoot拦截器实现简单的登录认证模块
Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...
- SpringSecurity在Springboot下使用的初步体验
SpringSecurity曾经在十年前非常火热,只要是做权限系统,当时几乎非用它不可,记得是在XML文件里一堆的配置.曾几何时,Shiro冒了出来,以其简洁和轻量的风格慢慢地捕获了众多码农的心,从此 ...
- (04) springboot 下的springMVC和jsp和mybatis
1. springboot 和springmvc下的注解完全一样(新增了一些有用的) 常用的注解如下: @Controller @RestController= @Controller + @Resp ...
- SpringBoot 下 mybatis 的缓存
背景: 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java Web 开发的三剑客--- SSM.当然随着 Spr ...
- springBoot整合MyBatise及简单应用
springBoot整合MyBatise及简单应用 我采用的是 工具IDEA 框架是springBoot+maven+Mybatise 第一步: pom.xml 引入相关jar包 <?xml v ...
- 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务
来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...
- 使用 SpringBoot+Dubbo 搭建一个简单分布式服务
实战之前,先来看几个重要的概念 开始实战之前,我们先来简单的了解一下这样几个概念:Dubbo.RPC.分布式.由于本文的目的是带大家使用SpringBoot+Dubbo 搭建一个简单的分布式服务,所以 ...
- 手撸一个SpringBoot的Starter,简单易上手
前言:今天介绍一SpringBoot的Starter,并手写一个自己的Starter,在SpringBoot项目中,有各种的Starter提供给开发者使用,Starter则提供各种API,这样使开发S ...
- vue springboot利用easypoi实现简单导出
vue springboot利用easypoi实现简单导出 前言 一.easypoi是什么? 二.使用步骤 1.传送门 2.前端vue 3.后端springboot 3.1编写实体类(我这里是dto, ...
- Springboot整合ElasticSearch进行简单的测试及用Kibana进行查看
一.前言 搜索引擎还是在电商项目.百度.还有技术博客中广泛应用,使用最多的还是ElasticSearch,Solr在大数据量下检索性能不如ElasticSearch.今天和大家一起搭建一下,小编是看完 ...
随机推荐
- [转帖]linux设置page cache大小,Linux Page Cache调优在Kafka中的应用
本文首发于 vivo互联网技术 微信公众号 链接: 作者:Yang Yijun 本文主要描述Linux Page Cache优化的背景.Page Cache的基本概念.列举之前针对Kafka的 IO ...
- 关于sar的学习
关于sar的学习 背景 公司一套基于某冷门Python架构的系统前几天出现异常卡顿. 当时安装的时候必须使用ubuntu系统. 所以当时默认安装的ubuntu1804, 本来想尝试使用一下sar查看卡 ...
- 一个Redis dump文件的简要分析过程
摘要 遇到一个老大难的问题. 让帮忙分析一下一个Redis的dump文件. 虽然之前写过了rdb和rdr的文档 但是感觉大家都喜欢拿来主义. 没办法. 今天继续进行深入一点的分析. 原理其实还是基于r ...
- 非root用户搭建sftp以及进行简要使用的介绍
sftp的简介 关于sftp sftp是Secure FileTransferProtocol的缩写,安全文件传送协议,可以为传输文件提供一种安全的加密方法. sftp与 ftp有着几乎一样的语法和功 ...
- TypeScript中的元组 Tuple
元组类型 // 元组类型:表示一个已知元素数量和类型的数组,各元素的类型不必相同 let undata: [string, '男'| '女']; //已知数量是两个.类型分别是字符串和男或者女 und ...
- Promise的异常穿透和中断Promise的链式请求
1.Promise的异常穿透 1==>当你使用Promise的then,进行链式调用的时候,可以在最后指定失败的回调 2==>前面任何操作出现了异常,都会传递到最后失败的回调中进行处理: ...
- 深入学习C#系列文章01---C#3 革新写代码的新方式
C#3 几乎所有的新特性都是为LINQ服务的,但他们单独使用也非常有用,接下来我们来简单看看C#3 的几个新特性吧. 一.自动实现的属性-----编写由字段直接支持的简单属性,不再显得臃肿不堪. 之前 ...
- docker上部署启动RabbitMQ
在docker上部署启动RabbitMQ及使用 一.docker上部署启动RabbitMQ 1.查询rabbitmq镜像 docker search rabbitmq:management 2.拉取r ...
- 基于NET Core 的Nuget包制作、发布和运用流程
开发缘由:公司需要调用天眼查-开放平台 ,验证客户的的营业执照信息是否在存续期,并将企业基本信息返回,之后和使用百度图文识别的企业信息进行对照是否一致. 前期准备 在网站中注册后,需要够买套餐.之后点 ...
- MySQL【四】---案例实战{拆分多表、外键创建等}
1.准备数据 数据准备 create database jing_dong charset = utf8mb4; 创建一个商品goods数据表: create table goods( id int ...