scala - 使用带有 akka 道具的 Guice - 找不到合适的演员构造函数
问题描述
我有 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, key, 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,metrics: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]
)
)
}
推荐阅读
- html - 页脚不使用我的侧边栏更改大小
- r - 如何创建一个表,为 R 中的分组值创建单独的条目
- html - 如何在不使用图像的情况下在 css 中创建曲线
- javascript - 用nodejs处理mysql连接
- c# - 带改装的多部分内容
- asp.net - 'IEnumerable
' 不包含 'Alert_Identifier' ... 和 'IEnumerable 的定义 ' 不包含 'AlertIndex' 的定义 - latex - 使用 paracol 和 \setlength{\columnseprule}{} 改变垂直线的颜色
- spring-boot - Spring Boot 1 Actuator 是否在外部 Tomcat 中工作
- reactjs - 无法使用 Create-React-App 在 github 页面中发布我的反应应用程序 - 控制台出现错误
- r - 带置信区间的滚动回归(tidyverse)