当前位置: 首页 > 知识库问答 >
问题:

spring websocket将消息从队列发送到用户convertAndSendToUser不工作

景帅
2023-03-14

在我的场景中,我希望用户订阅一个固定的websocketendpoint,并且在订阅时不需要提及队列名或主题。我想处理控制器内部的逻辑,以便从各自的队列中获取消息并将消息发送回每个用户。我想达到的目标是:-

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

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

然后通过websocket发送STOMP connect and subscribe帧

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();
            } 
            }
       }
       }

我的web配置有以下内容:-

@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");
    }

现在我想修改这段代码,以便将消息从队列发送给它各自的特定用户。即使每个用户都将订阅相同的endpoint/app/fixed,他们之间也不应该共享任何消息。通过几篇文章,我发现客户端可以订阅/user/queue/fixed,并且在控制器中使用convertAndSendToUser发送给特定的用户

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

但这不管用。因为我订阅的是/user/queue/fixed,所以这个带有@subscribeMapping(“fixed”)的控制器句柄方法永远不会被调用。有人能帮我做错了什么吗?

共有1个答案

李洋
2023-03-14

这对我来说很有效

@subscribeMapping(“/user/queue/fixed”)在控制器上

并且做

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

客户端订阅/用户/队列/固定

 类似资料:
  • 我设置了一个EJB项目,使用JMS将持久性实体对象发送到MDB。我使用JBoss EAP 7,使用Apache ActiveMQ作为消息传递提供程序。我像这样设置ConnectionFactory和队列: 这是我的消息生成器,它接收“Account”实体对象作为参数并将其发送到队列: EntityEnqueueBean。Java语言 MDB从队列接收消息并对其进行处理: java账户 不确定我做错

  • 问题内容: 我试图将字符串消息发送到在weblogic服务器中创建的JMS队列中。我使用Eclipse IDE,当我运行Web应用程序时,出现以下错误,tomcat服务器关闭。错误是 请帮助我。谢谢和最诚挚的问候 问题答案: 基于对该问题的一些快速研究,它似乎是由于在应用服务器和客户端之间使用不同的JDK级别引起的。我看到的大多数示例都表明,在Java 5上运行Weblogic时在客户端上使用Ja

  • 我是Spring JMS的新手。我的应用程序是使用Spring Boot开发的,并部署在JBoss EAP7.2.0中。我有一个远程队列,它是一个活动的MQ Artemis队列,也嵌入在JBoss EAP7.2.0中。有人能建议我如何使用Spring Boot的JmsTemplate向远程JMS队列发送消息吗?基本上,我不知道应该如何定义远程connectionFactory来连接到远程队列。

  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 我正在开发一个使用Spring Boot版本2.0.4的Java应用程序。RELEASE和RabbitMQ版本3.7.7。该应用程序正在Redis数据库中缓存RabbitMQ中的所有消息,并且在RabbitMQ中创建新队列时必须重新发送。目前,我设法使用Event Exchange Plugin和队列名称捕获了队列创建。我正在使用AMQP出站适配器将消息发送回RabbitMQ。 流出 我可以使用r

  • 我试图使用https://github.com/roribio/alpine-sqs容器 我能够运行docker容器,并使用终端将消息发送到队列。 我用来将消息发送到SQS队列容器的命令如下 我能够接收到消息,并且可以在浏览器中的dashboad中看到它,网址为。 但是当我试图在中使用发送消息时,它抛出了一个错误。 回溯(最后一次调用):文件“/home/infomagnus/PycharmPro