我有一个订阅监听器
@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
事件时没有收到服务器发送的消息,我在客户端获取控制台输出为
但我无法收到消息/通知。
有人可以告诉我如何解决这个问题吗?
最佳答案
您是否尝试将 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/