在Spring Boot項目中新建WebSocket服務,可以按照以下詳細步驟進行操作:
1.創建Spring Boot項目
可以通過Spring Initializr(<>)快速創建一個新的Spring Boot項目,添加`Spring Web`和`Spring Boot DevTools`依賴,也可以添加`Lombok`依賴來簡化代碼。
2.添加WebSocket依賴
在`pom.xml`文件中添加Spring Boot WebSocket相關依賴:
```xml
<dependency>
? ? <groupId>org.springframework.boot</groupId>
? ? <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
```
3.配置WebSocket
創建一個配置類來啟用WebSocket支持,并定義處理器和攔截器:
```java
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.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
? ? @Override
? ? public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
? ? ? ? registry.addHandler(myHandler(), "/ws").setAllowedOrigins("*");
? ? }
? ? @Bean
? ? public MyWebSocketHandler myHandler() {
? ? ? ? return new MyWebSocketHandler();
? ? }
? ? @Bean
? ? public ServletServerContainerFactoryBean createWebSocketContainer() {
? ? ? ? ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
? ? ? ? container.setMaxTextMessageBufferSize(8192);
? ? ? ? container.setMaxBinaryMessageBufferSize(8192);
? ? ? ? return container;
? ? }
}
```
在上述代碼中:
? `registerWebSocketHandlers`方法用于注冊WebSocket處理器`MyWebSocketHandler`,并指定WebSocket連接的路徑為`/ws`,同時允許所有來源的連接(`setAllowedOrigins("*")`)。
? `myHandler`方法返回一個`MyWebSocketHandler`實例,該實例是自定義的WebSocket處理器,用于處理WebSocket連接中的各種事件。
? `createWebSocketContainer`方法用于配置WebSocket容器的一些參數,如最大文本消息緩沖區大小和最大二進制消息緩沖區大小。
4.創建WebSocket處理器
創建`MyWebSocketHandler`類,繼承`TextWebSocketHandler`或`WebSocketHandler`,并重寫相應方法來處理WebSocket事件:
```java
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
? ? @Override
? ? public void afterConnectionEstablished(WebSocketSession session) throws Exception {
? ? ? ? super.afterConnectionEstablished(session);
? ? ? ? System.out.println("連接建立:" + session.getId());
? ? }
? ? @Override
? ? protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
? ? ? ? super.handleTextMessage(session, message);
? ? ? ? System.out.println("收到消息:" + message.getPayload());
? ? ? ? session.sendMessage(new TextMessage("服務器已收到消息:" + message.getPayload()));
? ? }
? ? @Override
? ? public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
? ? ? ? super.afterConnectionClosed(session, status);
? ? ? ? System.out.println("連接關閉:" + session.getId());
? ? }
}
```
在上述代碼中:
? `afterConnectionEstablished`方法在WebSocket連接建立后被調用,可以在這里進行一些初始化操作,如打印連接ID。
? `handleTextMessage`方法用于處理客戶端發送的文本消息,可以在這里對消息進行處理,并向客戶端發送響應。
? `afterConnectionClosed`方法在WebSocket連接關閉后被調用,可以在這里進行一些清理操作,如打印連接關閉信息。
5.創建控制器(可選)
如果需要通過HTTP接口觸發WebSocket消息發送,可以創建一個控制器:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebSocketController {
? ? @Autowired
? ? private SimpMessagingTemplate template;
? ? @GetMapping("/send")
? ? public String send(@RequestParam String message) {
? ? ? ? template.convertAndSend("/topic/messages", message);
? ? ? ? return "消息已發送";
? ? }
}
```
在上述代碼中:
? `SimpMessagingTemplate`用于向指定的WebSocket訂閱路徑發送消息。
? `send`方法通過`@GetMapping`注解定義了一個HTTP GET接口`/send`,當訪問該接口時,會將請求參數`message`作為消息發送到WebSocket訂閱路徑`/topic/messages`。
6.前端頁面測試
創建一個簡單的HTML頁面來測試WebSocket連接和消息發送:
```html
<!DOCTYPE html>
<html>
<head>
? ? <title>WebSocket Test</title>
? ? <script>
? ? ? ? var ws = new WebSocket("ws://localhost:8080/ws");
? ? ? ? ws.onopen = function () {
? ? ? ? ? ? console.log("連接已建立");
? ? ? ? };
? ? ? ? ws.onmessage = function (event) {
? ? ? ? ? ? console.log("收到消息:" + event.data);
? ? ? ? };
? ? ? ? ws.onclose = function () {
? ? ? ? ? ? console.log("連接已關閉");
? ? ? ? };
? ? ? ? function sendMessage() {
? ? ? ? ? ? var message = document.getElementById("message").value;
? ? ? ? ? ? ws.send(message);
? ? ? ? }
? ? </script>
</head>
<body>
? ? <h1>WebSocket Test</h1>
? ? <input type="text" id="message" placeholder="輸入消息">
? ? <button οnclick="sendMessage()">發送消息</button>
</body>
</html>
?
定時器
(定時器)主要使用 @Scheduled 注解
啟用定時任務支持 ?在Spring Boot的主類或配置類上添加 @EnableScheduling 注解,以啟用定時任務支持:java復制import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableScheduling
public class ScheduledTaskApplication {
? ? public static void run(String[] args) {
? ? ? ? SpringApplication.run(ScheduledTaskApplication.class, args);
? ? }
}
2. 定義定時任務 ?創建一個類,使用 @Scheduled 注解標記需要定時執行的方法。可以指定任務的執行周期(如固定延遲、固定頻率或Cron表達式):java復制import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledTasks {
? ? // 每5秒執行一次
? ? @Scheduled(fixedRate = 5000)
? ? public void fixedRateTask() {
? ? ? ? System.out.println("Fixed Rate Task executed at: " + new java.util.Date());
? ? }
?