Spring STOMP over Websocket - “私人”消息传递

Posted

技术标签:

【中文标题】Spring STOMP over Websocket - “私人”消息传递【英文标题】:Spring STOMP over Websocket - "private" messaging 【发布时间】:2017-08-17 07:38:27 【问题描述】:

我正在开发 WebSocket 聊天。我做了一个简单的,将每条消息发送给每个人。但是我正在尝试制作诸如私人消息之类的东西,但我真的不知道该怎么做。我尝试了不同的选项,但我不明白如何让它发挥作用。

这是我的代码:

WebSocketConfig.java

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer 

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) 
        config.enableSimpleBroker("/topic/", "/queue/", "/user/");
        config.setApplicationDestinationPrefixes("/app");
    

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) 
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    

GreetingController.java

@Controller
public class GreetingController 

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(Message message) throws Exception 
        return new Greeting(message.getFrom_user_id(), message.getMessage(), message.getTo_user_id());

    

和我的js函数连接和发送消息:

function connect() 
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
var theUserId = 1;
stompClient.connect(user:theUserId, function (frame) 
    setConnected(true);
    console.log('Connected: ' + frame);
    //stompClient.subscribe('/topic/greetings', function (greeting) 
    stompClient.subscribe('/topic/greetings', function (greeting) 
        showGreeting(JSON.parse(greeting.body).content);
    );
);



function sendName() 
stompClient.send("/app/hello", , JSON.stringify(
        
            'from_user_id': parseInt($("#from_user_id").val()), 
            'message': $("#message").val(),
            'to_user_id': parseInt($("#to_user_id").val())
        ));

如何让私信工作?有人可以解释一下它应该如何工作吗?

安德鲁干杯!

【问题讨论】:

【参考方案1】:

我们可以利用 SimpMessagingTemplate 将消息发送到适当的目标队列

文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/messaging/simp/SimpMessagingTemplate.html

    @Autowired
    private SimpMessagingTemplate template;

    @MessageMapping("/hello")
    public void greeting(Message message) throws Exception 

     this.template.convertAndSend("/topic/"+message.getFrom_user_id(),message);

    

在客户端相应定义订阅主题

【讨论】:

谢谢!像魅力一样工作:)

以上是关于Spring STOMP over Websocket - “私人”消息传递的主要内容,如果未能解决你的问题,请参考以下文章

SockJS over stomp 使用 angular2 和 spring boot

Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets

Spring Boot + Stomp over WS 与嵌入式 Artemis 代理“目标不存在”

STOMP over websockets 与普通 STOMP。哪一个更好?

RabbitMQ Stomp over websocket:无法检索排队的消息

春天的 websocket stomp over sockjs 重定向到 http 协议,而在关键的 web 服务中起源是 https