- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
18.3.1 启用 STOMP 消息功能
稍后,我们将会看到如何在Spring MVC中为控制器方法添加@MessageMapping注解,使其处理STOMP消息,它与带有@RequestMapping注解的方法处理HTTP请求的方式非常类似。但是与@RequestMapping不同的是,@MessageMapping的功能无法通过@EnableWebMvc启用。Spring的Web消息功能基于消息代理(message broker)构建,因此除了告诉Spring我们想要处理消息以外,还有其他的内容需要配置。我们必须要配置一个消息代理和其他的一些消息目的地。
如下的程序清单展现了如何通过Java配置启用基于代理的Web消息功能:
程序清单18.5 @EnableWebSocketMessageBroker注解能够在WebSocket之上启用STOMP
与程序清单18.2中的配置进行对比,WebSocketStompConfig使用了@EnableWebSocketMessageBroker注解。这表明这个配置类不仅配置了WebSocket,还配置了基于代理的STOMP消息。它重载了registerStompEndpoints()方法,将“/marcopolo”注册为STOMP端点。这个路径与之前发送和接收消息的目的地路径有所不同。这是一个端点,客户端在订阅或发布消息到目的地路径前,要连接该端点。
WebSocketStompConfig还通过重载configureMessageBroker()方法配置了一个简单的消息代理。这个方法是可选的,如果不重载它的话,将会自动配置一个简单的内存消息代理,用它来处理以“/topic”为前缀的消息。但是在本例中,我们重载了这个方法,所以消息代理将会处理前缀为“/topic”和“/queue”的消息。除此之外,发往应用程序的消息将会带有“/app”前缀。图18.2展现了这个配置中的消息流。
图18.2 Spring简单的STOMP代理是基于内存的,它模拟了STOMP代理的多项功能
当消息到达时,目的地的前缀将会决定消息该如何处理。在图18.2中,应用程序的目的地以“/app”作为前缀,而代理的目的地以“/topic”和“/queue”作为前缀。以应用程序为目的地的消息将会直接路由到带有@MessageMapping注解的控制器方法中。而发送到代理上的消息,其中也包括@MessageMapping注解方法的返回值所形成的消息,将会路由到代理上,并最终发送到订阅这些目的地的客户端。
启用STOMP代理中继
对于初学来讲,简单的代理是很不错的,但是它也有一些限制。尽管它模拟了STOMP消息代理,但是它只支持STOMP命令的子集。因为它是基于内存的,所以它并不适合集群,因为如果集群的话,每个节点也只能管理自己的代理和自己的那部分消息。
对于生产环境下的应用来说,你可能会希望使用真正支持STOMP的代理来支撑WebSocket消息,如RabbitMQ或ActiveMQ。这样的代理提供了可扩展性和健壮性更好的消息功能,当然它们也会完整支持STOMP命令。我们需要根据相关的文档来为STOMP搭建代理。搭建就绪之后,就可以使用STOMP代理来替换内存代理了,只需按照如下方式重载configureMessageBroker()方法即可:
上述configureMessageBroker()方法的第一行代码启用了STOMP代理中继(broker relay)功能,并将其目的地前缀设置为“/topic”和“/queue”。这样的话,Spring就能知道所有目的地前缀为“/topic”或“/queue”的消息都会发送到STOMP代理中。根据你所选择的STOMP代理不同,目的地的可选前缀也会有所限制。例如,RabbitMQ只允许目的地的类型为“/temp-queue”、“/exchange”、“/topic”、“/queue”、“/amq/queue”和“/reply-queue”。请参阅代理的文档来了解所支持的目的地类型及其使用场景。
除了目的地前缀,在第二行的configureMessageBroker()方法中将应用的前缀设置为“/app”。所有目的地以“/app”打头的消息都将会路由到带有@MessageMapping注解的方法中,而不会发布到代理队列或主题中。
图18.3阐述了代理中继如何应用于Spring的STOMP消息处理之中。我们可以看到,关键的区别在于这里不再模拟STOMP代理的功能,而是由代理中继将消息传送到一个真正的消息代理中来进行处理。
图18.3 STOMP代理中继会将STOMP消息的处理委托给一个真正的消息代理
注意,enableStompBrokerRelay()和setApplicationDestinationPrefixes()方法都接收可变长度的String参数,所以我们可以配置多个目的地和应用前缀。例如:
默认情况下,STOMP代理中继会假设代理监听localhost的61613端口,并且客户端的username和password均为“guest”。如果你的STOMP代理位于其他的服务器上,或者配置成了不同的客户端凭证,那么我们可以在启用STOMP代理中继的时候,需要配置这些细节信息:
以上的这个配置调整了服务器、端口以及凭证信息。但是,并不是必须要配置所有的这些选项。例如,如果你只想修改中继端口,那么可以只调用setRelayHost()方法,在配置中不必使用其他的Setter方法。
现在,Spring已经配置就绪,可以用来处理STOMP消息了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论