【问题标题】:how to capture subscribe event in my webSocket server with Spring 4如何使用 Spring 4 在我的 webSocket 服务器中捕获订阅事件
【发布时间】:2015-03-05 06:39:40
【问题描述】:

我使用 spring 4、STOMP 和 sock.js 进行了简单的 Web 套接字通信,遵循 https://spring.io/guides/gs/messaging-stomp-websocket/

现在我想将它升级为简单聊天。我的问题是当用户订阅新的聊天室时,他应该得到过去的消息。我不知道如何捕捉他订阅向他发送消息列表的那一刻。

我尝试使用@MessageMapping 注解,但没有成功:

@Controller
public class WebSocketController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;


    @MessageMapping("/chat/{chatId}")
    public void chat(ChatMessage message, @DestinationVariable String chatId) {
        messagingTemplate.convertAndSend("/chat/" + chatId, new ChatMessage("message: " + message.getText()));
    }

    @SubscribeMapping("/chat")
    public void chatInit() {
        System.out.println("worked");
        int chatId = 1; //for example
        messagingTemplate.convertAndSend("/chat/" + chatId, new ChatMessage("connected"));
    }

}

然后我创建了那个:

@Controller
public class ApplicationEventObserverController implements ApplicationListener<ApplicationEvent> {
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        System.out.println(applicationEvent);
    }
}

它有效,但捕获了所有可能的事件,我认为这不是一个好习惯。

所以,我的问题可以改写:当用户订阅某事时如何发送初始数据?

【问题讨论】:

标签: java spring spring-mvc websocket stomp


【解决方案1】:

当客户端使用@SubscribeMapping 处理程序方法订阅目标时,您可以将任何内容直接返回给客户端。返回的对象不会去代理,而是直接发送给客户端:

@SubscribeMapping("/chat")
public Collection<ChatMessage> chatInit() {
    ...
    return messages;
}

在客户端:

socket.subscribe("/app/chat", function(message) {
    ...
});

查看 GitHub 上的 chat example,它显示了这个确切的场景。

【讨论】:

  • 仍然无法达到我想要的东西。 @Sergi Almar,我可以只订阅一次并使用此订阅来获取初始化消息和未来的消息吗?
  • @SubscribeMapping 仅在我编写 stompClient.subscribe("/app/chat/") 时有效,但在这种情况下我无法接收新消息
  • @SubscribeMapping 用于请求-回复场景,因此无法捕获主题订阅事件。
猜你喜欢
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2018-06-01
  • 2018-01-03
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多