Мне нужно отправить stomp-сообщения от объекта моему клиенту, используя SimpMessagingTemplate (или любое сообщение в формате JSON)
Однако мой объект не является контроллером, и если я объявляю свой класс как контроллер,мое загрузочное приложение Spring не запускается из-за не настроенного компонента.
Я создаю игру для своей дипломной работы, которая размещена на сервере 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 были независимы от серверного таймера (потому что разные игры запускаются в разное время, и мне нужно использовать тики игры)
My 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из-за клещей.
Что я делаю не так?