关于springboot+websocket+mybatis的问题
来源:互联网 发布:手机时钟同步软件 编辑:程序博客网 时间:2024/05/17 23:28
关于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@EnableWebSocketMessageBrokerpublic 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
阅读全文
1 0
- 关于springboot+websocket+mybatis的问题
- 关于Springboot整合mybatis启动的问题
- 关于spring和springboot +mybatis事物管理的问题!
- 关于Springboot + hibernate 使用websocket的详细代码
- SpringBoot中WebSocket不能实现注入的问题
- Springboot整合Mybatis的CallSettersOnNulls配置问题
- SpringBoot配置MyBatis遇到的问题
- springboot 整合mybatis 遇到的问题
- 关于springboot启动的问题.
- 关于IDEA工具在springboot整合mybatis中出现的Invalid bound statement (not found)问题
- springboot集成mybatis问题
- 关于HTML5请求WebSocket,404的问题
- springboot websocket 解决不能注入bean问题
- springboot websocket
- SpringBoot-Websocket
- SpringBoot + WebSocket
- springboot+mybatis的深化
- 关于springboot项目的部署问题
- 移动端适配
- 51nod 1686-第K大区间(离散化+二分+尺取)
- X的平方根
- Ubuntu 16.04.1安装MySQL
- CSU-ACM2017暑假集训比赛7
- 关于springboot+websocket+mybatis的问题
- ViewPager的无限轮播
- Java编程中常用工具函数
- hql 语法与详细解释
- 32位系统环境下结构体大小
- 数的查找
- Kotlin快速入门(2) -- 函数
- String和CharSequence的区别
- HDU-2017 多校训练赛8-1006-Fleet of the Eternal Throne