我正在构建一个使用Stomp通过websockets代理消息的应用程序。我试图从服务器向客户端发送消息,而无需来自应用程序的任何位置的请求。我在网上找到了两个单独的选择,用于从应用程序的任何位置发送消息。
第一部分见于Websocket documentation.第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);
}
}
第二个是a guide written by one of the Spring Bloggers:
@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);
}
}
两者非常相似。第一个覆盖默认构造函数,不会自动装配模板初始化。第二个不会创建新的构造函数,但会自动装配模板初始化。我的第一个问题是这两个行为是否相同?
更紧迫的是,我无法打电话给#34;问候"任何地方的方法。我尝试过几种不同的方式。
这是第一个:
public class modifier {
@Autowired
private HelloController sender;
public void adder(String words) throws Exception {
sender.greet(words);
}
}
在上面的例子中,似乎新的HelloController从未初始化。在调试时,我发现当加法器方法调用" greet"方法,发送方为空,我收到空指针异常。
以下是我用来设置的另一条路线:
public class modifier {
public void adder(String words) throws Exception {
HelloController sender = new HelloController();
sender.greet(words);
}
}
在上面的第二种情况下,在调试之后,还有一个空指针异常,但它不是发送者。它与sender.template一起使用。发件人的模板已初始化,但永远不会给出值或id。然后在greet中调用this.template.convertAndSend()时,会在this.template上引发空指针异常。
我已经混合并匹配了控制器的两个实现和我在应用程序中从一个单独的类调用greet方法的两个实现,但没有工作。
有没有人可以解释我的问题?任何帮助,提示或建议将不胜感激!
提前致谢。
答案 0 :(得分:1)
正如在评论中正确编写的那样,有多种方式可以自动装配依赖关系,它们大多是等效的,你必须根据自己的需要选择自己喜欢的方式。
根据另一个问题:在Spring中,控制器是监听用户请求的对象(单例),因此映射@RequestMapping处理对指定URL的HTTP请求。
如果您需要使用SimpMessagingTemplate对象将消息从服务器推送到客户端,您必须知道客户端必须使用STOMP协议(通过websockets),并且必须订阅正确的主题。
实际上使用STOMP服务器无法将任意消息推送到客户端,但它只能向主题发布消息,客户端必须订阅正确的主题才能接收消息。