【问题标题】:stomp client is not getting messages/notifications when SessionSubscribeEvent is happend当会话订阅事件发生时,stomp 客户端没有收到消息/通知
【发布时间】:2016-05-24 09:29:50
【问题描述】:

我有一个订阅监听器

@Service
public class UserSubscribeEventListenerService {

    private SimpMessagingTemplate template;
    @Autowired
    private GenericService<User> userService;

    @Autowired
    public UserSubscribeEventListenerService(SimpMessagingTemplate template) {
        this.template = template;
    }

    @EventListener
    public void handleSubscribeEvent(SessionSubscribeEvent event) {
        try {
            String subscribedUser = event.getUser().getName();
            System.out.println("User is " + event.getUser().getName() + " Message is " + "GREETINGS" );
            Thread.sleep(3000);
            System.out.println("AFTER 3 seconds...." );
            template.convertAndSendToUser(subscribedUser, "/user/"+subscribedUser+ "/notify", userService.getByEmail(subscribedUser));
        } catch (MessagingException e) {
            System.out.println(e.getCause() 
                    + "\n\n"
                    + e.getCause());
            return;
        } catch (InterruptedException e) {
            System.out.println(e.getCause() 
                    + "\n\n"
                    + e.getCause());
            return;
        }
    }       
}

但是客户端是下面给出的stomp的一堆JS函数

<script type="text/javascript">     
    //Create stomp client over sockJS protocol
    var socket = new SockJS("/ws");
    ///var socket = new SockJS("/ws");
    var stompClient = Stomp.over(socket);
     $( document ).ready(function() {
         stompClient.connect({}, function(s) {    

                stompClient.subscribe('/user/' + s.headers['user-name'] + '/notify', function(frame){
                    var messages = JSON.parse(frame.body)

                      var i;
                      var count = 0;
                      for( i in messages) {
                          var message = messages[i]; 
                          count ++;
                          if(count <= 5){
                              $('#user_message_addon').append(
                                $('<li>').append(                                       
                                      $('<span></span>').html(message.notificationMessage)
                                    ),
                                    $('</li>')      
                                )
                              );
                          }
                        }                            
                });             

            });
        });
    </script>

似乎无法正常工作,当发生UserSubscribeEventListenerService 事件时,不显示或说不接收服务器发送的消息我在客户端获得控制台输出

但我无法收到消息/通知。

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: javascript java stomp spring-websocket sockjs


    【解决方案1】:

    您是否尝试将 convertAndSendToUser 参数更改为:

    template.convertAndSendToUser(subscribedUser, "/notify", userService.getByEmail(subscribedUser));
    

    template.convertAndSendToUser(subscribedUser, "/user/notify", userService.getByEmail(subscribedUser));
    

    我认为 spring 会根据用户名更改队列名称本身。 或者你可以使用convertAndSend 方法:

    template.convertAndSend("/"+subscribedUser+"/notify", userService.getByEmail(subscribedUser));
    

    template.convertAndSend("/user/"+subscribedUser+"/notify", userService.getByEmail(subscribedUser));
    

    这取决于你的 websocket 配置(你能把它包括在你的问题中吗?)

    【讨论】:

    • 第一个建议效果很好,其他人可能有效但没有尝试过,再次感谢。
    • 我想问一个问题,我想你不会介意的,问题是如何从用户列表中获取用户并向他发送消息stompClient.send("here-how-to-set-destination", {}, "Hi to selected user");?请您回答(参考网上来源)。
    • 当我不知道您的用例时很难回答。一种想法是通过您的模型传递用户名(用户列表)以在您的 js 代码中查看和使用它。但更多细节会很有用。
    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多