关于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
@Controllerpublic 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
相关文章推荐
- Javaweb-------mybatis+springmvc关于实体类使用注解的一个问题
- 关于maven+springMVC+mybatis搭建的web项目问题
- 解决spring boot websocket无法注入bean的问题
- 关于spring boot整合mybatis使用oracle数据库出现could not load:oracle.jdbc.driver.OracleDriver问题的终极解决方案
- 关于Initializing Spring root WebApplicationContext问题
- 关于spring+mybatis操作数据库多次异常 事务不被spring管理问题
- spring+websocket整合(springMVC+spring+MyBatis即SSM框架和
- 关于MyBatis和Spring整合时,No bean named 'xxx' is defined我遇到的问题
- springMVC+spring+MyBatis+websocket技术整合
- 关于spring service层的mybatis缓存问题,待解决
- [小技巧]关于spring boot 整合mybatis-plus: value为null时不返回的问题。
- 关于Springboot整合mybatis启动的问题
- 关于mybatis集成spring时,dataSource设置propertyPlaceholder的问题
- SpringBoot中关于Mybatis使用的三个问题
- Maven项目中,关于Spring Boot 整合MyBatis时,Service层无法找到mapper接口的问题解决
- spring+websocket整合(springMVC+spring+MyBatis即SSM框架和websocket技术的整合)
- 关于部署(Spring+MyBatis)web项目到Linux服务器
- 解决spring boot websocket无法注入bean的问题
- 关于Spring+Mybatis打印日志的问题
- java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket