在Spring中通过Websocket从服务器向客户端发送消息
我的要求是,一旦后端发生变化,就通过web套接字发送(广播)消息 我遵循并利用中的答案提出了一个解决方案,通过定期调用一个方法来发送消息 我的web套接字控制器类-GreetingController类是这样的在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
@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>