我有一個場景,我希望用戶訂閱一個固定的websocket端點,而不必在訂閱時提及queuename或topic。我想處理控制器內部的邏輯,從各自的隊列中獲取消息併發回給每個用戶。 這樣的事情我想實現: -Spring websocket從隊列發送消息給用戶convertAndSendToUser不起作用
我的客戶端代碼首先連接到WebSocket端點/ WebSocket的: -
client.connectToServer(aWebsocketHandler, URI.create("wss://host.com/websocket"));
然後發送STOMP連接和訂閱框架上的WebSocket
STOMP connect frame :-
accept-version : 1.1
heart-beat : 100000,0
STOMP subscribe frame :-
destination : /app/fixed
id : 123
ack : auto
receipt : 123456
正在工作的服務器端代碼控制器是: -
@SubscribeMapping ("fixed")
public void handle(Principal principal) {
System.out.println("principal.getName();" + principal.getName());
String queueName = Helper.getClientToQueueMap().get(principal.getName());
// in loop just for testing
while(true){
Object o = rabbitTemplate.receiveAndConvert(queueName);
if (o != null) {
System.out.println("Returning mesg**" + o.toString());
simpMessagingTemplate.convertAndSend("/app/fixed", o.toString());
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
我的web配置有以下: -
@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic/", "/queue/", "/exchange/")
config.setApplicationDestinationPrefixes("/app");
config.enableSimpleBroker("/app");
}
現在我想修改此代碼從隊列發送消息到其各自的特定用戶。即使每個用戶都會訂閱相同的終端/應用程序/固定,但不應該在它們之間共享消息。 通過幾個職位去我發現,客戶可以訂閱/用戶/隊列/固定,我用convertAndSendToUser發送給特定的用戶
simpMessagingTemplate.convertAndSendToUser(principal.getName(), "/queue/fixed", o.toString());
控制器但這不起作用。由於我正在訂閱/ user/queue/fixed這個控制器句柄方法,使用@SubscribeMapping(「fixed」)永遠不會被調用。有人能幫助我,我做錯了什麼?