@startuml database mongoDB as db participant runDataRecord as rundr participant Process as run participant MainEngine as me participant LogEngine as runle participant DataEngine as dt participant LogEngine as le participant DrEngine as dr participant Queue as drq participant Thread as drt participant eventEngine as ee participant EventProcessThread as eet participant Queue as eeq participant TimerThread as eetm participant ibGateway as gw activate rundr loop rundr->rundr: 检查是否处于时间段 rundr->rundr: 监控子进程是否存在 rundr->run ** : create process activate run rundr->rundr: sleep(5) end loop deactivate rundr run->runle ** : create runle ||| ||| run->ee ** :create evnetEngine object activate ee ee->ee ++ : init() ee->eeq ** : Create Queue ee->eet ** : Create event process thread note right: 事件处理子线程 ee->eetm ** : Create timer thread note right: 定时器子线程 return return object ||| ||| run->me ** : new mainEngine(ee) activate me me->me ++ : init() me->ee ++ : ee.start() note right: 启动ee的子线程 ee->eet ++ #red : thread.start() ee->eetm ++ #green : timer.start() ee-->me--: return me->dt ** :创建DataEngine() activate dt dt->dt ++ : init() return return object me->le ** :创建LogEngine() activate le le->le ++ : init() return return me-->me--:return me-->run--: object ||| ||| run->me: addGateway(ibGateway) activate me return ||| ||| run->me: addApp() activate me return ||| ||| run->ee: ee.regiser() 注册日志处理事件 activate ee return ||| ||| run->me++: me.Connect(IB) note right: 连接IB网关 me->dr**: new DrEngine(me,ee) activate dr dr->dr++:init() dr->drq **:Create Queue dr->drt **:Create Thread activate drt #blue dr->dr:loadSetting() note right 从配置文件中加载 订阅设置到字典对象 end note dr->ee++:register(TICK, handler) return dr-->dr -- : return 'return object dr-->me--: object run<--me--:return ||| ||| run->ee ++ : ee.register(EVENT_LOG, le.processLogEvent) return ||| ||| run->ee ++ : ee.register(EVENT_ERROR, le.processErrorEvent) return ||| ||| loop run->run: sleep(1) end loop deactivate run ||| ||| gw->eeq ++: queue.put(tick/bar) return ||| ||| eetm->ee -- : ee.__runTimer() activate ee #green loop ee->eeq ++ : queue.put(定时器事件) return ee->ee : 休眠1秒 end loop deactivate ee ||| ||| eet->ee--: ee.run() activate ee #red loop ee->eeq ++ :queue.get() return event ee->ee ++ : __process(event) ee->dr ++ #red :call procecssTickEvent() dr->dr ++ :OnTick() dr->drq ++: queue.put(tick) return return dr->dr ++ :OnBar() dr->drq ++: queue.put(bar) return return return return end loop deactivate ee drt->dr -- :run() activate dr #blue loop dr->drq ++ :queue.get() drq-->dr --:data dr->me:insertDB(data) end loop deactivate dr me->db: 写入mongoDB @enduml