【发布时间】:2018-08-28 07:09:27
【问题描述】:
我正在 SpringBoot 中编写一个桥接应用程序,其中两个将内部消息传递协议桥接到基于 websocket 的 stomp 设置。我在混合模式 Kotlin、java 项目中运行(这“可能”让事情变得困难)。
我的目标是当我在内部消息队列中收到一条消息时,我想将它发送到 STOMP 端点。
我可以从 STOMP->STOMP 和 REST->STOMP 发送,但我似乎无法让服务器直接发送到 stomp 端点正确。
我几乎浏览了每一个堆栈帖子 - 我看到人们遇到了类似的问题,但是,我无法真正让列出的任何解决方案发挥作用。
根据我收集到的内容,我需要添加:
java
@Autowired
private SimpMessagingTemplate template;
科特林
@Autowired
lateinit var template: SimpleMessagingTemplate
进入我的一门课程,然后将@Controller 或@Service 添加到课程的顶部,可能在kotlin 中添加open
尝试(java):
@Controller
public class STOMPDataListener implements SDDFDataListener {
@Autowired
private SimpMessagingTemplate template;
public void handleData(String source, SDDFCommonData data) {
System.out.println("Received: " + data);
}
}
如果我在 handleData 调用上添加断点,我会发现:
模板 = 空
尝试(科特林)
@Controller
class BridgeDataListener(val peerID: String = "default") : SDDFDataListener {
@Autowired
lateinit var template: SimpMessagingTemplate
override fun handleData(source: String, data: SDDFCommonData) {
println("Received: $data")
}
}
如果我将其标记为
@Service
class BridgeDataListener(val peerID: String = "default") : SDDFDataListener {
我得到同样的错误。
我知道这是可能的,因为在文档中:https://docs.spring.io/spring/docs/4.0.1.RELEASE/spring-framework-reference/html/websocket.html 他们举了一个例子,但是,我不确定如何直接使用这个例子,因为我需要构建多个版本的 DataListeners - 并且从我了解您仅获得一份的@Autowired 课程吗?我可以让它成为一个单例还是会破坏一些东西?
@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);
}
}
非常感谢您的帮助。
【问题讨论】:
-
handleData是如何调用的,即STOMPDataListener/BridgeDataListener的实例是如何创建的? “通常”当 Spring 无法绑定到字段时,会引发异常。由于您不是这种情况,我怀疑该实例不是由 Spring 创建的。
标签: java spring-boot websocket kotlin stomp