如何使用Spring通过WebSocket向客户端发送消息 [英] How to send message to client through websocket using Spring
问题描述
我尝试将Spring与websocket一起使用.我从本教程开始调查.
I try to use Spring with websocket. I started my investigation with this tutorial.
在我的副客户端中,我有类似的东西来初始化与服务器的连接:
In my side client I have something like that to initialize the connection to the server :
function connect() {
var socket = new SockJS('/myphotos/form');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
}
效果很好,在我的控制器中,我可以按照以下课程进行操作:
It works great, in my controller I’m able to do my process in the following class :
@Controller
@RequestMapping("/")
public class PhotoController {
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
return new Greeting("Hello world !");
}
}
现在我想要做的是有一个线程向侦听"/topic/greeting"的客户端发送消息.我这样写了Runnable类:
Now what I want to do it’s having a thread sending a message to the client listening on "/topic/greeting". I wrote my Runnable class like this :
public class FireGreeting implements Runnable {
private PhotoController listener;
public FireGreeting(PhotoController listener) {
this.listener = listener;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep( 2000 );
listener.fireGreeting();
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
}
并像这样完成我的控制器:
And completed my controller like that :
@Controller
@RequestMapping("/")
public class PhotoController {
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
// added this part
FireGreeting r = new FireGreeting( this );
new Thread(r).start();
return new Greeting("Hello world !");
}
// added this method
@SendTo("/topic/greetings")
public Greeting fireGreeting() {
System.out.println("Fire");
return new Greeting("Fire");
}
}
我需要调用PhotoController.fireGreeting方法,但是客户端没有任何反应. 有什么建议 ?谢谢.
The method PhotoController.fireGreeting is called as I want but nothing happened on the client side. Any suggestions ? Thank you.
推荐答案
感谢@Boris the Spider,我得以解决我的问题.正确的解决方案是执行以下操作:
I was able to solve my problem thanks to @Boris the Spider. The correct solution is to do something like that :
@Controller
@RequestMapping("/")
public class PhotoController {
@Autowired
private SimpMessagingTemplate template;
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
FireGreeting r = new FireGreeting( this );
new Thread(r).start();
return new Greeting("Hello world !");
}
public void fireGreeting() {
System.out.println("Fire");
this.template.convertAndSend("/topic/greetings", new Greeting("Fire"));
}
}
这篇关于如何使用Spring通过WebSocket向客户端发送消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!