Spring 4 + Websocket + Stomp + ActimeMQ 實現訊息推送
一:程式碼結構
二: 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
二: 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter websocket 實現訊息推送FlutterWeb
- 基於 Hyperf 實現 RabbitMQ + WebSocket 訊息推送MQWeb
- Spring Boot 整合 WebSocket 實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- SpringBoot 實戰 (十六) | 整合 WebSocket 基於 STOMP 協議實現廣播訊息Spring BootWeb協議
- WebSocket 實現伺服器訊息推送客戶端Web伺服器客戶端
- WebSocket 的故事(二)—— Spring 中如何利用 STOMP 快速構建 WebSocket 廣播式訊息模式WebSpring模式
- WebSocket實現服務端推送訊息和聊天會話Web服務端會話
- 訊息的即時推送——net實現、websocket實現以及socket.io實現Web
- STOMP協議——基於Websocket實現協議Web
- workerman 實現訊息推送
- 微信雲託管 WebSocket 實戰:基於模版實現訊息推送Web
- Spring Boot中使用WebSocket總結(三):使用訊息佇列實現分散式WebSocketSpring BootWeb佇列分散式
- springboot2整合websocket,實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- 在spring boot中訊息推送系統設計與實現Spring Boot
- websocket+stomp子協議 實現資料互通Web協議
- Spring Boot系列20 Spring Websocket實現向指定的使用者傳送訊息Spring BootWeb
- PHP與反ajax推送,實現的訊息實時推送功能PHP
- Knative 實戰:基於 Kafka 實現訊息推送Kafka
- WebSocket 的故事(四)—— Spingboot 中,如何利用 WebSocket 和 STOMP 快速構建點對點的訊息模式(2)Webboot模式
- WebSocket的故事(三)—— Springboot中,如何利用WebSocket和STOMP快速構建點對點的訊息模式(1)WebSpring Boot模式
- 實時訊息推送整理
- WebWorker與WebSocket實現前端訊息匯流排Web前端
- PHP基於Redis訊息佇列實現的訊息推送的方法PHPRedis佇列
- 在Spring Boot中實現WebSocket實時通訊Spring BootWeb
- Laravel 實現 Kafka 訊息推送與接收處理LaravelKafka
- 實時訊息推送方案-SSE
- 使用Spring Boot實現訊息佇列Spring Boot佇列
- 7種 實現web實時訊息推送的方案,7種!Web
- 小程式訂閱訊息推送(含原始碼)java實現小程式推送,springboo原始碼JavaSpring
- python 實現公眾號模板訊息推送(親測有效)Python
- App如何利用推送訊息有效實現拉新促活?APP
- 記一次 Angular 基於 STOMP over WebSocket 實現流文字傳輸AngularWeb
- 利用WebSocket和EventSource實現服務端推送Web服務端
- Spring Boot系列十七 Spring Boot 整合 websocket,使用RabbitMQ做為訊息代理Spring BootWebMQ
- 造輪子之訊息實時推送
- Spring Boot系列22 Spring Websocket實現websocket叢集方案的DemoSpring BootWeb
- Spring Boot系列21 Spring Websocket實現websocket叢集方案討論Spring BootWeb
- iOS使用觀察者模式實現推送訊息模組化iOS模式
- 基於workerman實現的web訊息推送站內信功能Web