Akka-bbb-apps模块介绍
在分析这个模块时,首先找到这个模块程序的入口程序 ,它是 Boot.scala中的 Boot. 这是由SprintBoot这个框架决定的。
在分析Boot之前 ,要先了解akka中的 actor 和 bus 的概念。
object Boot extends App with SystemConfiguration {
implicit val system = ActorSystem("bigbluebutton-apps-system")
implicit val executor = system.dispatcher
val logger = Logging(system, getClass)
val eventBus = new InMsgBusGW(new IncomingEventBusImp())
val outBus2 = new OutEventBus2
val recordingEventBus = new RecordingEventBus
val outGW = new OutMessageGatewayImp(outBus2)
val redisPublisher = new RedisPublisher(system, "BbbAppsAkkaPub")
val msgSender = new MessageSender(redisPublisher)
val redisRecorderActor = system.actorOf(RedisRecorderActor.props(system), "redisRecorderActor")
recordingEventBus.subscribe(redisRecorderActor, outMessageChannel)
val incomingJsonMessageBus = new IncomingJsonMessageBus
val bbbMsgBus = new BbbMsgRouterEventBus
val fromAkkaAppsMsgSenderActorRef = system.actorOf(FromAkkaAppsMsgSenderActor.props(msgSender))
val analyticsActorRef = system.actorOf(AnalyticsActor.props())
outBus2.subscribe(fromAkkaAppsMsgSenderActorRef, outBbbMsgMsgChannel)
outBus2.subscribe(redisRecorderActor, recordServiceMessageChannel)
outBus2.subscribe(analyticsActorRef, outBbbMsgMsgChannel)
bbbMsgBus.subscribe(analyticsActorRef, analyticsChannel)
val bbbActor = system.actorOf(BigBlueButtonActor.props(system, eventBus, bbbMsgBus, outGW), "bigbluebutton-actor")
eventBus.subscribe(bbbActor, meetingManagerChannel)
val redisMessageHandlerActor = system.actorOf(ReceivedJsonMsgHandlerActor.props(bbbMsgBus, incomingJsonMessageBus))
incomingJsonMessageBus.subscribe(redisMessageHandlerActor, toAkkaAppsJsonChannel)
val redisSubscriberActor = system.actorOf(AppsRedisSubscriberActor.props(system, incomingJsonMessageBus), "redis-subscriber")
}
首先看Boot的最后一句:它在构造 AppsRedisSubscriberActor 时会调用 subscript()订阅相关的通道,收到外部的事件,然后传入apps内部。
具体细节:
AppsRedisSubscriberActor 继承了 RedisSubscripberProvider(位置在bbb-common-message/sr/main/scala/org/bigbluebutton/common2/redis/RedisSubScriberProvider.scala)
看 RedisSubscriterProvider的订阅方法:
可以看到它是用redis的subscripe 订阅相关的通道()。
toAkkaTranscodeRedisChannel,fromVoiceConfRedisChannel,toAkkaAppsJsonChannel
从名称可以看到分别是 转码相关,声音相关,和指发到这模块的通道。
在收到消息后利用incomingJsonMessageBus将消息发布出去,现在就到了apps模块内部来处理这些消息了。 代码如图所示。
再分析处理接着处理消息的 actor ReceivedJsonMsgHandlerActor.
这个actor 也只是消息根据类型分发到eventBus的 不同通道中,在用户真正进入到会议室之前 的发布到了meetingManagerChanne通道,比如会议室的创建,用户进入时的验证等消息,用户进入到会议室之后的操作发布到了以会议室ID命名的通道。比如用户聊天 ,投票等消息。 还有声音相关的被分发 voiceConf 的通道。
多发了一个 anylyticsEvent事件,这个事件主要是用来记录的,处理这个事件的actor只是将事件存入到Log文件中,只是用于记录事件log. 这个事件先不做分析。
消息现在到了eventbus ,接着往下分析eventbus中消息的处理。
在处理创建会议室时又使evetbus订阅了 会议室id,voiceCOnf,screensahreConf通道。 也就是说在用户进入后的所有操作的消息处理都在 RunningMeeting 的 MeetingActor 中。
消息的处理过程大多数是权限检测,数据检测等,然后通过后在apps模块新增相应的数据。 然后再将处理结果 发送出去。
再来分析发送消息出去的过程:
通过outGW 发送到 outBus2 的 meetingManagerChannel,然后再到 FromAkkaAppsMsgSenderActor 通过 msgSender 发送到redis 中去。