|
@@ -1,16 +1,36 @@
|
|
|
package com.cn;
|
|
|
|
|
|
import com.cn.config.PropertyDataBaseConfigBuilder;
|
|
|
+import com.cn.job.PrintWordsJob;
|
|
|
import com.cn.listener.IMChatGroupListener;
|
|
|
import com.cn.processor.IMChatWsHandshakeProcessor;
|
|
|
import com.cn.service.IMChatLoginServiceProcessor;
|
|
|
+import nl.basjes.shaded.org.springframework.util.CollectionUtils;
|
|
|
+import org.jim.common.ImAio;
|
|
|
import org.jim.common.ImConfig;
|
|
|
+import org.jim.common.ImPacket;
|
|
|
+import org.jim.common.cache.redis.JedisTemplate;
|
|
|
import org.jim.common.config.PropertyImConfigBuilder;
|
|
|
+import org.jim.common.packets.CloseReqBody;
|
|
|
import org.jim.common.packets.Command;
|
|
|
import org.jim.server.ImServerStarter;
|
|
|
import org.jim.server.command.CommandManager;
|
|
|
+import org.jim.server.command.handler.CloseReqHandler;
|
|
|
import org.jim.server.command.handler.HandshakeReqHandler;
|
|
|
+import org.jim.server.command.handler.JoinGroupReqHandler;
|
|
|
import org.jim.server.command.handler.LoginReqHandler;
|
|
|
+import org.quartz.*;
|
|
|
+import org.quartz.impl.StdSchedulerFactory;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.tio.core.Aio;
|
|
|
+import org.tio.core.ChannelContext;
|
|
|
+import org.tio.utils.lock.SetWithLock;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
|
|
|
|
|
|
/**
|
|
|
* @author Darren
|
|
@@ -18,6 +38,21 @@ import org.jim.server.command.handler.LoginReqHandler;
|
|
|
*/
|
|
|
public class ServerChatStart {
|
|
|
|
|
|
+ private static JedisTemplate jedisTemplate = null;
|
|
|
+
|
|
|
+ private static Logger logger = LoggerFactory.getLogger(ServerChatStart.class);
|
|
|
+
|
|
|
+ private static final String CURRENT_SYSTEM_ALL_USER_ID = "CURRENT_SYSTEM_ALL_USER_ID";
|
|
|
+
|
|
|
+ static {
|
|
|
+ try {
|
|
|
+ jedisTemplate = JedisTemplate.me();
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.info("JedisTemplate初始化失败!");
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 项目入口
|
|
|
* @param args
|
|
@@ -46,10 +81,77 @@ public class ServerChatStart {
|
|
|
|
|
|
|
|
|
/*****************end *******************************************************************************************/
|
|
|
-
|
|
|
imServerStarter.start();
|
|
|
+ //initQuartz();
|
|
|
+ initRedisData();
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 修改由于程序重启或关闭 而没有 走正常的 关闭请求处理器 的 user
|
|
|
+ * @param
|
|
|
+ * @return {@link }
|
|
|
+ * @author Darren
|
|
|
+ * @date 2020/2/14 12:02
|
|
|
+ */
|
|
|
+ private static void initRedisData(){
|
|
|
+ //修改由于程序重启或关闭 而没有 走正常的 关闭请求处理器 的 user
|
|
|
+ List<String> userIds = jedisTemplate.listGetAll(CURRENT_SYSTEM_ALL_USER_ID);
|
|
|
+ if(!CollectionUtils.isEmpty(userIds)){
|
|
|
+ for (String userId : userIds) {
|
|
|
+ SetWithLock<ChannelContext> channelContexts = ImAio.getChannelContextsByUserId(userId);
|
|
|
+ if( null != channelContexts && channelContexts.size() > 0 ){
|
|
|
+ //获取读锁
|
|
|
+ ReadLock readLock = channelContexts.getLock().readLock();
|
|
|
+ //加锁
|
|
|
+ readLock.lock();
|
|
|
+ try {
|
|
|
+ Set<ChannelContext> channels = channelContexts.getObj();
|
|
|
+ for (ChannelContext channelContext : channels) {
|
|
|
+ ImPacket imPacket = new ImPacket(new CloseReqBody(userId).toByte());
|
|
|
+ CloseReqHandler closeReqHandler = CommandManager.getCommand(Command.COMMAND_CLOSE_REQ, CloseReqHandler.class);
|
|
|
+ closeReqHandler.handler(imPacket,channelContext);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error(e.toString(),e);
|
|
|
+ }finally {
|
|
|
+ //解锁
|
|
|
+ readLock.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 集成 quartz 定时任务启动
|
|
|
+ * @param
|
|
|
+ * @return {@link }
|
|
|
+ * @author Darren
|
|
|
+ * @date 2020/2/13 17:05
|
|
|
+ */
|
|
|
+ private static void initQuartz() throws SchedulerException, InterruptedException {
|
|
|
+ StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
|
|
|
+ Scheduler scheduler = stdSchedulerFactory.getScheduler();
|
|
|
+ JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
|
|
|
+ .withIdentity("job1", "group1").build();
|
|
|
+ // 3、构建Trigger实例,每隔1s执行一次
|
|
|
+ Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
|
|
|
+ .startNow()//立即生效
|
|
|
+ .withSchedule(SimpleScheduleBuilder.simpleSchedule()
|
|
|
+ //每隔1s执行一次
|
|
|
+ .withIntervalInSeconds(2)
|
|
|
+ //一直执行
|
|
|
+ .repeatForever()).build();
|
|
|
+ //4、执行
|
|
|
+ scheduler.scheduleJob(jobDetail, trigger);
|
|
|
+ System.out.println("--------scheduler start ! ------------");
|
|
|
+ scheduler.start();
|
|
|
+ //睡眠
|
|
|
+ TimeUnit.MINUTES.sleep(1);
|
|
|
+ scheduler.shutdown();
|
|
|
+ System.out.println("--------scheduler shutdown ! ------------");
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
}
|