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

在Scala Akka中将请求字符串发布到localhost

如何解决在Scala Akka中将请求字符串发布到localhost

我实施了一个演员,为akka演员进行健康检查。 该参与者检查健康状况,并返回上,下或未知状态。

val actorSystemCheckRunnable = 
  new ActorSystemCheckRunnable(
    actorSystemHealthChecker,healthCheckHost,healthCheckPort
  )

该类声明如下

case class ActorSystemCheckRunnable(
    kinesisActorSystemHealthChecker: ActorSystemHealthChecker,healthCheckHost: String,healthCheckPort: Int
) extends Runnable {
  override def run(): Unit = {
    kinesisActorSystemHealthChecker.checkActorSystem() match {
      case t@_ => logger.info(s"${system.name} is ${t.toString}")
    }
  }
}

并且安排如下

appHealthActorSystem
  .scheduler
  .scheduleWithFixedDelay(0 seconds,5 seconds)(actorSystemCheckRunnable)(appHealthEC)

一旦运行它将返回输出作为日志

[app-health-actor-system-akka.actor.default-dispatcher-4] - source is UP {}
[app-health-actor-system-akka.actor.default-dispatcher-5] - source is UNKNowN {}

但是我很难将这些健康检查输出暴露给本地主机。 有没有办法从case类中进行HTTP发布的声明?

编辑:

我将其作为独立应用程序运行,并且确实尝试创建http端点并将actor系统运行状况检查路由到该端点,但是该端点仅保持静态并显示一个运行状况检查状态,如果应用程序i停机,未知或故障状态,不会反映在端点上

case class ActorSystemCheckRunnable(kinesisActorSystemHealthChecker: ActorSystemHealthChecker,healthCheckPort: Int) extends Runnable {
override def run(): Unit = {
  kinesisActorSystemHealthChecker.checkActorSystem() match {
    case t@_ => Http().newServerAt("localhost",9000).bindFlow(path("hello") {
      Directives.put {
        complete(s"${system.name} is ${t.toString}")
      }
    })
  }
}

}

解决方法

如果您在akka群集中运行该应用程序,则引入akka管理依赖关系并以akka管理的方式进行运行状况检查无害,例如:

class KinesisHealthCheck(system: ActorSystem) extends (() => Future[Boolean]) {
  private val kinesisActorSystemHealthChecker = ...
  override def apply(): Future[Boolean] = {
    ...
  }
}

然后配置运行状况检查路由。请参阅https://doc.akka.io/docs/akka-management/current/healthchecks.html

或者,如果您出于任何原因不想包含akka管理依赖项,则可以使用Akka HTTP创建HTTP端点/ healthcheck,并像调用任何常规HTTP端点一样调用该端点

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