websocket 调用redis进行存储数据,实现分发信息
环境:spring boot 2.x
spring默认是单例模式,websocket是多对象模式,直接注入会冲突,空指针异常
首先我们写一个上下文管理
package cn.onefox.util;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Repository;
@Repository
public class SpringUtils implements BeanFactoryPostProcessor {
//Spring应用上下文环境
private static ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringUtils.beanFactory = beanFactory;
}
public static ConfigurableListableBeanFactory getBeanFactory() {
return beanFactory;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) getBeanFactory().getBean(name);
}
public static <T> T getBean(Class<T> clz) throws BeansException {
T result = (T) getBeanFactory().getBean(clz);
return result;
}
}
接下来在websocket中获取实例即可使用了
package cn.onefox.webScoket.config;
import cn.onefox.core.sensor.pageModel.MsensorAlarm;
import cn.onefox.core.webSocket.pageModel.Message;
import cn.onefox.core.webSocket.pageModel.MsensorAlarmSocket;
import cn.onefox.core.webSocket.pageModel.MwebSocketCode;
import cn.onefox.util.SpringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @author zgc
*/
@ServerEndpoint("/webScoket")
@Component
public class WebScoket {
private final Logger logger = LoggerFactory.getLogger(this.getClass());// 日志打印
private RedisTemplate redisTemplate = SpringUtils.getBean(RedisTemplate.class);//获取redis实例
/**
* 开启时根据客户端名称将数据保存redis
*
* @throws IOException
*/
@OnOpen
public void onOpen(Session session) throws IOException {
redisTemplate.opsForHash().put("测试添加","口罩","10");
}
/**
* 客户端调用关闭方法时 在服务端删除该客户端
*/
@OnClose
public void onClose() {
}
/**
* 调用发送消息方法时 执行发送操作
*
* @param message
* @param session
*/
@OnMessage
public void onMessage(String message, Session session) throws IOException {
}
/**
* 发生错误时
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
}
}
这样就可以在websocket中使用redis存储信息了,有问题欢迎指出来。