Java Spring-事件发生时向websocket发送消息
我遇到以下情况:每次触发事件时,我都需要在websocket上发送消息 MessageController.javaJava Spring-事件发生时向websocket发送消息,java,spring,events,websocket,Java,Spring,Events,Websocket,我遇到以下情况:每次触发事件时,我都需要在websocket上发送消息 MessageController.java @Controller public class MessageController { @Autowired private SimpMessagingTemplate template; @RequestMapping(path="/messages", method=POST) public void send(String messag
@Controller
public class MessageController {
@Autowired
private SimpMessagingTemplate template;
@RequestMapping(path="/messages", method=POST)
public void send(String message) {
this.template.convertAndSend("/topic/messages", message);
}
}
@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.");
}
}
KafkaConsumeEventHandler.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);
}
}
@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.");
}
}
@组件
公共类KafkaConsumeEventHandler实现ApplicationListener{
私有静态最终记录器Logger=LoggerFactory.getLogger(KafkaConsumeEventHandler.class);
Application event(最终卡夫卡消费事件)的公共无效{
LOGGER.info(“检测到的事件:发布…”);
info(“要发布的消息:{}”,event.getMessage());
//调用控制器在此处发送消息
info(“发布到websocket的事件”);
}
}
是否可以在事件处理程序中调用控制器的send()
方法?有更好的方法吗
编辑
如果我执行
this.template.convertAndSend(“/topic/messages”,message)代码>在事件处理程序(自动连接SimMessagingTemplate)中,我在其上得到一个nullPointerException创建您自己的comm服务类,其中包含可以随时调用的方法。我所做的是创建一个带有静态发送方法的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
@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);
}
}
}
谢谢,这正是我想要的。