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