关于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

原创粉丝点击