使用Spring Boot排程WebSocket推送的教程和原始碼 - Baeldung

發表於2020-12-18

本教程介紹如何使用WebSockets將計劃的訊息從伺服器傳送到瀏覽器。使用Spring的實用程式類SimpMessagingTemplate使通過WebSocket推送伺服器訊息會更容易。

示例的原始碼可 在GitHub上獲得

 

為了推送訊息,我們使用實用程式類SimpMessagingTemplate。預設情況下,它在Spring Context中以@Bean形式提供。當AbstractMessageBrokerConfiguration 在類路徑中時,可用通過自動配置宣告它。這樣就可以將其注入任何Spring元件中。

假設這個實用類注入了一個名為simpMessagingTemplate的變數中,使用它來將訊息釋出到主題/ topic/pushmessages:

simpMessagingTemplate.convertAndSend("/topic/pushmessages", 
  new OutputMessage("Chuck Norris", faker.chuckNorris().fact(), time));

使用SimpMessagingTemplate通過WebSocket傳送OutputMessage 這個POJO訊息, 下面是定義何時傳送訊息,@Scheduled註釋允許的方法重複執行。有了它,我們可以使用基於速率的簡單排程或更復雜的“ cron”表示式。

@Service
public class ScheduledPushMessages {

    @Scheduled(fixedRate = 5000)
    public void sendMessage(SimpMessagingTemplate simpMessagingTemplate, ChuckNorris chuckNorris) {
        String time = new SimpleDateFormat("HH:mm").format(new Date());
        simpMessagingTemplate.convertAndSend("/topic/pushmessages", 
          new OutputMessage("Chuck Norris (@Scheduled)", chuckNorris().fact(), time));
    }
    
}

我們用@Scheduled(fixedRate = 5000)註釋sendMessage方法。這使sendMessage每五秒鐘執行一次。然後,我們使用simpMessagingTemplate例項將OutputMessage傳送到主題。

simpMessagingTemplate 和chuckNorris例項是從Spring上下文作為方法引數注入。

如果使用WebFlux,則可以使用Flux::interval運算子。

以上是核心部分。

 

下面是外圍大概程式碼,下面建立一個伺服器端的API端點:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // ...
        registry.addEndpoint("/chatwithbots");
        registry.addEndpoint("/chatwithbots").withSockJS();
    }
}

客戶端是一個簡單的HTML頁面。它使用SockJS客戶端和STOMP訊息協議。

讓我們看看客戶端如何訂閱主題:

<html>
<head>
    <script src="./js/sockjs-0.3.4.js"></script>
    <script src="./js/stomp.js"></script>
    <script type="text/javascript">
        // ...
        stompClient = Stomp.over(socket);
    
        stompClient.connect({}, function(frame) {
            // ...
            stompClient.subscribe('/topic/pushmessages', function(messageOutput) {
                showMessageOutput(JSON.parse(messageOutput.body));
            });
        });
        // ...
    </script>
</head>
<!-- ... -->
</html>

 

相關文章