websocket注入service对象的方法
SpringBoot + WebSocket
本人使用
@Autowired
发现注入不进去,断点发现service对象为null。
猜测是
@ServerEndpoint(value = "/dataWebSocket", encoders = ServerEncoder.class)
这个注解造成的依赖替代。
使用如下方法 亲测可行
启动类的主方法
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(PeehqsApplication.class, args);
DataStatisticsWebSocket.setApplicationContext(run);
}
websocket服务类的配置
@ServerEndpoint(value = "/dataWebSocket", encoders = ServerEncoder.class)
@Component
public class DataStatisticsWebSocket{
private static final Logger LOGGER = LoggerFactory.getLogger(DataStatisticsWebSocket.class);
/**
* 存放所有在线的客户端
*/
private static Map<String, Session> clients = new ConcurrentHashMap<>();
private static ApplicationContext applicationContext;
public static void setApplicationContext(ApplicationContext applicationContext) {
DataStatisticsWebSocket.applicationContext = applicationContext;
}
@OnOpen
public void onOpen(Session session) {
LOGGER.info("有新的客户端连接了dataWebSocket: {}", session.getId());
//将新用户存入在线的组
clients.put(session.getId(), session);
}
/**
* 客户端关闭
* @param session session
*/
@OnClose
public void onClose(Session session) {
LOGGER.info("有用户断开dataWebSocket了, id为:{}", session.getId());
//将掉线的用户移除在线的组里
clients.remove(session.getId());
}
/**
* 发生错误
* @param throwable e
*/
@OnError
public void onError(Throwable throwable) {
LOGGER.error("dataWebSocket发生错误");
}
/**
* 收到客户端发来消息
* @param message 消息对象
*/
@OnMessage
public void onMessage(String message) {
LOGGER.info("dataWebSocket服务端收到客户端发来的消息: {}", message);
DataStatisticsService dataStatisticsService = applicationContext.getBean(DataStatisticsService.class);
dataStatisticsService.statisticsRefresh();
}
/**
* 群发消息
* @param message 消息内容
*/
public void sendAll(String message) {
for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
sessionEntry.getValue().getAsyncRemote().sendText(message);
}
}
/**
* @param message 消息内容
*/
public void sendObject(Object message) {
for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
LOGGER.info("dataWebSocket发送内容:{}",message.toString());
sessionEntry.getValue().getAsyncRemote().sendObject(message);
}
}
/**
* 发送消息
* @param session
* @param message
* @throws IOException
*/
public void sendMessage(Session session, String message) throws IOException {
if(session != null){
try {
session.getAsyncRemote().sendText(message);
}
catch (Exception e) {
LOGGER.error("websocket发送信息失败!{}", e.getMessage());
}
}
}
}
附上 websocket 发送对象的编码类
public class ServerEncoder implements Encoder.Text<OperateResult> {
@Override
public String encode(OperateResult operateResult) {
Object obj = JSONObject.toJSON(operateResult);
return obj.toString();
}
@Override
public void init(EndpointConfig endpointConfig) {
}
@Override
public void destroy() {
}
}