使用spring 4实现websockets编程
源码下载:github案例说明:希望实时列出地震信息,也就是说,一旦有什么地方地震了,这个页面自动就显示出来,不需要人为地去主动刷新。这个页面是实时更新的。如下图:
这个应用的第一部分是首先从USGS Earthquake hazards program 每分钟拉数据然后排序,完成后直接放入RabbitMQ的主题, 然后用于Websockets集成,Spring Integration集成框架能够完成这个功能,我们所要做的就是,用一个配置从USGS服务拉数据,然后提供一个 json feed , 最后写入RabbitMQ主题。
下面是rabbitMQ的配置:
<import resource="rabbit-context.xml"/>
<int:inbound-channel-adapter channel="quakeinfotrigger" expression="''">
<int:poller fixed-delay="60000"></int:poller>
</int:inbound-channel-adapter>
<int:channel id="quakeinfo"/>
<int:channel id="quakeinfotrigger"></int:channel>
<int-http:outbound-gateway id="quakerHttpGateway"
request-channel="quakeinfotrigger"
url="http://earthquake.usgs.gov/earthquakes/feed/geojson/all/hour"
http-method="GET"
expected-response-type="java.lang.String"
charset="UTF-8"
reply-channel="quakeinfo">
</int-http:outbound-gateway>
<int-amqp:outbound-channel-adapter amqp-template="amqpTemplate" channel="quakeinfo" />
这个Spring集成配置定义了如下流程:
我们有一个搜集地震信息的流程,然后存储信息到RabbitMQ ,主题是"amq.topic" , "quakes.all"代表每条地政信息集合,下面是显示推送的浏览器页面。
我们使用Spring4编制的应用是浏览器和RabbitMQ之间的媒介,订阅RabbitMQ的主题,然后实时显示RabbitMQ中的每条信息。
这个推送使用Spring 4基于Websocket的STOMP,Spring MVC的配置如下:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic/");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/quakesep").withSockJS();
}
}
- "/topic"是作为一个端点,调用 RabbitMQ STOMP的代理网关
- "/app" 是浏览器请求编码的前缀,
- "/quakesep" 是websocket端点
下面看看客户端如何连接Spring MVC的websocket 端点:
客户端使用websocket的Javascript:sockjs client
Javascript连接到 websocket 端点 "/quakesep" ,然后订阅"/topic/quakes.all" 端点,内部将注册RabbitMQ 一个临时队列用于websocket 会话,映射AMQP 路由key"quakes.all" 到这个临时队列, 必要时发送所有地震信息到这个会话的临时队列。
function connect() {
var socket = new SockJS('/quakesep');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/quakes.all', function(message){
showQuakeInfo(message.body);
});
});
}
整个流程如下:
SOA