为什么我的套接字取消订阅事件没有被使用?
Why isnt my sockets onsubscribe event getting used?
我正在使用 java springboot 和 maven 以获得 spring boot starter socket 包。我的客户将 angular 与 stompjs 和 sockjs-client 一起使用。
我正在尝试设置一个简单的网络套接字应用程序,允许基于 roomId 的多个房间。当客户加入房间时,他们应该会收到在该房间发送的最后五条消息。
我的 Springboot 应用程序有三个 classes,我用于 运行 应用程序的基本 Application.java,一个网络套接字配置 class 和一个网络套接字控制器:
@Controller
public class WebSocketController {
private final SimpMessagingTemplate template;
@Autowired
WebSocketController(SimpMessagingTemplate template){
this.template = template;
}
@MessageMapping("/meeting/{roomId}")
private void sendMessageTpPrivateRoom(
String message,
@DestinationVariable String roomId
) throws IOException {
System.out.println("message sent to: " + roomId);
this.template.convertAndSend("/meeting/" + roomId, message);
addToHistory(roomId, message);
}
@SubscribeMapping("/meeting/{roomId}")
public String chatInit(@DestinationVariable String roomId) {
System.out.println("Someone joined room: " + roomId);
return getLastFiveMessages(roomId);
}
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration
extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app")
.enableSimpleBroker("/meeting");
}
}
我的客户是这样订阅套接字的:
stompClient.subscribe(`app/meeting/${roomId}`, (message) => {
if (message.body) {
console.log(message.body);
messages += '<br>' + message.body;
}
});
并像这样发送消息:
this.stompClient.send(`/app/meeting/${this.roomId}` , {}, message);
消息发送和处理工作正常,当我设置三个客户端时,两个在一号房间,一个在二号房,在一号房看不到二号房的消息,一号房的消息可以看到由两个客户。
然而,无论我加入哪个房间,订阅事件都不会触发。非常有必要的是,当客户加入第一个房间时,他们应该收到该房间的某种历史记录。 关于为什么当客户订阅房间时我的 SubscribeMapping 方法没有被触发有什么建议吗?
/meeting
部分将隐式添加到您在订阅时提供的 URL。所以您的映射将如下所示:
@SubscribeMapping("/${roomId}")
public String chatInit(@DestinationVariable String roomId) {
System.out.println("Someone joined room: " + roomId);
return getLastFiveMessages(roomId);
}
我正在使用 java springboot 和 maven 以获得 spring boot starter socket 包。我的客户将 angular 与 stompjs 和 sockjs-client 一起使用。 我正在尝试设置一个简单的网络套接字应用程序,允许基于 roomId 的多个房间。当客户加入房间时,他们应该会收到在该房间发送的最后五条消息。
我的 Springboot 应用程序有三个 classes,我用于 运行 应用程序的基本 Application.java,一个网络套接字配置 class 和一个网络套接字控制器:
@Controller
public class WebSocketController {
private final SimpMessagingTemplate template;
@Autowired
WebSocketController(SimpMessagingTemplate template){
this.template = template;
}
@MessageMapping("/meeting/{roomId}")
private void sendMessageTpPrivateRoom(
String message,
@DestinationVariable String roomId
) throws IOException {
System.out.println("message sent to: " + roomId);
this.template.convertAndSend("/meeting/" + roomId, message);
addToHistory(roomId, message);
}
@SubscribeMapping("/meeting/{roomId}")
public String chatInit(@DestinationVariable String roomId) {
System.out.println("Someone joined room: " + roomId);
return getLastFiveMessages(roomId);
}
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration
extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app")
.enableSimpleBroker("/meeting");
}
}
我的客户是这样订阅套接字的:
stompClient.subscribe(`app/meeting/${roomId}`, (message) => {
if (message.body) {
console.log(message.body);
messages += '<br>' + message.body;
}
});
并像这样发送消息:
this.stompClient.send(`/app/meeting/${this.roomId}` , {}, message);
消息发送和处理工作正常,当我设置三个客户端时,两个在一号房间,一个在二号房,在一号房看不到二号房的消息,一号房的消息可以看到由两个客户。
然而,无论我加入哪个房间,订阅事件都不会触发。非常有必要的是,当客户加入第一个房间时,他们应该收到该房间的某种历史记录。 关于为什么当客户订阅房间时我的 SubscribeMapping 方法没有被触发有什么建议吗?
/meeting
部分将隐式添加到您在订阅时提供的 URL。所以您的映射将如下所示:
@SubscribeMapping("/${roomId}")
public String chatInit(@DestinationVariable String roomId) {
System.out.println("Someone joined room: " + roomId);
return getLastFiveMessages(roomId);
}