`
fox_mt
  • 浏览: 24031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何停止正在执行的Actor

 
阅读更多

正如标题所说的,这篇帖子主要说下,在解决这个问题的时候所遇到的问题

先说下背景:

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的动作时同时操作的,这样又可以节省一部分时间

只是可能要多消耗一些性能

 

分享到:
评论

相关推荐

    LabVIEW Actor Framework 简单Demo

    除非为了在Actor Core.vi的中不断监视或输送某些值,当然此时就需要解决如何在适当时刻停止while循环的问题了。本例中未予以演示,但可以从本例的全局变量的g_bool中得到参考,while循环到底应该在何时被结束。

    actor模型java实现源码

    Actor模型的核心思想是将并发处理中的实体——也就是执行单元——抽象为“Actor”,每个Actor都有自己的状态,并且通过异步消息传递与其他Actor进行通信。这种模型特别适合于多核处理器和分布式系统,因为它能够有效...

    C++ actor framework样例

    这种类型的actor适合于网络I/O或者其他I/O密集型任务,因为它们能够在等待I/O完成时执行其他工作。 相比之下,blocking_actors更适合于计算密集型任务,或者对实时响应时间要求不高的场景。它们简化了编程模型,...

    Actor Framework Hands-On Instructions_ActorFramework_labview_Han

    Actor Framework利用LabVIEW的并行执行能力,使得多个actor可以同时运行。同步机制,如信号量和条件变量,用于控制actor间的协作,确保正确的时间顺序和资源访问。 6. **错误处理和调试** 考虑到系统的复杂性,...

    Clooney是一个用于Web的actor库

    在这个模型中,每个Actor都是一个独立的执行单元,拥有自己的状态,并通过消息传递与其他Actor进行通信。这种模型能够有效避免竞态条件和死锁,简化了并发编程的复杂性。 Clooney库的实现基于JavaScript,这意味着...

    响应式架构 消息模式Actor实现与Scala.Akka应用集成

    当一个Actor接收到消息时,它会在自己的上下文中执行,不会阻塞其他Actor的执行。这种并行处理方式使得系统能够高效地处理大量并发请求。此外,由于Actor之间的通信是异步的,所以它们可以独立工作,即使在处理时间...

    actor和proactor模式1

    在`Actor`模式中,每个`Actor`都是一个独立的执行单元,拥有自己的状态和邮箱,通过发送消息来进行通信。当`Actor`接收到消息时,它会在内部处理这些消息,而不会阻塞其他`Actor`的执行。这种方式提供了天然的线程...

    swift-Aerojet是swift的一个actor模型实现

    每个Actor都有自己的状态,并且只能通过发送消息来与其他Actor通信,这确保了并发执行时的线程安全。在Swift中,Aerojet实现了这一模型,允许开发者编写更加安全、高效的并发代码。 在Aerojet中,Actor是一种特殊的...

    GamePlay架构之Actor和Component.docx

    反射机制使得在运行时能够动态地访问和操作对象的属性和方法,这对于动态加载和序列化非常关键。垃圾回收确保了不再使用的对象会被自动释放,防止内存泄漏。序列化则允许将游戏状态保存和加载,而编辑器可见性和默认...

    actor-critic.rar_Actor Critic_actor critic 网络_actor-critic_plain

    其中θ是Actor网络的参数,J(θ)是策略的预期回报,Q(s, πθ(s))是Critic网络预测的在状态s下执行策略πθ(s)的动作的价值。 **Critic的更新** Critic网络通过最小化其预测Q值与目标Q值之间的差距来更新。目标Q值...

    matlab_Actor-Critic简单应用例子,连续状态空间,离散动作

    - 选择动作:根据当前状态,通过Actor网络得到动作概率分布,然后随机采样一个动作执行。 - 执行动作并观察结果:环境根据上一步的动作给出新状态和奖励。 - 更新Critic:根据新的状态和奖励,以及旧的状态,计算...

    actor.rar_Actor Critic_CRITIC_adp_critic network_monthhu7

    Critic Network则是价值函数的近似,它估计给定状态下执行某个动作后的累积奖励。Critic Network的训练通常基于梯度上升,通过最小化预测值与实际回报的误差来优化。 "monthhu7"可能是一个特定的研究者或者项目的...

    用Scala写的akka actor简单demo

    3. SBT的使用:如何配置SBT构建文件,以及如何通过SBT命令管理项目依赖和执行构建过程。 4. Akka的并发模型:了解Actor模型如何解决并发问题,以及如何通过Actor的隔离性保证数据一致性。 5. 测试Actor系统:学习...

    java actor模型和消息传递实现分析

    2. **并行性**:由于actor是独立运行的,因此可以在多核或多处理器系统上并行执行,提高程序性能。 3. **异步性**:消息传递是异步的,接收消息的actor可以在合适的时候处理,发送消息的actor无需等待响应,这有助于...

    并行计算 多线程 actor 协程 process

    多线程、Actor模型、协程和进程是实现并行计算的四种常见方式。 一、多线程(Multi-Threading) 多线程是并发编程的基础,允许一个应用程序同时执行多个任务。在Java、C#等语言中,多线程通过创建和管理线程来实现...

    akka-typed-actor-1.0-RC2.jar.zip

    1.0-RC2版本提供了一套完善的部署API,可以控制Actor的执行环境,如内存空间、线程池等,以适应不同的性能需求。 7. jar包依赖 `akka-typed-actor-1.0-RC2.jar`是Akka Typed Actor的特定版本库,包含了该版本的...

    akka-actor-1.1.2.jar.zip

    Akka的Actor模型还支持分布式部署,这意味着Actor可以跨多个节点运行,进一步增强了系统的可扩展性。通过Akka的Remoting功能,Actor可以相互通信,即使它们位于不同的网络或服务器上。这对于构建云原生应用或者...

    Akka Actor Tutorial代码

    如果一个Actor发生异常,它会接收到一个`Terminated`消息,然后可以选择重启或停止。此外,可以通过设置`supervisorStrategy`来定义父Actor如何处理子Actor的故障。 **Actor的层级结构** Actors可以形成一个树状...

Global site tag (gtag.js) - Google Analytics