赞
踩
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @Component @Lazy(false) public class WebSocketApplicationContextAware implements ApplicationContextAware { private static ApplicationContext APPLICATION_CONTEXT; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { APPLICATION_CONTEXT = applicationContext; } public static ApplicationContext getApplicationContext() { return APPLICATION_CONTEXT; } }
package com.dataexa.qt.websocket; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration @EnableWebSocket public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }
@Slf4j @Component //注册到容器中 @ServerEndpoint("/webSocket") //接收websocket请求路径 public class WebSocket { //定义一个websocket容器存储session,即存放所有在线的socket连接 private static CopyOnWriteArraySet<Session> webSocketSet = new CopyOnWriteArraySet<>(); private static ApplicationContext applicationContext = WebSocketApplicationContextAware.getApplicationContext(); private Neo4jService neo4jService = (Neo4jService) applicationContext.getBean(Neo4jService.class); //处理连接建立 @OnOpen public void opOpen(Session session) { log.info("【有新的客户端连接了】:{}", session.getId()); //将新用户加入在线组 webSocketSet.add(session); log.info("【websocket消息】有新的连接,总数:{}", webSocketSet.size()); } @Value("${spring.socket.url}") private String url; /* 这一段可加可不加 是用于连接socket的 相当与客户端 */ //启动链接第三方socket //监听在线状态 5 * * * * ? 5秒 , 0 0/5 * * * ? 5分钟 @Scheduled(cron = "0 0/5 * * * ?") public void webSocketStata(){ try { BaseWebsocketClient baseWebsocketClient= new BaseWebsocketClient( new URI(url)); baseWebsocketClient.connect(); while (!baseWebsocketClient.getReadyState().equals(ReadyState.OPEN)){ log.info("链接中...."); Thread.sleep(1000); break; } log.info("状态 :{}",baseWebsocketClient.isOpen()); JSONObject jsonObject=new JSONObject(); if (baseWebsocketClient.isOpen()){ jsonObject.put("code",5); jsonObject.put("data","green"); sendMessage(jsonObject.toJSONString()); }else { jsonObject.put("code",5); jsonObject.put("data","red"); sendMessage(jsonObject.toJSONString()); } } catch (Exception e) { throw new RuntimeException(e); } } //处理连接关闭 @OnClose public void Onclose(Session session) { webSocketSet.remove(session); log.info("【websocket消息】连接断开,总数:{}", webSocketSet.size()); } //接受消息 @OnMessage public void onMessage(String message, Session session) { log.info("【websocket消息】收到客户端发来的消息:{}", message); //根据用户发送回去 session.getBasicRemote().sendText("发送信息"); } //发消息调用即可 public void sendMessage(String message) { try { for (Session session1 : webSocketSet) { session1.getBasicRemote().sendText(message); } } catch (IOException e) { throw new RuntimeException(e); } } }
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@EnableScheduling 这是定时任务注解
@EnableWebSocket socket注解
以上两者同时运用是就需要全部加上注解,单独之加单独即可.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。