Openfire推送方案
2021-03-22 14:08:32 0 举报
关于生产者和消费者的线程池处理流程,openfire消息推送
作者其他创作
大纲/内容
未完成
判断Map对象packetProcessors中是否存在packets对应的用户处理线程
processorDone循环结束后判断是否remove掉
packet
入队失败
packets.take()
全局消息推送队列LinkedBlockingQueue
checkPacket校验消息
Thread.sleep(200)
PacketsPushProcessor用户消息推送线程
入队
创建新的PacketsPushProcessor,并加入Map对象中
......
PushMsgRecordManager.saveUpdate
获取队列中的所有消息,推送完成,则结束,并回收线程
用户
getPushParam()封装推送参数
Head
userPacketsQueue.poll()从队首取用户的推送消息
Tail
用户推送消息队列ArrayBlockingQueue
PacketsPushInterceptor推送消息的拦截器
.......
PacketsDistributionProcessor消息调度分发处理线程
packetDistribute(单线程、私有化方法。循环获取packet)
已完成
packetsProcessors.remove移除维护的该线程
出队
sendPacket()通过okHttp发送消息
filterPacket过滤消息
此处根据配置的动态参数选择是否入库
创建新的PacketsPushProcessor线程
pushThreadPool.execute继续留在线程池
用户名称锁
packetsPushProcessor.isDone()判断用户队列是否执行完成
发送消息
无可用用户线程
PushMsgRecordManager.insertRecord
interceptPacket拦截消息
while (!isDone())循环读取
pushThreadPool.exec(放入线程池执行)
PacketsDistributuinProcessor.process(packet)
0 条评论
下一页