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

Posted

技术标签:

【中文标题】如何从 Java 对象向客户端发送 spring 消息【英文标题】:How do I send a spring message to client from a Java object 【发布时间】:2019-04-12 22:21:35 【问题描述】:

我需要使用 SimpMessagingTemplate(或任何 JSON 格式的消息)从对象向我的客户端发送 stomp 消息

但是我的对象不是控制器,如果我将我的类声明为控制器,我的 Spring boot 应用程序由于未设置 bean 而无法启动。

我正在为我的学士论文创建一个托管在 Spring 服务器上的游戏。在我的应用程序中,我有房间,每个房间都有一个运行一个线程的游戏会话。

我目前有一个名为 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 对象发送消息。

我做错了什么?

【问题讨论】:

【参考方案1】:

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

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

    //code here
 

【讨论】:

以上是关于如何从 Java 对象向客户端发送 spring 消息的主要内容,如果未能解决你的问题,请参考以下文章

如何将音频 blob 从 javascript 发送到 java spring 服务器?

Java - 如何从服务器向客户端发送通知

如何从 Java REST servlet 向 Angular 客户端发送注销消息?

如何使用 Spring WebSocket 向 STOMP 客户端发送错误消息?

Java TCP 打孔

从本机 Java Rest 客户端发送 Http Post [重复]