gpt4 book ai didi

java - Spring - 在事件上向 websocket 发送消息

转载 作者:行者123 更新时间:2023-11-30 07:49:33 24 4
gpt4 key购买 nike

我有以下情况:每次触发事件时,我都需要在 websocket 上发送消息。

MessageController.java

@Controller
public class MessageController {

@Autowired
private SimpMessagingTemplate template;

@RequestMapping(path="/messages", method=POST)
public void send(String message) {
this.template.convertAndSend("/topic/messages", message);
}
}

KafkaConsumeEventHandler.java

@Component
public class KafkaConsumeEventHandler implements ApplicationListener<KafkaConsumeEvent> {

private static final Logger LOGGER = LoggerFactory.getLogger(KafkaConsumeEventHandler.class);

public void onApplicationEvent(final KafkaConsumeEvent event) {
LOGGER.info("event detected: publishing...");
LOGGER.info("message to be published: {}",event.getMessage());
//INVOKE CONTROLLER TO SEND MESSAGE HERE
LOGGER.info("event published to websocket.");

}

}

是否可以在事件处理函数中调用 Controller 的send()方法?有更好的方法吗?

编辑如果我在事件处理程序( Autowiring SimMessagingTemplate)中执行 this.template.convertAndSend("/topic/messages", message); 我会得到一个 nullPointerException

最佳答案

使用您可以随时调用的方法创建您自己的通信服务类。我所做的是创建一个带有静态发送方法的 CommService

public class CommService {

private static SimpMessagingTemplate template;

public static void setTemplate(SimpMessagingTemplate tmplt) {
template = tmplt;
}

public static void send(String message) {
template.convertAndSend("/topic/messages", message);
}
}

然后你可以通过ContextRefreshHandler初始化CommService

@Component
public class ContextRefreshedHandler implements ApplicationListener<ContextRefreshedEvent> {

private static Logger logger = LoggerFactory.getLogger(ContextRefreshedHandler.class);

@Autowired
private SimpMessagingTemplate template;

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
//Initialize the template for web socket messages
CommService.setTemplate(template);
} catch (Exception ex) {
logger.error(getClass().getName(), ex);
}
}
}

这将在服务器启动时初始化您的模板,然后在您需要发送消息的整个应用程序中初始化您只需使用 CommService.send("message");

因此您可以将 MessageController 更改为此

@Controller
public class MessageController {

@Autowired
private SimpMessagingTemplate template;

@RequestMapping(path="/messages", method=POST)
public void send(String message) {
CommService.send(message);
}
}

关于java - Spring - 在事件上向 websocket 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48406465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com