一:代码结构
二: pom.xml文件
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
com.gemdale.gmap
GMap
0.0.1-SNAPSHOT
com.gemdale.gmap
gmap-message-dispatch-center
0.0.1-SNAPSHOT
war
gmap-message-dispatch-center
junit
junit
javax.servlet
servlet-api
org.springframework
spring-webmvc
${project.groupId}
gmap-common-controller-support
${project.version}
${project.groupId}
gmap-common
${project.version}
org.springframework
spring-websocket
org.springframework
spring-messaging
io.projectreactor
reactor-core
io.projectreactor
reactor-net
io.netty
netty-all
org.apache.maven.plugins
maven-war-plugin
2.6
false
${basedir}/src/main/resources
WEB-INF/classes
../commonlibs
WEB-INF/lib
gmap-message-dispatch-center
三
: web.xml文件
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_1.xsd">
gmap message
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
<!-- 配置spring核心servlet 开始 -->
spring
org.springframework.web.servlet.DispatcherServlet
1
true
spring
/
index.html
四
: spring-servlet.xml文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 启用注解支持 -->
五
: WebSocketConfig.java文件
package com.gemdale.gmap.message.dispatch.center;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;
import com.gemdale.gmap.common.util.ConfigureUtil;
/**
* TODO:
*
* @author gengchong
* @date 2015年10月20日 下午5:13:17
*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
/*
* 服务器要监听的端口,message会从这里进来,要对这里加一个Handler
* 这样在网页中就可以通过websocket连接上服务了
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket")//websocket 端点
.setAllowedOrigins("*")
.setHandshakeHandler(new HandshakeHandler())
.addInterceptors(new HandshakeInterceptor()).withSockJS();
}
/*
* 消息传输参数配置
*/
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
registry.setMessageSizeLimit(8192) //设置消息字节数大小
.setSendBufferSizeLimit(8192)//设置消息缓存大小
.setSendTimeLimit(10000); //设置消息发送时间限制毫秒
}
/*
* 输入通道参数设置
*/
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(4) //设置消息输入通道的线程池线程数
.maxPoolSize(8)//最大线程数
.keepAliveSeconds(60);//线程活动时间
}
/*
* 输出通道参数设置
*/
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(4).maxPoolSize(8);
}
@Override
public void addArgumentResolvers(List
argumentResolvers) {
}
@Override
public void addReturnValueHandlers(List returnValueHandlers) {
}
@Override
public boolean configureMessageConverters(List messageConverters) {
return true;
}
/*
* 配置broker
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic") // 设置可以订阅的地址,也就是服务器可以发送的地址
.setRelayHost(ConfigureUtil.getProperty("BrokerUrl")).setRelayPort(Integer.valueOf(ConfigureUtil.getProperty("BrokerPort"))) // 设置broker的地址及端口号
.setSystemHeartbeatReceiveInterval(2000) // 设置心跳信息接收时间间隔
.setSystemHeartbeatSendInterval(2000); // 设置心跳信息发送时间间隔
registry.setApplicationDestinationPrefixes("/ws");
}
}
六: HandshakeHandler.java文件
/**
* TODO:
*
* @author gengchong
* @date 2015年10月20日 下午5:02:35
*/
public class HandshakeHandler extends DefaultHandshakeHandler{
private static Logger logger = Logger.getLogger(HandshakeHandler.class);
}
六: HandshakeInterceptor.java文件
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
private static Logger logger = Logger.getLogger(HandshakeInterceptor.class);
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map attributes) throws Exception {
logger.info("============Before Handshake===========");
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
logger.info("============After Handshake==============");
super.afterHandshake(request, response, wsHandler, ex);
}
}
七: GreetingController.java文件
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/gmapws")
public Greeting greeting(HelloMessage message)
{
try {
return new Greeting("Hello, "+message.getName() + " !");
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
八: HelloMessage .java文件
public class HelloMessage {
private String name;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
九: Greeting.java文件
public class Greeting {
private String content;
public Greeting(String content)
{
this.content=content;
}
/**
* @return the content
*/
public String getContent() {
return content;
}
/**
* @param content the content to set
*/
public void setContent(String content) {
this.content = content;
}
}
十: Greeting.java文件
Hello WebSocket
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28624388/viewspace-2163395/
,如需转载,请注明出处,否则将追究法律责任。