ChaperoneServiceWorker
里面又将ChaperoneClient
用scala
实现了一遍。增加了将数据存到kafka
和hsqldb
功能。
ChaperoneServiceWorker
项目入口是MirrorMakerWorker
的main
方法。main
方法会创建用户设置的个数的MessageAudit
实例,并调用这些实例的start
方法,start
方法内会不断发送TriggerMsg
,这些message
最后并不会被发送到Topic
内,只是用来触发当前时间是否应该是需要发送的时间点。
main
方法内部还创建了一个MirrorMakerThread
线程,该thread
内会建立一个kafkaStream
,不断的从kafka
拉取数据。并在Disruptor
的帮助下,将这个数据发送给MessageAuditor
的auditMessage
方法处理。MessageAuditor
的auditMessage
方法和ChaperoneClinet
里MessageTracker
的track
方法类似,只是在这里会调用verificationStore.store
。
verificationStore.store
会把数据给真正用来处理的doStore
方法,该方法如下
private def doStore(topicName: String, offsets: util.HashMap[Int, Long], buckets: util.HashMap[Double, TimeBucketMetadata]) {
//buckets [Double, TimeBucketMetadata] key表示bucket beginTimestamp
val auditMsgs = convertToLocalAuditMsg(topicName, buckets)
debug("Converted into LocalAuditMsg=" + auditMsgs)
if (requireExactlyOnce) {
zkOffsetStoreTimer.time {
zkOffsetStore.store(topicName, offsets, auditMsgs)
}
auditMsgStoreTimer.time {
auditMsgStore.store(topicName, auditMsgs)
}
}
auditMsgReporter.reportAuditMsg(async = true, auditMsgs, this)
}
这个方法里会将数据保存到kafka
和hsqldb
,并将数据发送到审计的Topic
。最后会调用AuditMsgStore
的markAuditMsg
方法把hsqldb
内发送的消息标记。