sunkean 2 anni fa
parent
commit
49d05c0ece

+ 7 - 0
src/main/java/com/izouma/meta/MetaWebsocketApplicationStartupRunner.java

@@ -1,5 +1,6 @@
 package com.izouma.meta;
 
+import com.izouma.meta.config.Constants;
 import com.izouma.meta.domain.MetaScheduledFuture;
 import com.izouma.meta.enums.ScheduledFutureType;
 import com.izouma.meta.repo.MetaScheduledFutureRepo;
@@ -7,9 +8,11 @@ import com.izouma.meta.web.MMOWebSocketController;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.Set;
 
 @Component
 @AllArgsConstructor
@@ -18,11 +21,15 @@ public class MetaWebsocketApplicationStartupRunner implements CommandLineRunner
 
     private MetaScheduledFutureRepo metaScheduledFutureRepo;
     private MMOWebSocketController  mmoWebSocketController;
+    private RedisTemplate           redisTemplate;
 
     @Override
     public void run(String... args) {
         log.info(">>>>>>>>>>>>>>>服务启动执行<<<<<<<<<<<<<");
         List<MetaScheduledFuture> metaScheduledFutures = metaScheduledFutureRepo.findAllByType(ScheduledFutureType.OBJECT_MOVE);
+        // 删除缓存中信息
+        Set<String> keys = redisTemplate.keys(Constants.REDIS_PREFIX.concat("*"));
+        redisTemplate.delete(keys);
         metaScheduledFutures.forEach(metaScheduledFuture -> {
             log.info(String.format("启动任务 %s", metaScheduledFuture.getType()));
             mmoWebSocketController.startSendingMessages(metaScheduledFuture.getTaskId());

+ 0 - 4
src/main/java/com/izouma/meta/repo/MetaScheduledFutureRepo.java

@@ -4,7 +4,6 @@ import com.izouma.meta.domain.MetaScheduledFuture;
 import com.izouma.meta.enums.ScheduledFutureType;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
 
@@ -12,9 +11,6 @@ public interface MetaScheduledFutureRepo extends JpaRepository<MetaScheduledFutu
 
     MetaScheduledFuture findByTypeAndTaskId(ScheduledFutureType type, String taskId);
 
-    @Query(value = "delete from meta_scheduled_future where m.type = ?1 and m.task_id = ?2", nativeQuery = true)
-    void deleteByTypeAndTaskId(ScheduledFutureType type, String taskId);
-
     List<MetaScheduledFuture> findAllByType(ScheduledFutureType type);
 
 }

+ 4 - 1
src/main/java/com/izouma/meta/web/MMOWebSocketController.java

@@ -54,7 +54,10 @@ public class MMOWebSocketController {
             future.cancel(false);
             tasks.remove(objectId);
         }
-        metaScheduledFutureRepo.deleteByTypeAndTaskId(ScheduledFutureType.OBJECT_MOVE, objectId);
+        MetaScheduledFuture metaScheduledFuture = metaScheduledFutureRepo.findByTypeAndTaskId(ScheduledFutureType.OBJECT_MOVE, objectId);
+        if (Objects.nonNull(metaScheduledFuture)) {
+            metaScheduledFutureRepo.delete(metaScheduledFuture);
+        }
     }
 
     private void sendMessage(String objectId) {

+ 7 - 0
src/main/java/com/izouma/meta/websocket/MMOWebSocket.java

@@ -181,6 +181,9 @@ public class MMOWebSocket {
             String regionId = String.valueOf(metaObjectMove.getRegionId());
             String key = cityId.concat(":").concat(regionId);
             List<String> otherUserIds = remove(key, userId);
+            if (CollectionUtils.isEmpty(otherUserIds)) {
+                return;
+            }
             MetaObjectMoveCoordinate metaObjectMoveCoordinate;
             try {
                 String str = websocketCommon.getRequest("/metaObjectMove/".concat(String.valueOf(metaObjectMove.getObjectId())).concat("/queryCoordinate"));
@@ -324,6 +327,10 @@ public class MMOWebSocket {
         }
         userIds.forEach(id -> {
             try {
+                if (!clients.containsKey(id)) {
+                    log.error("session信息不存在");
+                    return;
+                }
                 log.info(String.format("服务器给所有当前区域内在线用户发送消息, 当前在线人员为: %s, 消息内容: %s", id, JSON.toJSONString(mmoMessage)));
                 clients.get(id).getBasicRemote().sendText(JSON.toJSONString(mmoMessage));
             } catch (Exception e) {