Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-事件发生时向websocket发送消息_Java_Spring_Events_Websocket - Fatal编程技术网

Java Spring-事件发生时向websocket发送消息

Java 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

我遇到以下情况:每次触发事件时,我都需要在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);
    }
}
@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);
    }
  }
}

谢谢,这正是我想要的。