RuoYi-Cloud/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/util/RedisNotifyService.java

143 lines
4.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.ruoyi.util;
import java.util.HashMap;
import java.util.Map;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import com.ruoyi.common.redis.service.RedisService;
/**
* 应用服务器监听从redis上发过来的消息,例如:重读服务的参数,以及一些命令.
* @author 林桦
*
*/
@Component
public class RedisNotifyService implements MessageListener,ISpringLoadComplete {
private static Map<String,IRedisNotifyHandle> registerMap=new HashMap<String,IRedisNotifyHandle>();
private static Logger LOGGER=LoggerFactory.getLogger(RedisNotifyService.class);
public static final String CHANNEL="ruoyiMessageNotify";
private RedisService redisService;
public RedisNotifyService(RedisService redisService) {
this.redisService=redisService;
SpringLoadComplete.addCallBack(this);
}
/**
* 注册具体方法
* @param redisHandle
* @return
*/
public static boolean register(IRedisNotifyHandle redisHandle){
if(registerMap.containsKey(redisHandle.getRegisterId())){
LOGGER.info("已经存在:"+redisHandle.getRegisterId()+",无法注册成功!");
return false;
}else{
LOGGER.info("注册ID:"+redisHandle.getRegisterId()+",注册成功,处理类:"+redisHandle.getClass());
registerMap.put(redisHandle.getRegisterId(), redisHandle);
return true;
}
}
/**
* 取消注册.
* @param redisHandle
* @return
*/
public static boolean unRegister(IRedisNotifyHandle redisHandle){
return unRegister(redisHandle.getRegisterId());
}
/**
* 取消注册
* @param registerId
* @return
*/
public static boolean unRegister(String registerId){
if(registerId==null)
return false;
if(registerMap.containsKey(registerId)){
LOGGER.info("注册ID:"+registerId+",取消注册成功!");
registerMap.remove(registerId);
return true;
} else{
return false;
}
}
/**
* 判断是否有注册
* @param registerId
* @return
*/
public static boolean containRedisHandle(String registerId){
if(registerId==null)
return false;
return registerMap.containsKey(registerId);
}
/**
* 判断是否有注册.
* @param redisHandle
* @return
*/
public static boolean containRedisHandle(IRedisNotifyHandle redisHandle){
return containRedisHandle(redisHandle.getRegisterId());
}
/**
* 发送JsonRpc
* @param method 方法名
* @param params params的参数
*/
public void publish(String method,NutMap params) {
NutMap jsonRpc=NutMap.NEW().addv("method", method).addv("params", params);
redisService.redisTemplate.convertAndSend(CHANNEL,Json.toJson(jsonRpc) );
}
@Override
public void onMessage(Message message, byte[] pattern) {
/**
* Message的消息类型:{ "method": "sayHello", "params": ["Hello JSON-RPC"], "id": 1}
*/
try {
NutMap jsonMessage=Json.fromJson(NutMap.class,new String(message.getBody(),"UTF-8"));
String registerId=jsonMessage.getString("method",null);
if(containRedisHandle(registerId)){
IRedisNotifyHandle redisHandle=registerMap.get(registerId);
if("casLogout".equals(registerId)) //签出的消息比多更改为debug级别.
LOGGER.debug("recive httpServerRedis message:"+message+",submit to handle class:"+redisHandle.getClass());
else
LOGGER.info("recive httpServerRedis message:"+message+",submit to handle class:"+redisHandle.getClass());
NutMap params=Json.fromJson(NutMap.class,jsonMessage.getString("params","{}"));
redisHandle.handle(registerId,params);
} else{
if("casLogout".equals(registerId))
LOGGER.debug("recive httpServerRedis message:"+message+",but not find any handle class");
else
LOGGER.info("recive httpServerRedis message:"+message+",but not find any handle class");
}
} catch(Exception e) {
LOGGER.error("recive httpServerRedis handle error:"+message,e);
}
}
@Override
public void callback(ApplicationContext applicationContext) {
RedisMessageListenerContainer redisMessageListenerContainer=applicationContext.getBean(RedisMessageListenerContainer.class);
redisMessageListenerContainer.addMessageListener(this, new PatternTopic(CHANNEL));
LOGGER.info("启动监听redischannel:"+CHANNEL);
}
}