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

时间:2015-01-07 11:17:42

标签: java spring spring-mvc websocket stomp

https://spring.io/guides/gs/messaging-stomp-websocket/

之后,我使用spring 4,STOMP和sock.js进行了简单的Web套接字通信

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

我尝试使用@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 个答案:

答案 0 :(得分:6)

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

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

在客户端:

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

查看GitHub上的chat example,其中显示了这种确切的情况。