gpt4 book ai didi

java - 使用 Springboot 进行预定的 websocket 推送

转载 作者:IT老高 更新时间:2023-10-28 13:44:54 31 4
gpt4 key购买 nike

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

涉及的技术有:

  • 适用于一般前端应用程序的 Angular
  • 用于创建 websocket 通信的 SockJS
  • 踩过 webosocket 以接收来自消息代理的消息
  • Springboot 网络套接字
  • Stomp Message Broker(java 相关框架)

我想在前端实现的是:

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

就服务器端代码而言:

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

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

起初我创建了一个 spring @Controller 并使用 @SendTo("/my/subscribed/path") 注释向它添加了一个方法。但是我不知道如何触发它。我还尝试添加 @Scheduled 但此注释仅适用于具有 void 返回类型的方法(并且我正在返回 NewsMessage 对象)。

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

最佳答案

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

<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");
}

}

那么你的 Controller 应该是这样的。当您的 AngularJs 应用在 /portfolio 上打开一个连接并向 channel /topic/greeting 发送订阅时,您将到达 Controller 并响应所有订阅用户。

@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());
}
}

希望这以某种方式阐明了使事情对您有用的概念和步骤。

关于java - 使用 Springboot 进行预定的 websocket 推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37307697/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com