我需要使用SimpMessagingTemplate(或JSON格式的任何消息)将stomp消息从对象发送到我的客户端
但是我的对象不是Controller,如果我将我的类声明为控制器,我的Spring启动应用程序由于没有设置bean而无法启动。
我正在为我的学士论文创建一个游戏,该游戏托管在Spring服务器上。在我的应用程序中,我有房间,每个房间都有一个运行一个线程的gameSession。
我目前有一个名为RoomsController的类,它将预定的消息发送到服务器
@Controller
public class RoomsController {
@Autowired
private SimpMessagingTemplate template;
@Scheduled(fixedRate = 500)
public void updateRoomsInterface() throws Exception {
Game.getInstance().getRooms().forEach((k,v) -> {
if (v != null) {
System.out.println("Ted posilam do room " + k + " ktery se jmenuje " + v.getName() + " cely seznam hracu, schvalne co mi prijde, ok?");
Map <String, Player> playersList = v.getPlayers();
// String message = v.getPlayers().get;
this.template.convertAndSend("/topic/game/room/"+v.getID(), playersList);
}
});
}
}
这有点好,但我需要我的GameSession对象独立于服务器计时器(因为不同的游戏在不同的时间开始,我需要使用游戏的滴答)
我的GameSession目前看起来像这样:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
public class GameSession extends Thread {
@Autowired
private SimpMessagingTemplate template;
private volatile boolean exit = false;
private Room room;
public GameSession(Room room) {
this.room = room;
status = "WAITING";
}
@Override
public void run() {
// dokud ne exit
while (!false) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sendMessage();
}
}
public void sendMessage() {
System.out.println("Does this execute?");
this.template.convertAndSend("/topic/game/room/"+room.getID()+"/session", "THIS IS A TEST");
}
}
但是当这个执行时,我在线程中得到一个异常
Does this execute?
Exception in thread "Thread-6" java.lang.NullPointerException
at cz.vse.pavm07.bp.objects.GameSession.sendMessage(GameSession.java:65)
at cz.vse.pavm07.bp.objects.GameSession.run(GameSession.java:34)
我需要每个gameSession直接从gameSession对象发送消息,因为滴答声。
我究竟做错了什么?
您的GameSession
未标记为bean,因此请添加@Component
或其他构造型注释以将其标记为spring bean。
@Service
public class GameSession extends Thread {
@Autowired
private SimpMessagingTemplate template;
//code here
}