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中的此设置:
默认情况下,如果没有人在30秒内尝试通过响应隧道进行通信,它将使响应隧道超时。
我建议您增加超时时间。
以上是关于Springboot集成Akka Remote的主要内容,如果未能解决你的问题,请参考以下文章