正如标题所说的,这篇帖子主要说下,在解决这个问题的时候所遇到的问题
先说下背景:
1,一个请求,启动多个actor去执行任务,当任务执行过程中,又请求的一次,进行了重复请求
这种情况下,会出现异常InvalidActorNameException,也就是说actor的名字重复了
首先想到将正在执行的actor关闭,actor的关闭我这里说一种,actorSysm.stop(actor);
actorSystem类型是ActorSystem,如果不知道这个是怎么来的,去搜索下怎么创建actor,自然就有了
但是这里有个问题,stop的命令不会立即终止actor,不像linux的kill一样,直接杀死,而是要发送让其
死亡的消息,但是我们不可能等到这个actor彻底死了,才去创建新的actor
这期间试了几种方法,都不能满足需求
最后,只能曲线救国
那就是每次请求进来,重新建立actorSystem
ActorSystem systemo = system.apply("AkkaVehicleReport");
然后将之前的actorSystem关闭
system.shutdown();
最后将之前的actorSystem的引用指向新建的actorSystem
system = systemo;
这样做的效果就是每次都是新的actorSystem去创建actor执行任务,不会出现名字重复的问题
同时关闭了之前的actorSystem,之前创建的actor会逐层被杀死,解决了不会因为重复提交而造成
一直创建actor的问题,
因为我的actor执行的完成之后会将数据保存到一个地方,这么操作还有一个意外收获
那就是之前的actor未被杀死之前执行完的数据会被保存下来,新建的actor不需要再次执行
提高了数据利用率
下面把相对完整的代码贴出来,欢迎大家指导
注入部分:
@Autowired
private ActorSystem system;
这里说下,如果你无法注入这个actorSystem,需要增加一部分代码,这里不做解释,可以自己搜下,找不到可以找我-469798404
方法内部:
ActorSystem systemo = system.apply("AkkaVehicleReport");
system.shutdown();
system = systemo;
for (int i = 1; i <= 20; i++) { ReportMessage msg = new ReportMessage(); String actorName = session.getId() + "pageActor" + i; try { actorList.add(actorName); ActorRef pageActor = system.actorOf(SpringExtProvider.get(system).props(PageActor.class), actorName); System.out.println("---" + actorName + "-----------create"); pageActor.tell(msg, ActorRef.noSender()); } catch (InvalidActorNameException e) { e.printStackTrace(); } }
创建了20个actor,去执行任务
@Override public void onReceive(Object msg) throws Exception { if(msg instanceof ReportMessage){ //查询数据,处理数据 ReportMessage remsg = (ReportMessage)msg; //判断该部分数据是否处理完成 if(//处理完成){ System.out.println("----------重复---done---" + this.self().path().name()); }else{//未处理完成 //重新处理 System.out.println("-------------done---" + this.self().path().name()); } getContext().stop(this.getSelf()); } else{ unhandled(msg); } }
整体的结构就是这样,删掉了一些业务代码
整体思路就是这样
重复提交时,创建actor的动作和停止正在执行的actor的动作时同时操作的,这样又可以节省一部分时间
只是可能要多消耗一些性能
相关推荐
除非为了在Actor Core.vi的中不断监视或输送某些值,当然此时就需要解决如何在适当时刻停止while循环的问题了。本例中未予以演示,但可以从本例的全局变量的g_bool中得到参考,while循环到底应该在何时被结束。
GamePlay架构之Actor和Component 藉着UObject提供的元数据、反射生成、GC垃圾回收、序列化、 编辑器可见,Class Default Object等,UE可以构建一个Object 运行的世界
Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。 Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息...
用Scala写的akka actor简单demo,已经打包成SBT程序,因为上传大小限制依赖包没上传,用户安装了sbt后只需要执行update命令即可
利用Actor-Critic学习和径向基神经网络实现路径跟踪,可以跟踪直线和正弦路径
该软件是为了解决分布式编程中一系列的编程问题而设计,是非常实用的Java和Scala的Actor模型应用,支持多种运行系统进行使用,且安全性高,操作简单,用起来也是非常的方便的! 1、Actor之间完全独立; 2、Actor由...
Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。 Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息...
就是说,它目前是一个功能原型-几个.NET示例(例如,Hello world,Supervision,Behaviors,远程激活)已移植并正在运行。如何构建和运行需要Node 7.6.0+和TypeScript。 建造npm i./generate.sh # generates ...
此回购包含实验,以确定在ray运行时内部实现跨语言参与者之间的协作的可能方法。 资料夹结构 scala_ray :将Scala项目打包到一个.jar 。 python :包含Java actor调用的python模块。 绕过演员手柄 根据, ...
要运行“主要”剥离使用: mix run boot.exs并发模型 Actor 模型1. 每个actor是一个Process 2. 每个actor执行一个特定的任务3. 告诉进程做一些你需要在消息中发送的事情。 该进程还可以发回另一条消息。 4. 进程...
Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。 Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息...
只需安装CLI并观察actor的运行即可。 ,-今天您将看到的最小的演员,它仅接受输入并生成输出。 -使用Chrome和Puppeteer加载单个网页并从中提取数据。 -使用原始HTTP请求抓取URL列表。 您可以在和找到更多代码...
演员在孤立的绿色线程上运行。 它们无法共享内存,只能通过输入和输出消息进行通信。 因此,必须将消息序列化以在线程之间传播。 例子 use serde :: {Deserialize, Serialize}; use wactor :: * ; struct Counter {...
首先,您需要安装cargo-xbuild和bootimage工具: cargo install cargo-xbuild bootimage然后,您可以通过运行以下内容来构建项目: cargo xbuild要创建可引导磁盘映像,请运行: cargo bootimage这将在target/x86_...
喜剧是一个Node.js actor框架。 参与者都是关于灵活的可伸缩性。 在根据参与者描述应用程序之后,您可以通过简单地修改配置而不用改变一行来将应用程序的任意部分扩展到单个主机上的多个核心(通过生成子进程),...
ProtoActor框架相关demo,有需要的可以下载,可以直接运行!
用scala编写 底层是基于actor模式的akka框架 代码结构简洁 基于DAG(有向无环图)的执行引擎 减少了计算时数据频繁读写到磁盘的开销 **DAG有向无环图 : spark设计之初就考虑了 大量连续计算的需求 允许在对数据处理...
1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习...
NETXActor(ACTOR本机运行版) : Install-Package NetxActor 源代码: NetX架构图解: (举例2个例子,不包括其他的奇思妙想) OR 通过此框架我们可以轻松的构建 如图这样的服务网络,他的性能非常好的,大概比性能高出5倍...
演员选择 测试偶发演员选择失败(参见 ) 该测试需要一个正在运行的MongoDb(localhost:27017),并创建一个名为“ actor-selection”的数据库。 运行mvn verify以查看偶发故障。