如何从Java对象向客户端发送Spring消息

时间:2019-04-12 22:21:36

标签: java spring multithreading websocket sockjs

我需要使用SimpMessagingTemplate(或JSON格式的任何消息)将对象的踩踏消息发送到我的客户端

但是我的对象不是Controller,并且如果我将类声明为Controller,则由于未设置Bean,我的Spring Boot应用程序无法启动。

我正在为我的本科论文创建一个游戏,该游戏托管在Spring服务器上。在我的应用程序中,我有几个房间,每个房间都有一个运行有一个线程的gameSession。

我目前有一个名为 RoomsController 的类,它可以将预定的消息发送到服务器,就像这样

Sample 1:
1. 100 = 200
2. 150 = 300

Sample 2:
1. 100 = 300
2. 150 = 450
3. 200 = 600

Sample 3:
1. 100 = 400
2. 150 = 600
3. 200 = 800
4. 250 = 1000

没关系,但是我需要我的GameSession对象独立于服务器计时器(因为不同的游戏在不同的时间开始,并且我需要使用游戏滴答声)

我的 GameSession 当前看起来像这样:

@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);
            }
        });
    }
}

但是当它执行时,我在线程中得到了异常

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");
    }
}

由于打勾,我需要每个gameSession直接从gameSession对象发送消息。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

您的GameSession未标记为bean,因此添加@Component或其他构造型注释将其标记为spring bean。

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

    //code here
 }