在Spring中通过Websocket从服务器向客户端发送消息

在Spring中通过Websocket从服务器向客户端发送消息,spring,spring-boot,websocket,spring-websocket,java-websocket,Spring,Spring Boot,Websocket,Spring Websocket,Java Websocket,我的要求是,一旦后端发生变化,就通过web套接字发送(广播)消息 我遵循并利用中的答案提出了一个解决方案,通过定期调用一个方法来发送消息 我的web套接字控制器类-GreetingController类是这样的 @Controller public class GreetingController { @Autowired private SimpMessagingTemplate template; @MessageMapping("/hello") @Se

我的要求是,一旦后端发生变化,就通过web套接字发送(广播)消息

我遵循并利用中的答案提出了一个解决方案,通过定期调用一个方法来发送消息

我的web套接字控制器类-GreetingController类是这样的

@Controller
public class GreetingController {

    @Autowired
    private SimpMessagingTemplate template;

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        FireGreeting r = new FireGreeting( this );
        new Thread(r).start();
        return new Greeting("Hello world !");
    }

    public void fireGreeting() {
        System.out.println("Fire");
        this.template.convertAndSend("/topic/greetings", new Greeting("Fire"));
    }
}
fireGreeting方法在线程类-fireGreeting中调用

public class FireGreeting implements Runnable {

    private GreetingController listener;

    public FireGreeting( GreetingController listener) {
        this.listener = listener;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep( 2000 );
                listener.fireGreeting();
            } catch ( InterruptedException e ) {
                e.printStackTrace();
            }
        }
    }
}
当我运行这个项目时,我可以先发送一条消息,然后线程开始周期性地调用fireGreeting()方法

我不想在不调用问候语(HelloMessage message)方法的情况下, 每当我的后端操作运行时,调用fireGreeting()方法

我尝试单独调用该方法,但它给出了一个空指针异常,因为此时
SimpMessagingTemplate未初始化

我的问题如下:, 1.模板对象何时初始化? (所以我可以做同样的事情,并使用它调用convertAndSend()方法)

  • 像我尝试的那样调用convertAndSend方法是不可能的吗

  • 在spring和websocket中是否有其他方法可以达到此要求

  • 我也试过了,但我对它的工作原理没有一个清晰的理解。 看起来,我可以发送一个POST调用并调用greet()方法,以便它向服务器发送消息。 但我想要的是仅从服务器端调用该方法


    任何有关这方面的建议都会大有帮助。:)

    有点晚了,但我有个问题。 找到了答案

    我可以给出另一个代码示例:

    package xxx.web.websocket;
    
    import xxx.web.websocket.dto.GameEventDTO;
    
    import java.security.Principal;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationListener;
    import org.springframework.messaging.handler.annotation.*;
    import org.springframework.messaging.simp.SimpMessagingTemplate;
    import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.socket.messaging.SessionDisconnectEvent;
    
    @Controller
    public class GameEventService implements ApplicationListener<SessionDisconnectEvent> {
    
        private static final Logger log = LoggerFactory.getLogger(GameEventService.class);
    
        public GameEventService() {
        }
    
        // this method is in all examples : receive from a client, send to all
        @MessageMapping("/topic/eventToServer")
        @SendTo("/topic/eventToClient")
        public GameEventDTO sendGameEvent(@Payload GameEventDTO dto, StompHeaderAccessor stompHeaderAccessor,
                Principal principal) {
            log.debug("Sending game event {}", dto);
            return dto;
        }
    
        @Override
        public void onApplicationEvent(SessionDisconnectEvent event) {
            log.debug("game event SessionDisconnectEvent");
        }
    
        @Autowired
        private SimpMessagingTemplate template;
    
        // the business logic can call this to update all connected clients
        public void sendGameEventFromJava(GameEventDTO dto) {
            log.debug("Sending game event from java {}", dto);
            this.template.convertAndSend("/topic/eventToClient", dto);
        }
    
    }
    
    在您的情况下,SimpMessageTemplate应该是init。 这是一些项目配置问题。 例如,确保您拥有所有maven/graddle组件。 我添加以下内容以将其添加到我的pom.xml中:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
       <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-messaging</artifactId>
        </dependency>
    
    
    org.springframework.boot
    弹簧靴起动器网箱
    org.springframework.security
    spring安全消息
    

    祝所有使用WebSocket的人好运。

    你好。为什么需要在
    ApplicationEventListener
    type类中注入
    SimpMessageTemplate
    ?我也这么做了,但是我的前端没有收到消息。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
       <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-messaging</artifactId>
        </dependency>