我有一个Spring Boot应用程序,它将发布到用户定义的目标通道:
@Autowired
private SimpMessagingTemplate template;
public void send() {
//..
String uniqueId = "123";
this.template.convertAndSendToUser(uniqueId, "/event", "Hello");
}
然后踩踏SockJS客户端可以订阅它并接收消息。假设我在我的spring应用程序中注册了一个名为“/ data”
的stomp端点var ws = new SockJS("/data");
var client = Stomp.over(ws);
var connect_fallback = function() {
client.subscribe("/user/123/event", sub_callback);
};
var sub_callback = function(msg) {
alert(msg);
};
client.connect('','', connect_callback);
实际上会有多个用户客户端订阅同一个不同的用户目的地,所以每个发布/订阅频道都不是一对一的,我只是这样做,因为Spring的“/ topic”概念必须是以编程方式定义,“/ queues”只能由一个用户使用。我如何知道用户目的地何时不再有订户?如何删除用户目的地?
答案 0 :(得分:0)
@SendToUser('/queue/dest')
public String send() {
//..
String uniqueId = "123";
return "hello";
}
在客户端,您可以订阅'/user/queue/dest'
答案 1 :(得分:0)
在eclipse中以调试模式运行的代码段中添加通道拦截器并设置断点后,我发现在消息处理程序持有的注册表对象中有一个websocket会话和目标映射的集合,可以看到存储在消息通道对象中。我发现这个主题虽然不确定纯粹的用户目的地方法。
然而,Spring并没有让api对我来说只是调用一个函数来获取每个主题的所有订阅者的列表,至少在没有传递消息的情况下。其他所有有用的东西都设置为私有,因此无法以编程方式访问。这没有用,因为我想在取消订阅或断开客户端时触发操作,只有在取消订阅/断开连接的主题没有剩下其他侦听客户端时。
现在看看嵌入功能齐全的经纪人,如ActiveMQ,看看它是否可以解决我的问题