2017-02-04 124 views
1

使用Stomp代理传递Web套接字消息,我可以订阅目的地/topic/mydest。这将创建一个代理订阅,并接收系统为该代理目标触发的所有消息,这些消息在系统中发生某些事件时发生。春季Web套接字消息传递 - 订阅并发送初始消息

我可以订阅目的地/app/mydest,并调用一个控制器方法@SubscribeMapping("mydest")将被调用,并且返回值仅在此套接字上作为消息发回。据我所知,这是唯一的消息,将永远发送这个订阅。

有没有办法在一个单一的订阅结合这一点,即一定/topic目的地,触发创建一个代理中的订阅一些代码,直接将消息发送回用户?

用例:当系统发生错误时,带有当前错误计数的消息被发送到/topic/mydest。当新客户订阅时,我只想向他发送最后一个已知的错误计数。其他人对此刻不感兴趣,因为伯爵没有改变。

我目前的解决方案是订阅/app/mydest/topic/mydest,并在客户端使用相同的消息处理程序。但它确实是一个合乎逻辑的订阅,并且由于客户需要记住订阅这两者,所以这有点容易出错。

我在这方面的问题:订阅/app/会不会有更多消息?有什么要打电话来触发吗?我还可以如何向用户发送主题的初始信息,而不向现有用户发送冗余消息?

按照要求,这是我的Websocket配置类。

@Configuration 
@EnableWebSocketMessageBroker 
public class WebsocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer { 
    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS(); 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry registry) { 
     registry.enableStompBrokerRelay("/queue/", "/topic/", "/exchange/"); 
     registry.setApplicationDestinationPrefixes("/app"); 
    } 
} 
+0

也许我应该澄清:从实际的角度来看,我所描述的当前解决方案已经够好了。我对这个问题的主要动机是完全掌握**订阅**到用户目的地的意图,以及对订阅经纪人目的地的行为方式。 – rainerfrey

回答

0

您可以使用ApplicationListenerSessionSubscribeEvent。 例如:

@Component 
public class SubscribeListener implements ApplicationListener<SessionSubscribeEvent> { 

    private final SimpMessagingTemplate messagingTemplate; 

    @Autowired 
    public SubscribeListener(SimpMessagingTemplate messagingTemplate) { 
     this.messagingTemplate = messagingTemplate; 
    } 

    @Override 
    public void onApplicationEvent(SessionSubscribeEvent event) { 
     messagingTemplate.convertAndSendToUser(event.getUser().getName(), "/topic/mydest", "Last known error count"); 
    } 
} 
+0

我会尝试。但是不需要额外订阅'/ user/topic/mydest'? – rainerfrey

+0

不,只订阅/ topic/mydest。测试过我的应用程序 - 正常工作 – Tolledo

+0

它不适合我。使用'SessionSubscribeEvent'行事的想法是一个有价值的提示,我很感激。但是,向_user destination_'/ topic/mydest'发送消息的**不是**,而是在新订阅的常规_broker_目的地'/ topic/mydest'上收到**。坦率地说,我没有看到文档中的任何提示支持这一假设。当然,我可以在事件监听器中执行'messagingTemplate.convertAndSend(“/ topic/mydest”)'并向每个用户发送消息。虽然这不会真的伤害这种信息,但这不是我想要做的。 – rainerfrey