spring websocket stomp
开始之前:
spring websocket jar包等spring和基础jar包请自行下载配置。默认已存在可用web工程。springBoot也可以。
一、配置websocket连接url,发送和监听url。
使用spring注解和继承AbstractWebSocketMessageBrokerConfigurer方式。
使用spring注解和实现WebSocketMessageBrokerConfigurer接口方式。
大多数情况下,没有特殊需求,直接继承抽象类即可。如下:
@Configuration
@EnableWebSocketMessageBroker
@ComponentScan("cn.dream.socket")
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); // declare a message broker
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/connect")
.setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy()))
.withSockJS();
}}}
}}}
具体说明:
使用@Configuration申明这是配置类
使用@EnableWebSocketMessageBroker申明这事websocket配置类
使用@ComponentScan扫描配置类对应的message mapping类的package(可省略,但是本人遇到无法识别messagemapping的问题,加入后解决)
两个重写方法说明:
1、configureMessageBroker
config.enableSimpleBroker("/topic");用来注册websocket推送给用户时消息的出口。例如服务器发给用户的方式为template.send("/topic/user."+username)。这个出口作为所有response消息的
前缀。用户监听的总入口也是这个。如stompClient.subscribe("/topic/user."+username)。
config.setApplicationDestinationPrefixes("/app");用来注册websocket连接建立以后,用户向服务器发送请求的根路径。如stompClient.send("/app/user",xxx)。
2、registerStompEndpoints
registry.addEndpoint("/connect")用来注册用户和服务器建立websocket连接的url.如var socket = new SockJS('/project/connect');
.setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy()))设置默认的handShake处理器,可以自定义。也可以不设置。
.withSockJS(); 使其可以和socketJs进行交互。
二、编写messageMapping controller
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/user")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
和普通的controller相同,只不过使用messageMapping。messageMapping中的路径加上注册的发送前缀“/app”便是用户的发送路径。如
stompClient.send("/app/hello", {}, JSON.stringify({username:aaa}));
@SendTo表示该请求的响应消息被发送到那个监听路径,广播方式。还可以使用@SendToUser,向请求的用户发送,点对点方式。
还可以使用springMessageTemplate,在任何位置注入,使用template发送。
public class testService{
@Autowired
private final MessageSendingOperations<String> messagingTemplate;
void send(){
this.messaginTemplate.send("/topic/user."+username);
}
}
具体详细区别,请参阅spring官方文档。
三、在页面进行调用(socketJs stomp.js)
var stompClient = null;
var socket = new SockJS('/project/connect');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
stompClient.subscribe("/topic/user." + username, function (greeting) {
});
});
stompClient.send("/app/hello", {}, JSON.stringify({username:aaa}));
stompClient.disconnect();
socketJs进行websocket初始化连接的路径便是上文中的注册连接点。subscribe监听的回令路径便是sendTo或者messageTemplate发送的回令路径。
send进行请求交互的路径便是注册的发送端点“/app”加上messageMapping的url。
如果使用手动触发,将send方法加入事件方法。如果想在页面初始化时就直接调用send方法,在stompClient的connect方法中,subscribe方法后面并列添加send方法即可。
---------个人理解,请批评指正。
更多请参阅spring官方文档。推荐http://spring.io/guides/gs/messaging-stomp-websocket/