Spring 4 + Websocket + Stomp + ActimeMQ 實現訊息推送

百聯達發表於2015-10-22
一:程式碼結構

二: pom.xml檔案
<project

: web.xml檔案

: spring-servlet.xml檔案

: 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;
}
 
}

: index.html檔案



</project

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-1815701/,如需轉載,請註明出處,否則將追究法律責任。

相關文章