gpt4 book ai didi

java - 如何使用 Spring 4 在我的 webSocket 服务器中捕获订阅事件

转载 作者:IT老高 更新时间:2023-10-28 13:50:20 29 4
gpt4 key购买 nike

我使用 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);
}
}

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

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

最佳答案

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

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

在客户端:

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

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

关于java - 如何使用 Spring 4 在我的 webSocket 服务器中捕获订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818269/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com