Spring用户目的地

时间:2016-02-23 13:18:51

标签: java spring-websocket spring-messaging

我有一个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”只能由一个用户使用。我如何知道用户目的地何时不再有订户?如何删除用户目的地?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

现在看看嵌入功能齐全的经纪人,如ActiveMQ,看看它是否可以解决我的问题