使用spring WebSocket java将数据从服务器发送到所有客户端

dgsult0t  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(230)

我在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));

    }

    }
}
k3bvogb1

k3bvogb11#

不使用多线程的方法之一

@Controller
public class CountdownWSController {

    private int countdown;
    private SimpMessagingTemplate template;

    public CountdownWSController(Countdown cnt, SimpMessagingTemplate template){
        this.template = template;
        countdown = 60; /* Choose the starting value */
    }

    @Scheduled(fixedRate = 1000)
    public void countDownService() {
            this.template.convertAndSend("/topic/greetings", this.count);
            this.count=this.count-1;

    }

}

然而,用这种方式,如果有两个客户端,即使它们在不同的时间加入通信,计时器也是相同的

相关问题