Как отправить сообщение весны клиенту из объекта Java - PullRequest
0 голосов
/ 13 апреля 2019

Мне нужно отправить 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из-за клещей.

Что я делаю не так?

1 Ответ

0 голосов
/ 13 апреля 2019

Ваш GameSession не помечен как боб, поэтому добавьте @Component или другую аннотацию стереотипа, чтобы отметить его как боб.

@Service
public class GameSession extends Thread {
    @Autowired
    private SimpMessagingTemplate template;

    //code here
 }
...