package chat.module; import java.sql.Connection; import java.util.concurrent.Executors; import org.apache.log4j.Logger; import chat.message.MessageRunner; import chat.message.MessagesPublisher; import chat.module.entity.ChatSpaceType; import chat.module.entity.FriendShip; import chat.module.entity.GroupType; import chat.module.entity.MessageContainer; import chat.module.friendcircle.FriendCircle; import chat.user.ClientStore; import chat.user.NotifyStore; import chat.user.User; import chat.user.UserStore; import chat.util.DBUtil; import frame.object.data.Entity; import frame.object.data.EntitySet; import frame.persist.NamedSQL; import frame.persist.SQLRunner; public class ModuleLoader { private static Logger logger; private static PrivateFriendBucket privateFriendBucket; private static String cachedSpaceId; private static MessageContainer cachedContainer; private static String cachedUserId; private static User cachedUser; public static Connection connDB; private static MessageRunner imBusinessScheduler; private static MessagesPublisher messagePublisher; static { logger = Logger.getLogger(ModuleLoader.class); privateFriendBucket = PrivateFriendBucket.getInstance(); } public static PrivateFriendBucket getPrivateFriendBucket() { return privateFriendBucket; } public static void setPrivateFriendBucket(PrivateFriendBucket privateFriendBucket) { ModuleLoader.privateFriendBucket = privateFriendBucket; } public static void load() throws Exception { //1. loadUser(); loadClient(); loadNotify(); //2.群组 loadChatSpace(); //3.群组成员 loadMember(); //4.群组消息 loadMessage(); //5. 群组消息关系 loadMessageRelation(); //6.加好友关系 LoadFriendShip(); //7.加朋友圈 LoadFriendCircle(); //8.加数据库连接 connDB = LoadDBConn(); //9.加载执行线程池 int threadNum = Runtime.getRuntime().availableProcessors() * 2; imBusinessScheduler = new MessageRunner(Executors.newScheduledThreadPool(threadNum)); //10.实例化消息发送 messagePublisher = new MessagesPublisher(); } private static Connection LoadDBConn() throws Exception { DBUtil dbUtil = new DBUtil(); Connection conn = dbUtil.getConnection(); return conn; } private static void loadUser() throws Exception { NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("usr"); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); int cnt = 0; for (Entity entity: entitySet) { UserStore.loadOne(entity); cnt++; } if (logger.isDebugEnabled()) { logger.debug("load user: " + cnt); } } private static void loadClient() throws Exception { NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("client"); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); int cnt = 0; for (Entity entity: entitySet) { ClientStore.loadOne(entity); cnt++; } if (logger.isDebugEnabled()) { logger.debug("load client: " + cnt); } } private static void loadNotify() throws Exception { NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("notify"); namedSQL.setFilter("isread = 'F' "); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); int cnt = 0; for (Entity entity: entitySet) { NotifyStore.loadOne(entity); cnt++; } if (logger.isDebugEnabled()) { logger.debug("load client: " + cnt); } } private static void loadChatSpace() throws Exception { int cnt = 0; ChatSpaceType spaceType; NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("chatSpace"); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); for (Entity entity: entitySet) { spaceType = ChatSpaceType.pase(entity.getString("typeCode")); if (ChatSpaceType.Private == spaceType) {//私聊 privateFriendBucket.load(entity); } else if (ChatSpaceType.GroupDoctor == spaceType) {//医生群 GroupBucket.load(GroupType.Doctor, entity); } else if (ChatSpaceType.GroupPatient == spaceType) {//患者群 GroupBucket.load(GroupType.Patient, entity); } else if (ChatSpaceType.GroupFriend == spaceType) {//朋友群 GroupBucket.load(GroupType.Friend, entity); } else if (ChatSpaceType.Assistant == spaceType) {//医助 } else if (ChatSpaceType.Channel == spaceType) {//频道 } else if (ChatSpaceType.ChatRoom == spaceType) {//聊天室 } else if (ChatSpaceType.FriendCircle == spaceType) {//朋友圈 } cnt++; } if (logger.isDebugEnabled()) { logger.debug("load chat space: " + cnt); } } private static void loadMember() throws Exception { //1.私聊 doLoadMember(ChatSpaceType.Private, privateFriendBucket); //2.医生群组 doLoadMember(ChatSpaceType.GroupDoctor, GroupBucket.getInstance(GroupType.Doctor)); //3.患者群组 doLoadMember(ChatSpaceType.GroupPatient, GroupBucket.getInstance(GroupType.Patient)); //4.朋友群组 doLoadMember(ChatSpaceType.GroupFriend, GroupBucket.getInstance(GroupType.Friend)); } private static void doLoadMember(ChatSpaceType spaceType, Bucket spaceBucket) throws Exception { String spaceId; MessageContainer messageContainer; NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("member").setOrderBy("spaceid"); namedSQL.setFilter("spacecode = '" + spaceType + "' "); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); for (Entity entity: entitySet) { spaceId = entity.getString("spaceid"); messageContainer = getMessageContainer(spaceBucket, spaceId); messageContainer.loadOneMember(entity); } } private static void loadMessage() throws Exception { doLoadMessage(ChatSpaceType.Private, privateFriendBucket); doLoadMessage(ChatSpaceType.GroupDoctor, GroupBucket.getInstance(GroupType.Doctor)); doLoadMessage(ChatSpaceType.GroupPatient, GroupBucket.getInstance(GroupType.Patient)); doLoadMessage(ChatSpaceType.GroupFriend, GroupBucket.getInstance(GroupType.Friend)); } private static void doLoadMessage(ChatSpaceType spaceType, Bucket spaceBucket) throws Exception { String spaceId; MessageContainer messageContainer; NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("message").setOrderBy("spaceid, createtime asc"); namedSQL.setFilter("TO_DAYS(NOW()) - TO_DAYS(createtime) >= 0 and spacecode = '" + spaceType + "' "); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); for (Entity entity: entitySet) { spaceId = entity.getString("spaceid"); messageContainer = getMessageContainer(spaceBucket, spaceId); messageContainer.loadOneMessage(entity); } } //消息关系 Private, GroupDoctor, GroupPatient, GroupFriend, Assistant, Channel, ChatRoom, FriendCircle, Unknown; private static void loadMessageRelation() throws Exception { //1.私聊 doLoadMessageRelation(ChatSpaceType.Private, privateFriendBucket); //2.医生群组 doLoadMessageRelation(ChatSpaceType.GroupDoctor, GroupBucket.getInstance(GroupType.Doctor)); //3.患者群组 doLoadMessageRelation(ChatSpaceType.GroupPatient, GroupBucket.getInstance(GroupType.Patient)); //4.朋友群组 doLoadMessageRelation(ChatSpaceType.GroupFriend, GroupBucket.getInstance(GroupType.Friend)); } private static void doLoadMessageRelation(ChatSpaceType spaceType, Bucket spaceBucket) throws Exception { String spaceId; MessageContainer messageContainer; NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("messagerelation").setOrderBy("spaceid, receivetime asc"); namedSQL.setFilter("TO_DAYS(NOW()) - TO_DAYS(receivetime) >=0 and spacecode = '" + spaceType + "' "); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); for (Entity entity : entitySet) { spaceId = entity.getString("spaceid"); if (spaceId == null) { continue; } messageContainer = getMessageContainer(spaceBucket, spaceId); messageContainer.loadOneMessageRelation(entity); } } private static void LoadFriendShip() throws Exception { NamedSQL namedSQL = NamedSQL.getInstance("getActiveFriendship"); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); User user, friend; FriendShip friendShip; for (Entity entity : entitySet) { //1. user = getUser(entity.getString("userId")); //friend = UserStore.getById(entity.getString("friendId")); friend = getUser(entity.getString("friendId")); if (user == null || friend == null) { continue; } //如果,朋友关系还处于审请状态,那么,将信息加入到朋友推送list中 if ("apply".equals(entity.getString("statuscode"))) { friendShip = new FriendShip(); friendShip.load(entity); user.addOnePushFriendShip(user.getId(), friendShip); continue; } friendShip = new FriendShip(); friendShip.load(entity); //user.addOneFrieldShip(friend.getId(), friendShip); user.addOneFrieldShip(user.getId(), friendShip); friendShip = friendShip.getReverseInstance(); friend.addOneFrieldShip(friendShip.getUserid(), friendShip); } } private static void LoadFriendCircle() throws Exception { NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet"); namedSQL.setTableName("friendcircle").setOrderBy("senderid, createtime asc"); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); String userId; User user; FriendCircle friendCircle; for (Entity entity : entitySet) { userId = entity.getString("senderid"); user = UserStore.getCachedById(userId); if (user == null) { continue; } friendCircle = user.getFriendCircle(); friendCircle.loadOneCricleObject(entity); } } private static MessageContainer getMessageContainer(Bucket spaceBucket, String spaceId) { if (spaceId.equals(cachedSpaceId)) { return cachedContainer; } cachedSpaceId = spaceId; cachedContainer = spaceBucket.getOne(cachedSpaceId); return cachedContainer; } private static User getUser(String userId) { if (userId.equals(cachedUserId)) { return cachedUser; } cachedUserId = userId; cachedUser = UserStore.getById(cachedUserId); return cachedUser; } public static MessageRunner getImBusinessScheduler() { return imBusinessScheduler; } public static void setImBusinessScheduler(MessageRunner imBusinessScheduler) { ModuleLoader.imBusinessScheduler = imBusinessScheduler; } public static MessagesPublisher getMessagePublisher() { return messagePublisher; } public static void setMessagePublisher(MessagesPublisher messagePublisher) { ModuleLoader.messagePublisher = messagePublisher; } }