0

我有一个 Spring Boot 应用程序,它将发布到用户定义的目标通道,如下所示:

@Autowired
private SimpMessagingTemplate template;

public void send() {
   //..
   String uniqueId = "123";
   this.template.convertAndSendToUser(uniqueId, "/event", "Hello");
}

然后 Stomp over 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”只能由一个用户使用。我如何知道用户目的地何时不再有任何订阅者?以及如何删除用户目的地?

4

2 回答 2

0

在eclipse中以调试模式运行的代码段中添加通道拦截器并设置断点后,我发现消息处理程序持有的注册表对象中有一组websocket会话和目标映射,依次可以看到存储在消息通道对象中。尽管不确定纯粹的用户目标方法,但我发现了这个主题。

然而,Spring 并没有让我只调用一个函数来获取每个主题的所有订阅者的列表,至少在没有传递消息的情况下,让我打开 api。其他所有有用的东西都设置为私有,因此无法以编程方式访问。这没有帮助,因为我只想在取消订阅或断开客户端连接时触发操作,仅当取消订阅/断开连接的主题没有其他侦听客户端时。

现在考虑嵌入全功能代理,例如 ActiveMQ,看看它是否可以解决我的问题

于 2016-02-26T01:09:23.873 回答
0
@SendToUser('/queue/dest')
public String send() {
   //..
   String uniqueId = "123";
   return "hello";
}

在您要订阅的客户端上'/user/queue/dest'

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-user-destination

于 2016-02-25T23:35:33.250 回答