Procházet zdrojové kódy

增加redis消息订阅,监听异步任务执行时,出现报错信息,返回给前端用户,给予提示

gt před 2 roky
rodič
revize
d9f3b85f13

+ 29 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/MessageReceiver.java

@@ -0,0 +1,29 @@
+package com.judong.chuanyiserver.config;
+
+import com.judong.chuanyiserver.util.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.connection.MessageListener;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class MessageReceiver implements MessageListener {
+
+    private static Logger logger = LoggerFactory.getLogger(MessageReceiver.class);
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    @Override
+    public void onMessage(Message message, byte[] pattern) {
+        logger.info("channel:" + new String(pattern));
+        Result result = (Result) redisTemplate.getValueSerializer().deserialize(message.getBody());
+        System.out.println("接收到的消息是:" + result);
+        logger.info("Received <" + result + ">");
+    }
+}

+ 2 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcAsyncTask.java

@@ -143,6 +143,7 @@ public class OpcAsyncTask {
             }
         } catch (Exception e) {
             e.printStackTrace();
+            redisUtil.convertAndSend(ConstantStr.ITEM_GROUP, Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "组" + itemGroup.getGroupName() + "运行异常,错误信息为:" + e.getMessage()));
         } finally {
             server.dispose();
             redisUtil.del(ConstantStr.ITEM_GROUP + id);
@@ -199,6 +200,7 @@ public class OpcAsyncTask {
             }
         } catch (Exception e) {
             e.printStackTrace();
+            redisUtil.convertAndSend(ConstantStr.ITEM_GROUP, Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "组" + itemGroup.getGroupName() + "运行异常,错误信息为:" + e.getMessage()));
         } finally {
             if (Blank.isNotEmpty(opcUaClient)) {
                 opcUaClient.disconnect();

+ 30 - 2
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/RedisConfig.java

@@ -1,17 +1,46 @@
 package com.judong.chuanyiserver.config;
 
+import com.judong.chuanyiserver.util.ConstantStr;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.listener.PatternTopic;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 @Configuration
 public class RedisConfig {
 
+    /*
+     * Redis消息监听器容器
+     * 这个容器加载了RedisConnectionFactory和消息监听器
+     * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
+     * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
+     */
     @Bean
-    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
+    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter adapter) {
+        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
+        container.setConnectionFactory(connectionFactory);
+        //可以添加多个 messageListener
+        container.addMessageListener(adapter, new PatternTopic(ConstantStr.ITEM_GROUP));
+        return container;
+    }
+
+    /*
+     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
+     * 将MessageReceiver注册为一个消息监听器,可以自定义消息接收的方法(handleMessage)
+     * 如果不指定消息接收的方法,消息监听器会默认的寻找MessageReceiver中的onMessage这个方法作为消息接收的方法
+     */
+    @Bean
+    public MessageListenerAdapter adapter(MessageReceiver messageReceiver) {
+        return new MessageListenerAdapter(messageReceiver, "onMessage");
+    }
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
         //key value序列化方式
         redisTemplate.setKeySerializer(new StringRedisSerializer());
@@ -22,6 +51,5 @@ public class RedisConfig {
         //注入连接工厂
         redisTemplate.setConnectionFactory(redisConnectionFactory);
         return redisTemplate;
-
     }
 }

+ 11 - 11
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/UserServiceImpl.java

@@ -122,8 +122,8 @@ public class UserServiceImpl implements UserService {
     public Result backUserLogin(User user) {
         //获取登陆失败次数
         Integer count = (Integer) redisUtil.get("Number of password errors:" + user.getUserName());
-        if (Blank.isEmpty(count)){
-            count=0;
+        if (Blank.isEmpty(count)) {
+            count = 0;
         }
         try {
             user.setPassword(RSAUtil.decrypt(user.getPassword(), "UTF-8"));
@@ -134,8 +134,8 @@ public class UserServiceImpl implements UserService {
         if (Blank.isEmpty(isExistUser)) {
             //记录登陆失败次数
             count++;
-            if (count>=5){
-                if (count.equals(5)){
+            if (count >= 5) {
+                if (count.equals(5)) {
                     //账号锁定5分钟
                     redisUtil.set("Number of password errors:" + user.getUserName(), count, 300);
                 }
@@ -143,9 +143,9 @@ public class UserServiceImpl implements UserService {
                 long minutes = expire / 60;
                 long second = expire % 60;
                 return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "密码错误次数过多账号已锁定,请" + minutes + "分" + second + "秒后再试");
-            }else {
+            } else {
                 redisUtil.set("Number of password errors:" + user.getUserName(), count, 300);
-                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(),  "密码错误,还可尝试" + (5 - count) + "次");
+                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "密码错误,还可尝试" + (5 - count) + "次");
             }
         }
         if (isExistUser.getUserType() != ConstantStr.BACK_USER) {
@@ -375,7 +375,7 @@ public class UserServiceImpl implements UserService {
     @Override
     public Result relieveUserRoles(List<UserRole> userRoles) {
         Integer num = userDao.deleteByUserIdRoleIds(userRoles);
-        if (num<=0){
+        if (num <= 0) {
             return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "解除角色失败");
         }
         return Result.ok(num);
@@ -391,12 +391,12 @@ public class UserServiceImpl implements UserService {
         } catch (Exception e) {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        if (Blank.isEmpty(oldPassword,newPassword)){
+        if (Blank.isEmpty(oldPassword, newPassword)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据有误");
         }
         //判断原始密码是否正确
         User isExistUser = userDao.getUserByNamePass(user.getUserName(), EncryptUtils.StrToMD5(oldPassword));
-        if (isExistUser==null){
+        if (isExistUser == null) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "旧密码输入错误");
         }
         //修改密码
@@ -408,7 +408,7 @@ public class UserServiceImpl implements UserService {
     @Override
     public Result updatePasswordByAdmin(User user) {
         //判断当前登陆人是否是管理员
-        if (! userUtil.haveAdminRights()){
+        if (!userUtil.haveAdminRights()) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "没有操作权限");
         }
         String newPassword;
@@ -417,7 +417,7 @@ public class UserServiceImpl implements UserService {
         } catch (Exception e) {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        if (Blank.isEmpty(newPassword)){
+        if (Blank.isEmpty(newPassword)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据有误");
         }
         user.setNewPassword(EncryptUtils.StrToMD5(newPassword));