我将整个厨盆放入一个小型Web应用程序中,此应用程序是我在该帖子中开发的一部分-Spring Boot,Spring Integration,RabbitMQ,最后是该帖子的主题,Spring MVC与Spring 4中的Websocket支持。
实时地震清单应用
最终的应用程序将列出世界各地发生的地震并实时更新(如果可以将一分钟视为足够实时的话),其内容如下:
存储地震信息
该应用程序的第一部分是每分钟从USGS地震危害计划中轮询数据并进行存储。 我选择将其直接存储到RabbitMQ主题中,稍后将其用于Websockets集成。 Spring Integration非常适合此类功能的需求-仅使用配置,我就可以轮询USGS服务,以提供此信息的json供稿并将其写入RabbitMQ主题。 这是这样的流程:
下面是相同的原始完整Spring集成流程,此处缺少的唯一代码是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" />
因此,现在我有了一个流程来收集地震信息,并将其存储到名为“ amq.topic”的RabbitMQ主题中,并在内部将“ quakes.all”的路由密钥插入每个地震信息中,下一步是要弄清楚如何在浏览器应用程序上动态显示此信息。
呈现地震信息
Spring Framework 4.0+借助框架中内置的基于Websocket的消息传递支持,可以轻松开发应用程序的Web部件。 Spring 4.0使用STOMP作为原始Websocket的高级协议–我提供了一些参考,这些参考使Websocket支持的细节更加清晰。
本质上,Spring将充当浏览器的中介,以订阅RabbitMQ地震主题并在流入新地震信息时显示实时信息,来自参考文献的此图很好地总结了这一点:
外部代理对Spring 4 Websockets的支持要求代理支持STOMP协议,该协议易于使用RabbitMQ启用 。 有了RabbitMQ中的STOMP支持,Spring MVC配置如下所示:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableStompBrokerRelay("/topic/");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/quakesep").withSockJS();}
}
- “ / topic”被注册为终结点,其中Spring充当了RabbitMQ STOMP支持的网关
- “ / app”是应用程序前缀,Spring MVC将在该应用程序前缀中侦听在STOMP消息帧内编码的浏览器请求,在这种特定情况下,我没有从UI收到任何请求,因此未真正使用此端点
- “ / quakesep”是websocket端点
这就是服务器端所需的全部内容!
现在,为了让客户订阅RabbitMQ主题中的消息,我已经按照其中一篇参考文章中的示例实现了该消息。 该示例使用sockjs client ,这是一个JavaScript库,用于在浏览器中进行websocket仿真。
这是连接到websocket端点“ / quakesep”并订阅“ /topic/quakes.all”端点的javascript代码的样子。 这会在内部为该Websocket会话向RabbitMQ注册一个临时队列,并将AMQP路由密钥“ 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);});});}
从RabbitMQ获得时,上面的showQuakeInfo函数仅显示新鲜的地震信息。
整个示例与Spring Boot结合在一起,这可以确保将pom文件中声明的依赖项保持在最低限度,启动应用程序所需的配置量非常小-本质上是我在上面显示的WebSocketConfig代码!
- 我在github上有可用的代码
资源资源
- Spring Framework中的Websocket架构
- 使用Spring Framework构建基于Websocket的应用程序的网络研讨会
翻译自: https://www.javacodegeeks.com/2014/03/websockets-with-spring-4.html