我在Vert.x
和Kotlin
中是完全的菜鸟。我已经建立了一条ETL管道来从我的学术项目的源API中获取数据,该数据将每天在特定的指定时间运行。提取数据并对其进行一些处理并将其存储在数据库中需要花费多少时间并不确定。有什么方法可以在控制台或文件中记录有关ETL进程状态的信息?我也只有一个端点来显示ETL流程的状态,所以如果可能的话,我也可以使用它!
我不确定该如何处理。我在下面附上我的一些代码片段,这将有所帮助。
程序流程为:组合-> API请求程序->持久化
class Combinator(kodein: Kodein): AbstractVerticle() {
惰性val记录器,由lazy {LoggerFactory.getLogger(this :: class.simpleName)}
override fun start() {
this.publishCombinations()
vertx.undeploy(this.deploymentID())
}
private fun publishCombinations() {
logger.info("Generating requests")
val productRateCombinations = DefinedEnuM.values().flatMap(this::expandTiers)
productRateCombinations.parallelStream().forEach {
vertx.eventBus().send(
"etl.request",
JsonObject(Json.encode(it))
)
}
logger.info("Publishing complete!")
}
private fun expandTiers(Some Input Params): List<Product> {
//Several combinations of those params maker in here...
}
因此,这会将所有组合发送给Requester ... Requester只是将所有值分配给HTTP参数并进行API调用...我得到JSON Data作为响应。我正在根据自己的需要进行修改和提取,并根据我的数据库模式制作了不同的对象,然后将这些对象发送给Persister进行保存。我正在使用与上述相同的方法,使用以下方法从请求者发送到Persister:
vertx.eventBus().send("etl.persist",JsonObject(Json.encode(obj)))
在持久化器中,我将所有作为参数传递的JsonObject作为消息字符串并进行更新/保存。
class Persister(kodein: Kodein): AbstractExpiringVerticle(
TimeUnit.MINUTES.toSeconds(5)) {
private val logger by lazy { LoggerFactory.getLogger(this::class.simpleName) }
private val ebeanServer = kodein.instance<EbeanServer>("project-db")
override fun start() {
vertx.eventBus().consumer<JsonObject>("etl.persist", this::persistFrame)
super.start()
}
private fun persistFrame(message: Message<JsonObject>) {
//saving/updating it in DB... working perfectly....
}
我正在使用cron计划定义此ETL流程的特征。
"pipelines:"[
{
"name": "ETL",
"cron": "0 0/1 * 1/1 * ? *",
"verticles": [
{
"name": "etl.Persister",
"deploymentOptions": {
"instances": 5,
"worker": true
}
}, //same for Requester and Combinator...
一类管道处理程序会在启动过程中对其进行设置后进行查找...
class PipelineManager(val kodein: Kodein): AbstractVerticle() {
companion object {
const val deployPipelineAddress: String = "etl.deploy_pipeline"
}
private val logger by lazy {
LoggerFactory.getLogger(this::class.simpleName) }
private val pipelines by lazy {
config().getJsonArray("pipelines").list as List<JsonObject>
}
/ ** *在启动时,使用cron字符串安排所有任务 *在管道定义中。 * /
override fun start() {
vertx.eventBus().consumer<JsonArray>(
deployPipelineAddress,
this::deployPipeline //The function definition deploys all the verticles and sets them up...
)
vertx.sharedData().getLock(
"etl.cron_deploy",
this::configurePipelines //The function definition configures all the verticles...
)
}
随着该ETL流程自身被自动调用,有没有办法监视它的启动和完成日志信息,以跟踪其是否正常运行。跟踪其活动。手动跟踪非常麻烦,因为我必须不断地照顾它。
任何指导将不胜感激。谢谢。真的需要帮助。谢谢大家。