将Guice与akka道具一起使用-找不到合适的actor构造函数

问题描述

我有kafkaProducer演员:

class KafkaProducerActor @Inject()(
  avroProducer: MyKafkaProducerAvro,jsonProducer: MyKafkaProducerJson,metrics: PrometheusMetricsService
)
  extends Actor
{
  def handleErrs(block: => Unit): Unit = {
    try {
      block
    } catch {
      case e: Exception =>
        Logger.error(s"failed to produce kafka message,error: ${e.getMessage},cause: ${ExceptionUtils.getRootCause(e)},stacktrace: ${ExceptionUtils.getStackTrace(e)}")
        metrics.incKafkaErrorCounter(e.getClass.getName)
    }
  }

  override def receive: Receive = {
    case rec: ProducerRecord[GenericRecord,GenericRecord] =>
      handleErrs(avroProducer.produce(rec))

    case ProducerRecordJson(topic,key,content) =>
      handleErrs(jsonProducer.produce(new ProducerRecord[String,String](topic,content)))
  }
}

此外,我正在尝试使用actorSystem来获取actorRef:

  val kafka: ActorRef = actorSystem.actorOf(KafkaProducerActor.props,name = "kafkaProducerActor")

对于我在KafkaProducerActor中定义的内容:

object KafkaProducerActor {
  def props: Props = Props(classOf[KafkaProducerActor])
}

警告以下内容:

找不到合适的actor构造函数,可能是动态调用 替换为构造函数调用

当用构造函数调用替换动态调用时(如编译器建议),即

object KafkaProducerActor {
  def props: Props = Props(new KafkaProducerActor())
}

我收到编译错误:

未指定的值参数:avroProducer:MyKafkaProducerAvro,jsonProducer:MyKafkaProducerJson,指标:PrometheusMetricsService

在这种情况下启动道具的正确方法是什么?

解决方法

您应该在调用KafkaProducerActor.props的上下文中注入服务,并将其作为参数传递。

或者只是将其手动注入到构造函数中,但是您需要为此进行静态全局注入。您可以使用这样的助手来实现它:

object InjectHelper {
    lazy val injector: Injector = {
        val moduleInstance: com.google.inject.Module = ??? // somehow get  your guice module
        Guice.createInjector(moduleInstance)
    }

    def inject[T](implicit mf: Manifest[T]): T =
        InjectHelper.injector.getInstance(mf.runtimeClass).asInstanceOf[T]
}

object KafkaProducerActor {
  def props: Props = Props(
    new KafkaProducerActor(
      InjectHelper.inject[MyKafkaProducerAvro],InjectHelper.inject[MyKafkaProducerJson],InjectHelper.inject[PrometheusMetricsService]
    )
  )
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...