javascript - 当 session 订阅事件发生时,stomp 客户端没有收到消息/通知

标签 javascript java stomp spring-websocket sockjs

我有一个订阅监听器

@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 事件时没有收到服务器发送的消息,我在客户端获取控制台输出为

Image showing console output

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

有人可以告诉我如何解决这个问题吗?

最佳答案

您是否尝试将 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 配置(您可以将其包含在您的问题中吗?)

关于javascript - 当 session 订阅事件发生时,stomp 客户端没有收到消息/通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37409524/

相关文章:

javascript - 了解对象字面量中的 JavaScript 匿名函数与命名函数

Java 套接字卡住

java - 如何设置 quartz 来触发工作并安排一周中的每一天?

Java Spring STOMP : Set broker IP

RabbitMQ Web-Stomp 插件的 SSL 配置问题

c# - 用 Java 构建的基于 Spring 的代理的 Stomp WebSocket 客户端失败

javascript - 访问当前 div 之外的 div 内的元素

Javascript 切换错误大小写

java - 如何确定移动方向

javascript - div 大小相对于屏幕大小