akka系统中停止运行任务的问题
admin
2023-07-30 14:40:08
0

   上周的工作中遇到了一个停止运行任务时的问题,就是在一个任务运行到一半时需要停止的问题。正常的需求是一按停止按钮,就要立即停止,但现在都要等程序运行完才能停止,现在是一个bug。由于之前写任务运行逻辑的不是我,因此我先花一个小时苦读大神们的代码,了解了他们对于任务运行那块的逻辑,发现是首先前端发消息给一个Actor,然后这个Actor用actorOf方法创建许多子Actor,然后再对这些Actor调用ActorSelection创建运行这个任务的Actor。

   之前以为通过获取Actor的地址,终止这个Actor,然后自动终止其所有子Actor应该就能停止任务了,后来发现根本停不下来。

   第一次尝试是在状态机FSM中不仅在whenUnhandled方式下停止Actor,而且在其他每一种状态下都调用停止Actor操作,直接终止运行该线程的Actor。

   这里顺便普及一下停止Actor的时候,是给该Actor发送两种消息,Kill或者PoisonPill。使用Kill消息可以在不损失缓冲区中消息的情况下重启Actor对象,但是不会停止Actor对象,仅仅是重启,而且会抛出异常,使用PoisonPill消息可以停止Actor对象,但允许Actor对象处理完收到PoisonPill消息之前存储在缓冲区中的消息。然后我又尝试了context.stop(actorRef)去直接停止某Actor,同样无济于事,线程依旧潇洒地运行结束。

   这个时候我发现问题应该转移到线程级别,既然终止Actor是不起作用的,我就干脆把这个线程终止掉。一开始我们采用给运行线程的Actor发送消息的方式终止该线程,发现能停止,但还是在任务运行完之后停止。后来我意识到,Actor处理消息应该是按照发送顺序来的,首先发送的消息是处理这个任务,所以只有处理完任务才会处理停止线程这个消息,此时线程已经不是运行状态了。因此我干脆定义了一个线程安全的HashMap,保存了id和Process对象的映射关系,可以通过这个数据结构搜索到线程对象,当父Actor收到终止任务命令时,不再向运行该任务的子Actor发送消息,而是在父Actor中直接调用运行任务的线程的Process对象里的destroy方法,直接终止这个线程,终于成功了。

   得出结论就是,akka系统对于线程粒度的启停控制可能还是有一定缺陷,需要我们根据线程的Process对象自己来做停止操作。

相关内容

热门资讯

一次拔12颗牙?严防过度诊疗围... 澎湃特约评论员 柳早据媒体近日报道:去年9月,63岁心梗老人一颗牙疼,被陕西宝鸡大团圆口腔医院派车接...
明代国宝现TCL广告“破案”,... 据潇湘晨报报道,近日,正在北京中国工艺美术馆展出的“高原丝路 瞿昙之光——青海丝路文物与瞿昙寺壁画艺...
曾被中方制裁的荷兰大臣即将访华... 澎湃新闻记者 聂舒翼 朱郑勇7月6日,外交部发言人毛宁主持例行记者会。有记者提问,荷兰外贸与发展合作...
外交部:中国海军组织潜射战略导... 7月6日,外交部发言人毛宁主持例行记者会。在回答有关中国海军成功组织潜射战略导弹试射的问题时,毛宁表...
哈梅内伊葬礼游行现场人山人海,... 当地时间7月6日,伊朗已故最高领袖哈梅内伊的葬礼进入第三天,今天举行的是送葬仪式。不计其数的伊朗民众...
网红小孩成年后,全部反转了 没有哪一代人,比00后更适合“出名要趁早”这句话。就连24岁写下这句话的张爱玲,放在今天,也算不上成...
广西六蓝水库发生险情,坝体出现... 近日,受今年第10号台风“美莎克”影响,广西出现连续强降雨。当地发布洪水橙色预警;水利部、国家防总对...
洗衣机到脱水时就转为漂洗,这是... 1、可能是脱水桶内衣物放置不均匀,会导致洗衣机不平衡。这时,洗衣机会自动跳到放水,使洗衣机再次平衡。...
宇通获《人民日报》专题报道丨不... 6月28日,人民日报刊发深度文章,介绍宇通在墨西哥历经多年深耕,从单一出口商逐渐成长为深度本地化的交...
漂洗+脱水什么意思 “漂洗”和“脱水”是洗衣机或洗碗机等家电设备中的两个常见功能。“漂洗”是指在洗涤过程中,用清水对衣物...