我们有一个Akka演员正在阅读包含许多文件的大文件夹。
它读取它们以处理其他演员。
看起来它读得太快,最终我们遇到了OutOfMemoryException
。
我们想知道我们是否可以在某种程度上pause/sleep
X时间?
答案 0 :(得分:1)
你可以自己暂停,我的意思是你应该让演员停止处理文件并设置一个计时器,在X秒/分钟后发送一条resume
消息。
但是......你永远找不到合适的时间(上面的X),它总是太长或太短。这种问题是akka-stream存在的原因。我建议你看看它,因为它是解决这类问题的唯一好方法。
答案 1 :(得分:0)
对于内存不足问题,您可以增加actor邮箱的队列大小。 对于睡眠/暂停,您可以使用调度程序将消息安排给演员一段特定的时间。 没有必要明确地让一个actor睡觉:使用循环并对每个actor做出反应意味着底层线程池将有等待线程,而没有消息供actor处理。
如果您要为要处理的actor安排事件,使用java.util.concurrent实用程序中的单线程调度程序非常容易:
object Scheduler {
import java.util.concurrent.Executors
import scala.compat.Platform
import java.util.concurrent.TimeUnit
private lazy val sched =Executor.
new SingleThreadScheduledExecutor();
def schedule(f: => Unit, time: Long) {
sched.schedule(new Runnable {
def run = f
},
time , TimeUnit.MILLISECONDS)}}