簡體   English   中英

Spring session + Spring web socket。 根據會話ID將消息發送到特定客戶端

[英]Spring session + Spring web socket. Send message to specific client based on session id

我已經從堆棧溢出跟蹤Quetion1Quetion2 ,根據其sessionId向特定客戶端發送消息,但無法找到成功。

下面是我的示例RestController類

@RestController
public class SpringSessionTestApi {

@Autowired
public SimpMessageSendingOperations messagingTemplate;

@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception {

    String sessionId  = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID");
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId));

   }

private MessageHeaders createHeaders(String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    return headerAccessor.getMessageHeaders();
   }
}

會話ID:當客戶端發送createSession請求時,會生成新的spring sessionId,同樣也會存儲在MongoDB中。 在此之后,當客戶端發送Web套接字連接請求時,會收到相同的sessionId,它按預期存儲在mongoDb中。 直到這一切都很好。

現在我的工作是根據sessionId將響應發送回客戶端。 為此我在web套接字類下面:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
    AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {

@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/messages");
}

public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue");
    registry.setApplicationDestinationPrefixes("/app");
   }
}

我用來連接的示例客戶端代碼是:

function connect() {

stompClient = Stomp.client('ws://localhost:8016/messages');
stompClient.debug = null;

stompClient.connect({}, function (frame) {
    setConnected(true);
    console.log('Connected: ' + frame);
    stompClient.subscribe('/user/queue/test', function (greeting) {
        console.log("Hello "+greeting);
        console.log("Greeting body "+JSON.parse(greeting.body));

    });
});
}

請幫忙,我在哪里做錯了? 提前致謝!

如果您正在使用/ user頻道,請嘗試按照此處所述傳遞用戶。

@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal) 
    throws Exception {
    messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message);
}

我在git中找到了一個完整可行的Spring Stomp Chat項目,鏈接就在這里。 你可以參考它。 https://gist.github.com/theotherian/9906304

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM