如何从服务器任意发送到SpringBoot

时间:2018-03-19 16:25:10

标签: java spring-boot websocket kotlin stomp

我正在SpringBoot中编写一个桥接应用程序,将内部消息传递协议桥接到基于websocket的stomp设置。我正在混合模式Kotlinjava项目中运作(“可能”会让事情变得困难)。

我的目标是当我在内部消息队列上收到消息时,我想将其发送到STOMP端点。

我可以从STOMP->STOMPREST->STOMP发送,但我似乎无法让服务器直接发送到stomp端点correclty。

我经历过几乎每一个堆栈帖子 - 我看到人们遇到了类似的问题,但是,我实际上无法让任何列出的解决方案正常工作。

从我收集的内容中我需要补充一下:

的java

@Autowired
private SimpMessagingTemplate template;

科特林

@Autowired
lateinit var template: SimpleMessagingTemplate

加入我的某个班级,然后将@Controller@Service添加到班级的顶部,可能会在open中将其设为kotlin

尝试(java):

@Controller
public class STOMPDataListener implements SDDFDataListener {

    @Autowired
    private SimpMessagingTemplate template;


    public void handleData(String source, SDDFCommonData data) {
        System.out.println("Received: " + data);
    }
}

如果我在handleData电话上添加断点,我会发现:

  

template = null

尝试(kotlin)

@Controller
class BridgeDataListener(val peerID: String = "default") : SDDFDataListener {

    @Autowired
    lateinit var template: SimpMessagingTemplate


    override fun handleData(source: String, data: SDDFCommonData) {
        println("Received: $data")
    }
}
  

lateinit属性模板尚未初始化   enter image description here

如果我将其标记为

@Service
class BridgeDataListener(val peerID: String = "default") : SDDFDataListener {

我得到了同样的错误。

我知道这是可能的,因为在Docs:https://docs.spring.io/spring/docs/4.0.1.RELEASE/spring-framework-reference/html/websocket.html中他们给出了一个例子,但是,我不确定如何直接使用这个例子,因为我需要构建我的DataListener的多个版本 - 并且来自我对@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);
    }

}

非常感谢协助。

1 个答案:

答案 0 :(得分:1)

所以看起来我最终解决了我的问题。

如果您使用@Autowired实例化一个类,则

new不起作用。当我使用一些库时,我必须遵循https://stackoverflow.com/a/19896871/2069812

中的方法#3

所以我构建了一个java类:

/**
 * See: https://stackoverflow.com/a/19896871/2069812
 */
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    public static ApplicationContext getContext() {
        return context;
    }
}

然后在我的数据处理程序类中,我通过:

访问了bean

var template: SimpMessagingTemplate = ApplicationContextHolder.getContext().getBean(SimpMessagingTemplate::class.java)

允许我致电:

 template.convertAndSend("/topic/sddf/$source", json.toString())
 template.convertAndSend("/topic/sddf/$source/$peerID", json.toString())