Spring专题

使用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

Spring各种源码项目下载