Ver Fonte

修复redis配置功能在redis配置了 notify-keyspace-events时无法强制配置的问题

648540858 há 3 anos atrás
pai
commit
7e428f8231

+ 41 - 0
src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java

@@ -0,0 +1,41 @@
+package com.genersoft.iot.vmp.conf;
+
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.util.StringUtils;
+
+import java.util.Properties;
+
+public class RedisKeyExpirationEventMessageListener extends KeyExpirationEventMessageListener {
+
+    private UserSetup userSetup;
+    private RedisMessageListenerContainer listenerContainer;
+    private String keyspaceNotificationsConfigParameter = "EA";
+
+    public RedisKeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) {
+        super(listenerContainer);
+        this.listenerContainer = listenerContainer;
+        this.userSetup = userSetup;
+    }
+
+    @Override
+    public void init() {
+        if (!userSetup.getRedisConfig()) {
+            // 配置springboot默认Config为空,即不让应用去修改redis的默认配置,因为Redis服务出于安全会禁用CONFIG命令给远程用户使用
+            setKeyspaceNotificationsConfigParameter("");
+        }else {
+
+            RedisConnection connection = this.listenerContainer.getConnectionFactory().getConnection();
+            Properties config = connection.getConfig("notify-keyspace-events");
+            try {
+                if (!config.getProperty("notify-keyspace-events").equals(keyspaceNotificationsConfigParameter)) {
+                    connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
+                }
+            } finally {
+                connection.close();
+            }
+        }
+        super.init();
+    }
+}

+ 8 - 12
src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java

@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.event.offline;
 
+import com.genersoft.iot.vmp.conf.RedisKeyExpirationEventMessageListener;
 import com.genersoft.iot.vmp.conf.UserSetup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -7,12 +8,16 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.DependsOn;
 import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.connection.RedisConnection;
 import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
 import org.springframework.stereotype.Component;
 
 import com.genersoft.iot.vmp.common.VideoManagerConstants;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import org.springframework.util.StringUtils;
+
+import java.util.Properties;
 
 /**    
  * @description:设备心跳超时监听,借助redis过期特性,进行监听,监听到说明设备心跳超时,发送离线事件
@@ -20,7 +25,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
  * @date:   2020年5月6日 上午11:35:46     
  */
 @Component
-public class KeepaliveTimeoutListenerForPlatform extends KeyExpirationEventMessageListener {
+public class KeepaliveTimeoutListenerForPlatform extends RedisKeyExpirationEventMessageListener {
 
     private Logger logger = LoggerFactory.getLogger(KeepaliveTimeoutListenerForPlatform.class);
 
@@ -30,17 +35,8 @@ public class KeepaliveTimeoutListenerForPlatform extends KeyExpirationEventMessa
 	@Autowired
 	private UserSetup userSetup;
 
-    @Override
-    public void init() {
-        if (!userSetup.getRedisConfig()) {
-            // 配置springboot默认Config为空,即不让应用去修改redis的默认配置,因为Redis服务出于安全会禁用CONFIG命令给远程用户使用
-            setKeyspaceNotificationsConfigParameter("");
-        }
-        super.init();
-    }
-
-    public KeepaliveTimeoutListenerForPlatform(RedisMessageListenerContainer listenerContainer) {
-        super(listenerContainer);
+    public KeepaliveTimeoutListenerForPlatform(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) {
+        super(listenerContainer, userSetup);
     }
 
 

+ 6 - 4
src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java

@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.event.offline;
 
+import com.genersoft.iot.vmp.conf.RedisKeyExpirationEventMessageListener;
 import com.genersoft.iot.vmp.conf.UserSetup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,7 +21,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
  * @date:   2020年5月6日 上午11:35:46     
  */
 @Component
-public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
+public class KeepliveTimeoutListener extends RedisKeyExpirationEventMessageListener {
 
     private Logger logger = LoggerFactory.getLogger(KeepliveTimeoutListener.class);
 
@@ -30,6 +31,10 @@ public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
 	@Autowired
 	private UserSetup userSetup;
 
+    public KeepliveTimeoutListener(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) {
+        super(listenerContainer, userSetup);
+    }
+
     @Override
     public void init() {
         if (!userSetup.getRedisConfig()) {
@@ -39,9 +44,6 @@ public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
         super.init();
     }
 
-	public KeepliveTimeoutListener(RedisMessageListenerContainer listenerContainer) {
-		super(listenerContainer);
-	}
 
 	/**
      * 监听失效的key,key格式为keeplive_deviceId

+ 5 - 12
src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMKeepliveTimeoutListener.java

@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.media.zlm.event;
 
 import com.alibaba.fastjson.JSONObject;
 import com.genersoft.iot.vmp.common.VideoManagerConstants;
+import com.genersoft.iot.vmp.conf.RedisKeyExpirationEventMessageListener;
 import com.genersoft.iot.vmp.conf.UserSetup;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
@@ -21,7 +22,7 @@ import org.springframework.stereotype.Component;
  * @date:   2020年5月6日 上午11:35:46     
  */
 @Component
-public class ZLMKeepliveTimeoutListener extends KeyExpirationEventMessageListener {
+public class ZLMKeepliveTimeoutListener extends RedisKeyExpirationEventMessageListener {
 
     private Logger logger = LoggerFactory.getLogger(ZLMKeepliveTimeoutListener.class);
 
@@ -37,20 +38,12 @@ public class ZLMKeepliveTimeoutListener extends KeyExpirationEventMessageListene
 	@Autowired
 	private IMediaServerService mediaServerService;
 
-    @Override
-    public void init() {
-        if (!userSetup.getRedisConfig()) {
-            // 配置springboot默认Config为空,即不让应用去修改redis的默认配置,因为Redis服务出于安全会禁用CONFIG命令给远程用户使用
-            setKeyspaceNotificationsConfigParameter("");
-        }
-        super.init();
+    public ZLMKeepliveTimeoutListener(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) {
+        super(listenerContainer, userSetup);
     }
 
-	public ZLMKeepliveTimeoutListener(RedisMessageListenerContainer listenerContainer) {
-		super(listenerContainer);
-	}
 
-	/**
+    /**
      * 监听失效的key,key格式为keeplive_deviceId
      * @param message
      * @param pattern