Springboot集成Akka Remote

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot集成Akka Remote相关的知识,希望对你有一定的参考价值。

参考技术A 在做这件事情之前,网上看到的资料大多数是实现IndirectActorProducer然后根据beanName去加载actor。但是actor是不能new的,需要给actor配置两个注解

然后用这种方式去加载actor

看完我有很多问号,既然spring不太适合帮我们管理actor,为什么还要费这么老大劲去做这件意义不大的事?

首先创建AkkaRemoteConfig.java

然后是PointChangeActor.java

然后是远端actor的工具类PointChangeRemote.java

用的是Props.create(PointChangeActor.class)方式创建actor。
point-change-notify是远端ActorSystem的名称,point-change-notify-actor是远端actor的名称。因为我是放在同一个服务器,这里使用的是akkaHost不是remoteHost,如果换ip了这里更换一下即可。
这里的PointChangeRemote更像是一个service,可以在里面做任何事情,如果你不需要remoteActor的回复,这里就不需要创建clientActor,如果别的地方需要用到这个actor可以重命名或者将单例抛出去。因为同名actor只能有一个

上面的Actor并没有被Spring管理,那么当然不能在其中Autowired一个想要调用的service
但是如果使用@Component类的注解,那么就会出现如下异常

根据刚开始的资料,得知,使用多例模式可以解决问题
Actor增加注解

那么问题结束了吗?
如果我想在createReceive()方法中调用service就可以了吗?显然是不行的。
因为多例模式下,容器启动时,不会帮你创建Bean,自然不会帮你注入想要使用的service。然而createReceive()是被直接调用的,并且Actor不能通过new的方式创建,所以这个Service是无法注入进来的。
所以到此为止,Actor还是一个注解都不需要添加的,就是一个单纯的Actor
那么这里定义一个ActorStarter

因为当前Actor想被remote调用的话,首先需要实例化这个Actor,类似于服务发现的概念,先让别的Acotr能查得到你才行。那么我们可以在这里实例化所有需要用到的Service,只要是静态方式即可。
在Actor中的使用:

Remote Sender akka Actor在其他群集中30秒后终止

使用ClusterClient.Send,消息将发送到远程角色。远程参与者接收消息并将发件人存储在本地变量中。30秒后,远程发送方被终止。

详细信息:两位演员都生活在不同的群体中。发送方actor不会死在它自己的集群上,而只是在远程集群中。

我已经尝试找到任何文档或任何相关设置,以使该Sender Actor永久存在于其他集群的一边。到目前为止没有运气

需要帮助解决此问题

Akka.Version:1.3.16平台:docker,net.core 3.1

答案

已回答your question on our Github as well

这是由于Akka.Cluster.Tools.ClusterClientReceptionist中的此设置:

https://github.com/akkadotnet/akka.net/blob/63472ea8d0ec72135a20a7a83a5fab9d4cd5a035/src/contrib/cluster/Akka.Cluster.Tools/Client/reference.conf#L11-L24

默认情况下,如果没有人在30秒内尝试通过响应隧道进行通信,它将使响应隧道超时。

我建议您增加超时时间。

以上是关于Springboot集成Akka Remote的主要内容,如果未能解决你的问题,请参考以下文章

将 Akka 与 Spring 和 OSGI 集成(未找到密钥“akka”的配置设置)

Akka 是不是原生支持集成模式?

将 Akka 与现有 java 项目集成的示例

使用Akka构建集群

AKKA | Hello AKKA

Akka(38): Http:Entityof ByteString-数据传输基础