首个 Virgo 里程碑版本发布
Eclipse Virgo 的首个里程碑版本 (2.1.0.M01) 现已在 Eclipse 公共许可证 下 可供下载。它包含一个应用服务器,称为 Virgo Web Server,以及一个独立的内核。
此里程碑版本的目标是让 dm Server 2.0.x 用户能够相对轻松地迁移到此版本,并拥有同样稳定的环境。SpringSource 为 Virgo 提供商业支持,我们鼓励所有 dm Server 用户迁移到 Virgo。与用户的主要沟通渠道现在是 Virgo 论坛。还有一个 Virgo 开发者邮件列表和每周一次的 Virgo 社区电话会议……
Spring 3.0.3 现已发布
Juergen Hoeller 宣布 Spring 3.0.3 现已发布。此小版本解决了 100 多个小问题,并与一些最近的第三方发布保持同步。
下载 | 文档 | Javadoc API | 变更日志 | JIRA
请注意,我们不再提供依赖下载。与 Spring 一起使用的第三方库的推荐获取方式是 Maven/Ivy;您也可以下载您选择的第三方分发版本并从中获取 jar 包。请注意,除非您想这样做,否则没有理由升级第三方库:最简单的解决方案是继续使用您熟悉和信任的版本。
Spring Framework 3.0.3 发布
经过几周的优化和社区反馈,Spring Framework 3.0.3 现已发布。此版本修复了针对 Spring 3.0.2 报告的 100 多个小问题,尤其是在 JSP 标签库和 Portlet 会话处理方面,以及 ConversionService 的细节。同样,此版本也与最近的第三方发布保持同步:OpenJPA 2.0 final、Hibernate 3.5.2 和 JBoss 6.0.0 M3,所有这些现在都与 Spring 3 完全兼容。
请注意,与此同时,所有主要的持久性提供程序都发布了支持 JPA 2.0 的 GA 版本,甚至…
理解 AMQP,RabbitMQ 使用的协议
更新 我修改了第一段,以澄清 RabbitMQ 和 JMS 之间的关系。
RabbitMQ 是一款轻量级、可靠、可扩展且可移植的消息代理。但与许多 Java 开发者熟悉的消息代理不同,它不基于 JMS。相反,您的应用程序通过一种平台中立的线级协议与之通信:高级消息队列协议 (AMQP)。幸运的是,已经有一个 Java 客户端库,并且 SpringSource 正在努力实现一流的 Spring 和 Grails 集成——所以不用担心需要进行底层操作来使用 RabbitMQ。您甚至可以找到公开 JMS 接口的 AMQP 客户端库。但是 AMQP 在操作上与 JMS 足够不同,这可能会给习惯于 JMS 模型的 Java 开发者带来麻烦。
为了简化过渡,我将在本文中探讨支撑 AMQP 的基本概念以及三种常见的使用场景。到最后,您应该能够很好地理解如何配置 RabbitMQ 并通过 Spring 和 Grails 提供的 API 使用它。
交换器、队列和绑定
就像任何消息系统一样,AMQP 是一种处理发布者和消费者的消息协议。发布者生成消息,消费者接收并处理它们。消息代理(例如 RabbitMQ)的工作是确保来自发布者的消息发送到正确的消费者。为此,代理使用两个关键组件:交换器和队列。下图展示了它们如何将发布者连接到消费者
正如您所见,设置非常简单。发布者将消息发送到命名交换器,消费者从队列中拉取消息(或根据配置,队列将消息推送到消费者)。当然,首先必须建立连接,那么发布者和消费者如何发现彼此呢?通过交换器的名称。通常,发布者或消费者会创建一个具有指定名称的交换器,然后将该名称公开。公开方式取决于具体情况,例如可以将其写在公共 API 文档中或发送给已知客户端。
消息如何从交换器路由到队列?好问题。首先,队列必须附加到指定的交换器。通常,消费者会创建一个队列并同时将其附加到交换器。其次,交换器收到的消息必须与队列匹配——这个过程称为“绑定”。
要理解绑定,理解 AMQP 消息的结构很有帮助
消息的 header 和 properties 基本上是键值对。它们的区别在于 header 由 AMQP 规范定义,而 properties 可以包含任意的、特定于应用程序的信息。实际的消息内容只是一系列字节,所以如果您想在消息中传递文本,那么应该标准化一种编码。UTF-8 是一个不错的选择。如果需要,您可以在消息 header 中指定内容类型和编码,但这显然不是很常见。
这与绑定有什么关系?其中一个标准 header 称为routing-key经纪人就是用它来将消息与队列匹配的。每个队列都指定一个“绑定键”,如果该键与routing-keyheader,队列就会收到消息。
交换器类型的概念使事情稍微复杂化。AMQP 规范定义了以下四种类型
交换器类型 | 行为 |
---|---|
Direct (直连) | 绑定键必须与路由键完全匹配——不支持通配符。 |
Topic (主题) | 与 Direct 相同,但在绑定键中允许使用通配符。'#' 匹配零个或多个点分隔的单词,而 '*' 匹配恰好一个此类单词。 |
Fanout (扇出) | 路由键和绑定键被忽略——所有发布的消息都发送到所有绑定的队列。 |
Headers (头部) |
更新 我修正了关于通配符的信息,通配符是基于点分隔的单词或术语工作的。
例如,假设发布者向一个名为“Stocks”的主题交换器发送一条路由键为“NYSE”的消息。如果消费者创建一个附加到“Stocks”的队列,其绑定键为“#”、“*”或“NYSE”,那么该消费者将收到该消息,因为这三个绑定键都匹配“NYSE”。然而,如果消息发布到一个 direct 交换器,那么如果绑定键是“#”或“*”,消费者将不会收到消息,因为这些字符被视为字面量,而不是通配符。有趣的是,尽管路由键没有点,“#.#”也会匹配“NYSE”。
现在考虑一条路由键为“NYSE.TECH.MSFT”的消息。考虑到消息将发送到一个主题交换器,哪些绑定键会匹配它?
绑定键 | 匹配? |
---|---|
NYSE.TECH.MSFT | 是 |
# | 是 |
NYSE.# | 是 |
*.* | 否 |
NYSE.* | 否 |
NYSE.TECH.* | 是 |
NYSE.*.MSFT | 是 |
基本上就是这样。每个队列支持多个消费者以及每个交换器支持多个队列提供了灵活性。事实上,单个队列甚至可以绑定到多个交换器。现在让我们看看其中的一些场景。
RPC (远程过程调用)
AMQP 代理可以充当客户端和服务之间的 RPC 机制。一般的设置如下,使用一个 direct 交换器
一般流程如下
- 客户端向队列发送消息,指定:(a) 与服务匹配的路由键;(b) 用于接收响应的队列名称。
- 交换器将消息传递到服务的队列(本例中是“ops_q”)。
- 队列将消息推送到服务,服务处理完后将响应消息发回交换器,指定与回复队列匹配的 routing_key。
- 客户端从回复队列中获取响应消息。
从客户端的角度来看,调用可以是阻塞的或非阻塞的。然而,执行其中哪种方式的难易程度取决于所使用的客户端库。
RPC 场景的关键是确保客户端和服务对于初始请求使用相同的交换器,并且客户端知道路由键应指定什么。
至于回复队列,它通常由客户端创建,然后客户端填充reply_toheader。此外,尽管回复可以使用与请求不同的交换器,但更常见的是对请求和回复使用相同的交换器。
Pub(lish)/Sub(scribe) (发布/订阅)
JMS 有主题队列的概念,它确保发布者的消息发送到所有订阅者。您可以通过将多个队列绑定到交换器,轻松在 AMQP 中实现相同的行为,如下所示
更好的是,队列可以通过绑定键过滤接收哪些消息。如果消费者想接收所有消息,它可以指定绑定键为“#”——即“匹配任意数量单词”的通配符。对于普通开发者来说,有点令人困惑的是,“*”匹配零个或一个(点分隔的)单词,正如前面提到的。
工作分发
想象您的应用程序有一堆需要执行的任务。使用 AMQP,您可以连接多个消费者,使得每个任务仅由其中一个消费者处理。发布者不关心哪个消费者完成了工作,只关心工作被完成。这就是工作分发。
配置它非常简单,如下图所示
因此,您有一个绑定到交换器的队列,并且有多个消费者共享该队列。这种设置保证无论有多少消费者,给定的消息只会被一个消费者处理。
这些是 AMQP 代理的三种主要使用模式。虽然我分别描述了它们,但通常会结合使用。例如,您可以在 RPC 模式下拥有多个服务共享同一个队列(工作分发)。如何配置交换器和队列完全取决于您,现在您应该对如何为您的场景找到合适的设置有足够的了解。
Spring: Grails 的基础
在 SpringSource 的 Groovy & Grails 培训课程中,我们强调 Grails 站在巨人的肩膀上。其中一个巨人就是 Spring。没有它,Grails 根本不可能开发得如此之快。它可能也不会有如此的灵活性,无法轻松与企业 Java 系统集成。只需看看可用的插件数量:许多都基于支持 Spring 的 Java 库。
在这篇文章中,我想首先探讨 Grails 如何使用 Spring,然后介绍您可以访问其原生强大功能和灵活性的各种方式。
Spring 的孩子
您可能不知道,但是当您创建一个 Grails 应用程序时,您也在创建一个 Spring MVC 应用程序。在底层,Grails 创建了 Spring MVC 的一个变体DispatcherServlet并配置了一系列 bean 来完成繁重的工作。当然,这意味着您的应用程序底层有一个 Spring 上下文——正如您稍后将看到的,您可以访问它。这里有一些…
Spring Web Flow 2.1.0.RC1 现已发布
将 SpringSource Tool Suite 2.3.3.M1 与 Roo 和 GWT 一起使用
什么是插件化架构?
Grails 是一个非常出色的框架,可以快速轻松地开发 Web 应用程序。您还可以访问大量插件,这些插件提供功能或使与其他系统的集成变得简单方便。这些都很好,但在这篇文章中,我想谈谈当您的应用程序增长,您开始淹没在控制器、领域类和其他文件的海洋中时会发生什么。
关注点分离
软件架构中最有用的模式之一称为关注点分离。其思想是将与特定特性或关注点相关的一切分组到一个单一的、自包含的单元中。该单元中的代码不应承担任何其他职责。例如,Web 服务中的业务逻辑应该在一个类中,而 SOAP 消息的处理应该在另一个类中:业务逻辑和 SOAP 处理是两个不同的关注点。这种模式的真正优点在于您可以将这些单元聚合到更粗粒度的关注点中,从而最终在多个级别上使用该模式。例如,假设上面提到的 Web 服务…
SpringSource dm Server 2.0.2 今天发布。
此版本修复了一些错误,发布说明可从JIRA获取。此版本可从 SpringSource.org 的项目页面下载。
- 内核启动硬超时限制已增加,以允许 dm Server 在较慢的机器上运行。
- 记录了 OSGi web 容器中的一个限制,不支持 Tomcat 的 <context> 元素。
- 修复了 ServiceScoper 类,使其关闭所有输入流。
- 增加了支持以容忍 File.list 偶尔返回 null,这表现为 pickup 目录偶尔似乎无故清空自己。
- 现在使用 @Configurable 与 ServerOsgiBundleXmlWebApplicationContext 一起工作正常。
该项目正作为 Virgo 捐赠给 Eclipse 基金会。我们计划在适当时候发布一个 Virgo 的基线版本,它在功能上将等同于 dm Server 2.0。请参阅 Virgo 的网站了解更多信息。除了 dm Server,SpringSource 将为 Virgo 提供商业支持。