有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我用Spring4、STOMP和sock做了一个简单的websocket通信。js,下面是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);
    }
}

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

所以,我的问题可以重新表述:当用户订阅某项服务时,如何发送初始数据


共 (1) 个答案

  1. # 1 楼答案

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

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

    在客户端:

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

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