您的位置:首页 > 编程语言 > Java开发

关于springboot+websocket+mybatis的问题

2017-08-23 19:55 447 查看

关于springboot+websocket+mybatis的服务端程序

主要网上很多版本都老了,找了很多资料,已经各种测试现在写一个bolg,方便大家编写websocket应用

config配置代码

SocketSessionRegistry 配置 存储session

//this map save every session
//这个集合存储session
private final ConcurrentMap<String, Set<String>> userSessionIds = new ConcurrentHashMap();
private final Object lock = new Object();

public SocketSessionRegistry() {
}

/**
*
* 获取sessionId
* @param user
* @return
*/
public Set<String> getSessionIds(String user) {
Set set = (Set)this.userSessionIds.get(user);
return set != null?set: Collections.emptySet();
}

/**
* 获取所有session
* @return
*/
public ConcurrentMap<String, Set<String>> getAllSessionIds() {
return this.userSessionIds;
}

/**
* register session
* @param user 这里我使用的是用户的uuid
* @param sessionId 此条连接的session_Id
*/
public void registerSessionId(String user, String sessionId) {
Assert.notNull(user, "User must not be null");
Assert.notNull(sessionId, "Session ID must not be null");
Object var3 = this.lock;
synchronized(this.lock) {
Object set = (Set)this.userSessionIds.get(user);//这个用户uuid是否有session
if(set == null) { //没有就添加
set = new CopyOnWriteArraySet();
this.userSessionIds.put(user, (Set<String>) set);
}else {//有就清除后再添加
this.userSessionIds.remove(user);//清除存储的session
set = new CopyOnWriteArraySet();
this.userSessionIds.put(user,(Set<String>)set);
}

((Set)set).add(sessionId);
}
}

public void unregisterSessionId(String userName, String sessionId) {
Assert.notNull(userName, "User Name must not be null");
Assert.notNull(sessionId, "Session ID must not be null");
Object var3 = this.lock;
synchronized(this.lock) {
Set set = (Set)this.userSessionIds.get(userName);
if(set != null && set.remove(sessionId) && set.isEmpty()) {
this.userSessionIds.remove(userName);
}

}
}


STOMPConnectEventListener 连接之后监听存储session

public class STOMPConnectEventListener implements ApplicationListener<SessionConnectedEvent> {

@Autowired
SocketSessionRegistry webAgentSessionRegistry;

@Override
public void onApplicationEvent(SessionConnectedEvent sessionConnectedEvent) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(sessionConnectedEvent.getMessage());//获取监听信息
//login get from browser
MessageHeaderAccessor accessor = NativeMessageHeaderAccessor.getAccessor(sessionConnectedEvent.getMessage(), SimpMessageHeaderAccessor.class);
accessor.getMessageHeaders();
Object header = accessor.getHeader("simpConnectMessage");
GenericMessage<?> generic = (GenericMessage<?>) accessor.getHeader("simpConnectMessage");//由于在stomp这个监听的信息中 信息层级太多,所以只能一级一级去取出 客户端请求连接的时候传入的连接信息
System.out.println(generic.getHeaders().get("nativeHeaders"));
Object nativeHeaders = generic.getHeaders().get("nativeHeaders");
System.out.print(JsonUtils.mapToJson(nativeHeaders));
Map<String, String> map = JsonUtils.parseJsonWithGson(JsonUtils.mapToJson(nativeHeaders));//JsonUtils.mapToJson这个是用户map转string的  由于我转化出来的信息是 login:"["uuid"]" 此类格式的,所以下面的是用来转换的
String agentId = map.get("login");
agentId = agentId.replace("[\"", "");
agentId = agentId.replace("\"]", "");
String sessionId = sha.getSessionId();//获取此条数据的sessionId
webAgentSessionRegistry.registerSessionId(agentId, sessionId);//存储sessionId
}
}


websocketConfig

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");//消息推送的前缀
registry.setUserDestinationPrefix("/user");//推送用户消息前缀
}

@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS();//注册websocket接口
}

@Bean
public SocketSessionRegistry SocketSessionRegistry(){
return new SocketSessionRegistry();
}
@Bean
public STOMPConnectEventListener STOMPConnectEventListener(){
return new STOMPConnectEventListener();
}

}


WebsocketController

@Controller

public class WebSocketController {

// /*session操作类/

@Autowired

SocketSessionRegistry webAgentSessionRegistry;

/*消息发送工具/

@Autowired

private SimpMessagingTemplate template;

@MessageMapping("/send_message")
public void say(CommonEntity message)throws Exception {
Map<String,String> params = new HashMap(1);
params.put("msg","请等待");
String sessionId= StringUtils.join(webAgentSessionRegistry.getSessionIds(message.getUser_Uuid()).toArray(),";");//获取sessionId
template.convertAndSendToUser(sessionId,"/topic/get_user",params,createHeaders(sessionId)); //消息推送到用户

}

private MessageHeaders createHeaders(String sessionId) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}


}

application

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})//使用idea测试的时候 不添加SecurityAutoConfiguration.class 在前端连接的时候 出现填写tomcat账号密码的问题

@EnableWebSocket

public class WebsocketProjectApplication {

public static void main(String[] args) {
SpringApplication.run(WebsocketProjectApplication.class, args);
}


}

pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>

<groupId>com.websocket</groupId>
<artifactId>websocket-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>websocket-project</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version><!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- 时间处理 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.4</version>
</dependency>

<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>

<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>

<!-- java validtion-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>

<!-- aop -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>

<!-- excel poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>

<!--jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>


github websocket项目地址 https://github.com/SimlerGray/java-websocket-stomp

github 测试类地址 https://github.com/SimlerGray/web_test_websocket.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息