微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java,Akka演员和有界邮箱

我在application.conf中有以下配置:

bounded-mailBox {
  mailBox-type = "akka.dispatch.BoundedMailBox"
  mailBox-capacity = 100
  mailBox-push-timeout-time = 3s
}

akka {

    loggers = ["akka.event.slf4j.Slf4jLogger"]
    loglevel = INFO
    daemonic = on
}

这就是我配置演员的方式

public class MyTestActor extends UntypedActor implements RequiresMessageQueue<BoundedMessageQueueSemantics>{


    @Override
    public void onReceive(Object message) throws Exception {
        if (message instanceof String){

             Thread.sleep(500);
             System.out.println("message = " + message);
        }
        else {
            System.out.println("UnkNown Message " );
        }

    }
}

在这就是我如何启动这个actor:

myTestActor = myActorSystem.actorOf(Props.create(MyTestActor.class).withMailBox("bounded-mailBox"), "simple-actor");

在它之后,在我的代码中我向这个演员发送了3000条消息.

  for (int i =0;i<3000;i++){
        myTestActor.tell(guestName, null);}

我期望看到的是我的队列已满的例外情况,但我的消息每半秒打印在一次onReceive方法中,就像什么也没发生一样.所以我认为我的邮箱配置没有应用.

我究竟做错了什么?

更新:我创建了订阅死信事件的演员:

deadLetteractor = myActorSystem.actorOf(Props.create(DeadLetterMonitor.class),"deadLetter-monitor");

并安装kamon进行队列监控:

在向演员发送3000条消息后,Kamin向我展示了以下内容

Actor: user/simple-actor 

MailBox size:
 Min: 100  
Avg.: 100.0 
Max: 101

Actor: system/deadLetterListener 

MailBox size:
 Min: 0  
Avg.: 0.0 
Max: 0

Actor: system/deadLetter-monitor 

MailBox size:
 Min: 0  
Avg.: 0.0 
Max: 0

解决方法:

认情况下,Akka将溢出的消息丢弃到DeadLetters中,并且actor不会停止处理:
https://github.com/akka/akka/blob/876b8045a1fdb9cdd880eeab8b1611aa976576f6/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala#L411

但是在丢弃消息之前,发送线程将被阻塞,该间隔由mailBox-push-timeout-time配置.尝试将其减少到1毫秒,并看到以下测试将通过:

import java.util.concurrent.atomic.AtomicInteger

import akka.actor._
import com.typesafe.config.Config
import com.typesafe.config.ConfigFactory._
import org.specs2.mutable.Specification

class BoundedActorSpec extends Specification {
  args(sequential = true)

  def config: Config = load(parseString(
    """
    bounded-mailBox {
      mailBox-type = "akka.dispatch.BoundedMailBox"
      mailBox-capacity = 100
      mailBox-push-timeout-time = 1ms
    }
    """))

  val system = ActorSystem("system", config)

  "some messages should go to dead letters" in {
    system.eventStream.subscribe(system.actorOf(Props(classOf[DeadLetterMetricsActor])), classOf[DeadLetter])
    val myTestActor = system.actorOf(Props(classOf[MyTestActor]).withMailBox("bounded-mailBox"))
    for (i  <- 0 until 3000) {
      myTestActor.tell("guestName", null)
    }
    Thread.sleep(100)
    system.shutdown()
    system.awaitTermination()
    DeadLetterMetricsActor.deadLetterCount.get must be greaterThan(0)
  }
}

class MyTestActor extends Actor {
  def receive = {
    case message: String =>
      Thread.sleep(500)
      println("message = " + message);
    case _ => println("UnkNown Message")
  }
}

object DeadLetterMetricsActor {
  val deadLetterCount = new AtomicInteger
}

class DeadLetterMetricsActor extends Actor {
  def receive = {
    case _: DeadLetter => DeadLetterMetricsActor.deadLetterCount.incrementAndGet()
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐