当前位置: 首页 > 工具软件 > stomp > 使用案例 >

Spring websocket stomp

皇甫卓君
2023-12-01

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/

 类似资料:

相关阅读

相关文章

相关问答