我将整个厨盆放入一个小型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 {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic/");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public 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上有可用的代码
资源资源
翻译自: https://www.javacodegeeks.com/2014/03/websockets-with-spring-4.html