Spring STOMP从应用程序的任何位置发送消息

我正在构建一个使用Stomp通过websockets代理消息的应用程序。 我试图从服务器发送消息到客户端,而无需来自应用程序的任何地方的请求。 我在网上找到两个单独的选择,用于从应用程序的任何位置发送消息

第一个是在Websocket文档中找到的。 第20.4.5节:

@Controller public class GreetingController { private SimpMessagingTemplate template; @Autowired public GreetingController(SimpMessagingTemplate template) { this.template = template; } @RequestMapping(value="/greetings", method=POST) public void greet(String greeting) { String text = "[" + getTimestamp() + "]:" + greeting; this.template.convertAndSend("/topic/greetings", text); } } 

第二个是由一位Spring Blogger撰写的指南 :

 @Controller public class GreetingController { @Autowired private SimpMessagingTemplate template; @RequestMapping(value="/greeting", method=POST) public void greet(String greeting) { String text = "[" + getTimeStamp() + "]:" + greeting; this.template.convertAndSend("/topic/greeting", text); } } 

两者都非常相似。 第一个覆盖默认构造函数,不会自动assembly模板初始化。 第二个不会创建新的构造函数,但会自动assembly模板初始化。 我的第一个问题是这两个行为是否相同?

更紧迫的是我无法从任何地方调用“问候”方法。 我尝试过几种不同的方式。

这是第一个:

  public class modifier { @Autowired private HelloController sender; public void adder(String words) throws Exception { sender.greet(words); } } 

在上面的例子中,似乎新的HelloController从未初始化。 在调试时,我发现当adder方法调用“greet”方法时,发送方为null并且我收到空指针exception。

这是我用来设置的另一条路线:

 public class modifier { public void adder(String words) throws Exception { HelloController sender = new HelloController(); sender.greet(words); } 

}

在上面的第二种情况下,在调试之后,还有一个空指针exception,但它不是发送者。 它与sender.template一起使用。 发件人的模板已初始化,但永远不会给出值或ID。 然后在greet中调用this.template.convertAndSend()时,会在this.template上引发空指针exception。

我混合并匹配了控制器的两个实现和我在应用程序中从一个单独的类调用greet方法的两个实现,但没有工作。

有没有人可以解释我的问题? 任何帮助,提示或建议将不胜感激!

提前致谢。

正如在评论中正确编写的那样,有多种方法可以自动连接依赖项,它们大多是等效的,您必须根据需要选择自己喜欢的依赖项。

根据另一个问题:在Spring中,控制器是监听用户请求的对象(单例),因此映射@RequestMapping处理对指定URL的HTTP请求。

如果您需要使用SimpMessagingTemplate对象将消息从服​​务器推送到客户端,您必须知道客户端必须使用STOMP协议(通过websockets),并且必须订阅正确的主题。

事实上,使用STOMP服务器不能将任意消息推送到客户端,但它只能将消息发布到主题,并且客户端必须订阅正确的主题才能接收它们。