【发布时间】:2017-06-09 05:27:10
【问题描述】:
我在我的项目中创建了一个正在运行的通知系统。我的实际代码是:
我的客户(javascript):
let connectWebSocket = () => {
socket = new SockJS(context.backend + '/myWebSocketEndPoint');
stompClient = Stomp.over(socket);
stompClient.connect({},function (frame) {
stompClient.subscribe('/topic/notification', function(response){
alert(response);
});
});
}
connectWebSocket();
服务器(Java 和 Spring)
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/myWebSocketEndPoint")
.setAllowedOrigins("*")
.withSockJS();
}
}
这是有效的。现在我想在用户离线时也向他们发送通知:当他们登录时,我会(自动)向他们发送通知。我必须用 activeMQ 来做这件事。我看过一些例子,但不太了解它们..有人可以告诉我如何准确编辑我的代码并实现持久订阅?非常感谢
编辑:我已经更新了我的客户端代码:
let connectWebSocket = () => {
let clientId =user.profile.id;
socket = new SockJS(context.backend + '/myWebSocketEndPoint');
stompClient = Stomp.over(socket);
stompClient.connect({"client-id": clientId},{},function (frame) {
stompClient.subscribe('/topic/notification', function(response){
alert(response);
},{"activemq.subscriptionName": clientId});
});
}
但是当用户离线时,如果通知到达,当他在线返回时,通知不会发送给他..我想我必须改变我的服务器端
POM.xml
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.14.2</version>
</dependency>
EDIT2:: 在 pom.xml 中使用正确的依赖项,我现在有一个错误。我有这个配置:
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic/");
}
但是当我运行我的代码时,我看到了这个错误:
2017/01/24 17:17:15.751 ERROR [org.springframework.boot.SpringApplication:839] Application startup failed
org.springframework.context.ApplicationContextException: Failed to start bean 'stompBrokerRelayMessageHandler'; nested exception is java.lang.NoClassDefFoundError: reactor/io/codec/Codec
EDIT3:这是我向客户发送通知的方式:
@Component
public class MenuItemNotificationSender {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Autowired
public MenuItemNotificationSender(SimpMessagingTemplate messagingTemplate){
this.messagingTemplate = messagingTemplate;
}
public void sendNotification(MenuItemDto menuItem) {
messagingTemplate.convertAndSend("/topic/notification", menuItem);
}
}
【问题讨论】: