1.controller
import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Api(tags = "消息发送") @Slf4j @ServerEndpoint(value = "/websocket") @Controller public class MsgWebsocketController { Logger logger = LoggerFactory.getLogger(MsgWebsocketController.class); public static final Map<String, Session> sessions = new ConcurrentHashMap<>(); private Session session; private String userId="1"; @OnOpen public void open(Session session) throws Exception { this.session = session; sessions.put("1", session); } @OnMessage public void sendMessage(String message, Session session) throws IOException { if (null != session) { logger.info("websocket推送消息通知到前端"); session.getBasicRemote().sendText(message); System.out.println(message); } } @OnClose public void close() { sessions.remove(userId); } @OnError public void onError(Throwable error) { logger.error(session.getId() + " 发生错误,errorMessage>>>>{}", error.getMessage()); try { session.close(); } catch (IOException e) { e.printStackTrace(); } } }
2.编写定时任务测试,五秒钟发送一次消息(测试完及时关闭定时任务,会占用资源)。实际场景中哪里要用到就注入MsgWebsocketController,推送消息
import com.chint.controller.MsgWebsocketController; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.IOException; @Component @Slf4j public class GcSchedule { @Autowired private MsgWebsocketController socket; @Scheduled(cron = "*/5 * * * * ?")//定时任务,五秒钟发送一次消息 public void updateCarStatus() throws IOException { socket.sendMessage("告警推送", MsgWebsocketController.sessions.get("1")); } }
3.配置类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * @author * @date 2022-12-12 * @vsrsion 1.0 **/ /** * 开启WebSocket */ @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }
4.pom文件
<!-- websocket消息通讯 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>