[英]Kafka Consumer in play framework using java
我已经在 Java 语言的 play 框架中搜索了数千个站点以获取 kafka 消费者示例。 但找不到任何例子。 任何人都可以提供有关如何编写连续使用 kafka 生成的主题的服务的详细信息。
谢谢
Play 是一个网络框架。 底层的 Actor 系统依赖于 Akka。
Akka Kafka API被称为 Alpakka ,所以我怀疑您在搜索错误的关键字
要将 Akka 和 Play 与 Kafka 结合使用,您甚至可以使用Lagom 框架
否则,当然你也可以使用普通的 Java 消费者,而不管 Play 框架如何
提供有关如何编写持续使用 kafka 生成的主题的服务的详细信息
KafkaConsumer c = new KafkaConsumer(props);
while (true) {
ConsumerRecords r = c.poll(1000);
...
}
最近我也遇到了类似的问题,所以我会在研究后补充一些笔记。
我将描述如何在 Play Framework 中使用普通的 KafkaConsumer(但在 Scala 中不是 Java)。 了解低级组件的工作原理总是值得的,但毕竟我强烈建议您考虑使用像Alpakka这样的库。 例如,在我的上一个项目中,我决定使用基于 Alpakka 的 akka-projection 。 它与 Akka 很好地组合在一起,并为您提供一些额外的价值,例如在失败时轻松配置重启策略。
在 Play Framework 中使用普通的 KafkaConsumer:
KafkaConsumer
Singleton 。 在以下示例中, while
循环在专用线程中运行。 普通KafkaConsumer
在应用程序关闭期间关闭。@Singleton
class SampleKafkaConsumer @Inject()(coordinatedShutdown: CoordinatedShutdown) extends Logging {
logger.info("SampleKafkaConsumer starts")
private val executionContext: ExecutionContext = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
private val stopConsumer: AtomicBoolean = new AtomicBoolean(false)
private val properties = new Properties()
properties.put("bootstrap.servers", "localhost:6003")
properties.put("group.id", s"sample-group-id")
properties.put("key.deserializer", classOf[StringDeserializer])
properties.put("value.deserializer", classOf[StringDeserializer])
val kafkaConsumer = new KafkaConsumer[String, String](properties)
kafkaConsumer.subscribe(Set("sample-topic").asJava)
Future {
while (!stopConsumer.get()) {
kafkaConsumer.poll(Duration.ofSeconds(60)).asScala
.foreach(r => {
logger.info(s"SampleKafkaConsumer receives record: $r")
})
}
logger.info(s"SampleKafkaConsumer quits 'while(true)' loop.")
}(executionContext)
.andThen(_ => kafkaConsumer.close())(executionContext)
.andThen {
case Success(_) =>
logger.info(s"SampleKafkaConsumer succeed.")
case Failure(e) =>
logger.info(s"SampleKafkaConsumer fails.")
}(executionContext)
coordinatedShutdown.addTask(CoordinatedShutdown.PhaseServiceStop, "SampleKafkaConsumer-stop"){() =>
logger.info("Shutdown-task[SampleKafkaConsumer-stop] starts.")
stopConsumer.set(true)
Future{ Done }(executionContext).andThen{
case Success(_) => logger.info("Shutdown-task[SampleKafkaConsumer-stop] succeed.")
case Failure(e) => logger.error("Shutdown-task[SampleKafkaConsumer-stop] fails.", e)
}(executionContext)
}
}
class KafkaModule extends AbstractModule with Logging {
override def configure(): Unit = {
logger.info("Starting KafkaModule")
bind(classOf[SampleKafkaConsumer]).asEagerSingleton()
}
}
3.在播放配置文件中启用您的模块:
play.modules.enabled += "kafka.KafkaModule
这就是全部。 我在这里详细描述了一切。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.