使用 Springboot 的 Schedule websocket push

我想在前端创建一个简单的新闻提要功能,该功能将通过websocket推送通知自动更新。

所涉及的技术包括:

  • 用于一般前端应用的角度
  • 用于创建 websocket 通信的 SockJS
  • 踩踏 webosocket 以从消息代理接收消息
  • Springboot Websockets
  • 踩踏消息代理(Java 相关框架)

我想在前端实现的是:

  1. 加载视图时创建 websocket 连接
  2. 使用该 websocket 创建 s 踩踏提供程序
  3. 让我的客户订阅它
  4. 捕获服务器推送的消息并更新角度视图

至于服务器端代码:

  1. 配置 websocket 内容并管理连接
  2. 让服务器每隔 X 次推送消息(通过执行程序或 ?)。@Scheduled

我认为到目前为止,除了服务器端代码的最后一部分之外,我已经实现了一切。我遵循的示例在全双工模式下使用 websocket,当客户端发送内容时,服务器会立即响应消息队列,并且所有订阅的客户端都会更新。但我想要的是服务器本身发送一些东西,而不必等待客户端发出任何请求。Stomp

起初,我创建了一个弹簧,并添加了一个带有注释的方法。但是,我不知道如何触发它。我也尝试添加,但此注释仅适用于具有返回类型的方法(并且我返回的是NewsMessage对象)。@Controller@SendTo("/my/subscribed/path")@Scheduledvoid

从本质上讲,我需要的是让客户端初始化websocket连接,并在服务器以设定的时间间隔开始通过它推送消息之后(或者每当触发事件时,现在都无关紧要)。此外,每个新客户端都应侦听相同的消息队列并接收相同的消息。


答案 1

在开始之前,请确保在 中具有 websocket 依赖项。例如,最重要的一个:pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

然后,您需要准备好配置。我建议你从简单的经纪人开始。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

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

}

然后,您的控制器应如下所示。当你的应用打开连接并发送订阅到频道时,你将到达控制器并响应所有订阅的用户。AngularJs/portfolio/topic/greeting

@Controller
public class GreetingController {
    
    @MessageMapping("/greeting")
    public String handle(String greeting) {
        return "[" + getTimestamp() + ": " + greeting;
    }
}

关于调度程序问题,您需要通过配置启用它:

@Configuration
@EnableScheduling
public class SchedulerConfig{}

然后安排它:

@Component
public class ScheduledUpdatesOnTopic{

    @Autowired
    private SimpMessagingTemplate template;
    @Autowired
    private final MessagesSupplier messagesSupplier;

    @Scheduled(fixedDelay=300)
    public void publishUpdates(){
        template.convertAndSend("/topic/greetings", messagesSupplier.get());
    }
}

希望这以某种方式澄清了概念和要采取的步骤,以使事情为您服务。


答案 2

首先,如果没有客户端的订阅,则无法向客户端发送(推送)消息。

其次,要向所有订阅者发送消息,您应该查看抽象端。topic

这是 STOMP 的基本原理。

我认为您很好,但是您只需要注入以将消息发送到STOMP代理以进行之后推送。@ScheduledSimpMessagingTemplate

另请参阅 Spring WebSockets XML 配置不提供代理MessagingTemplate


推荐