我在spring application中创建了一个线程,它在spring Boot 应用程序开始时被调用。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
Thread th = new Thread(new Countdown());
th.start();
}
}
在里面,我创建了一个变量,它每秒减少1。
public class Countdown implements Runnable{
private static volatile int count=0;
@Override
public void run() {
this.runTimer();
}
public void runTimer(){
count=60;
while(count>0){
System.out.println("Countdown : "+count+" "+Thread.currentThread().getId());
try{
count--;
Thread.sleep(1000);
}
catch (Exception e){
System.out.println(e);
}
}
}
}
我想要实现的是,在count--操作之后,我应该能够将count值发送到连接到服务器的所有客户端。计数值应在没有来自客户端的任何请求的情况下发送。
下面是WebSocket配置
@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("/gs-guide-websocket").withSockJS();
}
}
我尝试使用SimpMessageTemplate对象发送计数。但它只在客户端发送请求时才起作用。我试图在count--操作后在Countdown类中使用SimpMessageTemplate对象,但它给了我null异常。
@Controller
public class CountdownWSController {
private Countdown countdown;
private SimpMessagingTemplate template;
public CountdownWSController(Countdown cnt, SimpMessagingTemplate template){
this.template = template;
countdown = cnt;
}
@MessageMapping("/client")
@SendTo("/topic/greetings")
public void countDownService(int count) throws Exception{
this.template.convertAndSend("/topic/greetings", new CountdownModel(count));
}
}
}
1条答案
按热度按时间k3bvogb11#
不使用多线程的方法之一
然而,用这种方式,如果有两个客户端,即使它们在不同的时间加入通信,计时器也是相同的