通过Spring Web-Socket定期向客户端发送消息

Sha*_*Zar 16 java spring websocket sockjs spring-boot

我正在尝试通过Spring webSocket在客户端和服务器之间建立连接,我正在通过此链接进行此操作.我希望Controller每隔5秒向客户端发送一个"hello",客户端每次都会将它附加到问候语框中.这是控制器类:

@EnableScheduling
@Controller
public class GreetingController {

    @Scheduled(fixedRate = 5000)
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting() throws Exception {
        Thread.sleep(1000); // simulated delay
        System.out.println("scheduled");
        return new Greeting("Hello");
    }

}
Run Code Online (Sandbox Code Playgroud)

这是app.jsp中的Connect()函数:

function connect() {
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.send("/app/hello", {}, JSON.stringify({'name': "connect"}));
        stompClient.subscribe('/topic/greetings', function (message) {
            console.log("message"+message);
             console.log("message"+(JSON.parse(message.body)));

            showGreeting(JSON.parse(message.body).content);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

当index.jsp加载并按下连接按钮时,只有一次它在问候语中发出问候语,我应该如何让客户端每隔5秒显示一个"hello"消息?

And*_*ici 30

请参阅文档的这一部分.您尝试发送消息的方式完全错误.我会修改你上面的类,如下所示:

@EnableScheduling
@Controller
public class GreetingController {

    @Autowired
    private SimpMessagingTemplate template;

    @Scheduled(fixedRate = 5000)
    public void greeting() {
        Thread.sleep(1000); // simulated delay
        System.out.println("scheduled");
        this.template.convertAndSend("/topic/greetings", "Hello");
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 通过使用@SendTo,该方法仅在将方法作为消息处理程序调用时(即消息来自websocket本身时)将消息发布到该主题.如果希望容器每5秒调用一次该方法并将消息发布到该主题,则必须使用消息传递模板.没有办法绕过它. (7认同)