Spring websocket从队列发送消息给用户convertAndSendToUser不工作

时间:2016-04-25 17:59:08

标签: stomp spring-amqp spring-websocket

我有一个场景,我希望用户订阅固定的websocket端点,并且在订阅时不需要提及queuename或主题。我想处理控制器内部的逻辑,以便从各自的队列中获取消息并发送回每个用户。 我希望实现这样的目标: -

我的客户端代码首先连接到websocket端点/ websocket: -

client.connectToServer( aWebsocketHandler, URI.create( "wss://host.com/websocket" ) );

然后通过websocket发送STOMP连接和订阅框架

STOMP connect frame :-
accept-version : 1.1
heart-beat : 100000,0

STOMP subscribe frame  :-

destination : /app/fixed 
id : 123
ack : auto
receipt  : 123456

正在运行的服务器端代码控制器是: -

@SubscribeMapping ( "fixed" )
    public void handle( Principal principal ) {
        System.out.println( "principal.getName();" + principal.getName() );
        String queueName = Helper.getClientToQueueMap().get( principal.getName() );
        // in loop just for testing
        while(true){

            Object o = rabbitTemplate.receiveAndConvert(queueName);
            if ( o != null ) {
                System.out.println( "Returning mesg**" + o.toString() );
                simpMessagingTemplate.convertAndSend( "/app/fixed", o.toString() );
            }
            try {
                Thread.sleep(3000);
            } catch ( InterruptedException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            }
       }
       }

我的网络配置如下: -

@Override
    protected void configureStompEndpoints( StompEndpointRegistry registry ) {
        registry.addEndpoint( "/websocket" ).setAllowedOrigins( "*" );

    }

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

现在我想修改此代码以将消息从队列发送到其各自的特定用户。即使每个用户都订阅相同的端点/ app / fixed,也不应该在它们之间共享任何消息。 通过几个帖子我发现客户端可以订阅/ user / queue / fixed而在控制器中我使用convertAndSendToUser发送给特定用户

simpMessagingTemplate.convertAndSendToUser( principal.getName(), "/queue/fixed", o.toString() );

但这不起作用。由于我订阅了/ user / queue / fixed,因此@SubscribeMapping(“fixed”)的控制器句柄方法永远不会被调用。有人可以帮我解决我做错的事吗?

1 个答案:

答案 0 :(得分:0)

以下

对我有用

控制器上的@SubscribeMapping(“/ user / queue / fixed”)

并且正在做

simpMessagingTemplate.convertAndSendToUser( principal.getName(), "/queue/fixed", o.toString() );

客户订阅/ user / queue / fixed