第一个 Virgo 里程碑发布

工程 | Glyn Normington | 2010年6月17日 | ...

来自 EclipseRT 的 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 Framework 3.0.3 发布

工程 | Juergen Hoeller | 2010年6月15日 | ...

经过数周的微调和社区反馈,Spring Framework 3.0.3 现已发布。此版本修复了针对 Spring 3.0.2 报告的 100 多个小问题,尤其是在 JSP 标签库和 Portlet 会话处理中,以及在 ConversionService 细节中。同样,此版本赶上了最近的第三方版本:OpenJPA 2.0 正式版、Hibernate 3.5.2 和 JBoss 6.0.0 M3,所有这些现在都完全支持与 Spring 3 结合使用。

请注意,在此期间,所有主要的持久性提供程序都发布了具有 JPA 2.0 支持的 GA 版本,甚至……

了解 RabbitMQ 使用的协议 AMQP

工程 | Peter Ledbrook | 2010年6月14日 | ...

更新 我更改了第一段内容,以阐明 RabbitMQ 和 JMS 之间的关系。

RabbitMQ 是一款轻量级、可靠、可扩展且可移植的消息代理。但与 Java 开发人员熟悉的许多消息代理不同,它不基于 JMS。相反,您的应用程序通过平台中立的线级协议(高级消息队列协议 (AMQP))与之通信。幸运的是,已经有一个 Java 客户端库,并且 SpringSource 正在开发一流的 Spring 和 Grails 集成 - 因此,无需担心必须执行低级操作才能使用 RabbitMQ。您甚至可以找到公开 JMS 接口的 AMQP 客户端库。但是 AMQP 在操作上与 JMS 有很大不同,因此可能会给习惯了 JMS 模型的 Java 开发人员带来麻烦。

为了简化过渡,我将在本文中介绍支持 AMQP 的基本概念以及三种常见的使用场景。最后,您希望能够充分了解如何配置 RabbitMQ 并通过 Spring 和 Grails 提供的 API 使用它。

交换机、队列和绑定

与任何消息传递系统一样,AMQP 是一种消息协议,处理发布者和消费者。发布者生成消息,消费者获取并处理它们。消息代理(例如 RabbitMQ)的工作是确保发布者的消息传递到正确的消费者。为了做到这一点,代理使用两个关键组件:交换机和队列。下图显示了它们如何将发布者连接到消费者

rabbit-basics

如您所见,设置非常简单。发布者将消息发送到命名交换机,消费者从队列中提取消息(或者根据配置,队列将消息推送到消费者)。当然,首先必须建立连接,那么发布者和消费者如何发现彼此呢?通过交换机的名称。通常,发布者或消费者使用给定名称创建交换机,然后公开该名称。发布方式取决于具体情况,但可能会将其放在公共 API 文档中或发送给已知的客户端。

消息如何从交换机路由到队列?好问题。首先,队列必须附加到给定的交换机。通常,消费者会创建队列并将其附加到交换机。其次,交换机接收的消息必须与队列匹配 - 这个过程称为“绑定”。

要了解绑定,了解 AMQP 消息的结构很有用

rabbit-message

消息的标头和属性基本上是键值对。它们之间的区别在于,标头由 AMQP 规范定义,而属性可以包含任意特定于应用程序的信息。实际的消息内容只是一系列字节,因此,如果您想在消息中传递文本,则应标准化编码。UTF-8 是一个不错的选择。如果需要,可以在消息标头中指定内容类型和编码,但这似乎并不常见。

这与绑定有什么关系?一个标准标头称为路由键代理使用它将消息与队列匹配。每个队列都指定一个“绑定键”,如果该键与路由键标头的值匹配,则队列接收该消息。

交换机类型的概念使事情变得稍微复杂了一些。AMQP 规范定义了以下四种类型

交换机类型 行为
直接 绑定键必须与路由键完全匹配 - 不支持通配符。
主题 与直接相同,但绑定键中允许使用通配符。'#' 匹配零个或多个点分隔的单词,'*' 匹配恰好一个这样的单词。
扇出 路由键和绑定键将被忽略 - 所有发布的消息都将发送到所有绑定的队列。
标头

更新 我更正了有关通配符的信息,通配符基于点分隔的单词或术语。

例如,假设发布者将路由键为“NYSE”的消息发送到名为“Stocks”的主题交换机。如果消费者创建了一个附加到“Stocks”的队列,并且绑定键为“#”、“*”或“NYSE”,则该消费者将收到该消息,因为所有三个绑定键都与“NYSE”匹配。但是,如果消息发布到直接交换机,则如果绑定键为“#”或“*”,则消费者将不会收到该消息,因为这些字符被视为文字,而不是通配符。有趣的是,“#.#”也将匹配“NYSE”,尽管路由键没有点。

现在考虑一个路由键为“NYSE.TECH.MSFT”的消息。鉴于消息将发送到主题交换机,哪些绑定键将与之匹配?

绑定键 匹配?
NYSE.TECH.MSFT
#
NYSE.#
*.*
NYSE.*
NYSE.TECH.*
NYSE.*.MSFT

这就是全部。每个队列支持多个消费者,每个交换机支持多个队列,从而提供了灵活性。实际上,单个队列甚至可以绑定到多个交换机。现在让我们看看其中的一些场景。

RPC

AMQP 代理可以在客户端和服务之间充当 RPC 机制。一般设置如下,使用直接交换机

rabbit-rpc

一般序列如下

  1. 客户端将消息发送到队列,指定:(a) 与服务匹配的路由键;以及 (b) 从中提取响应的队列名称。
  2. 交换机将消息传递到服务的队列(在本例中为“ops_q”)。
  3. 队列将消息推送到服务,然后服务执行一些工作并将响应消息发送回交换机,指定与回复队列匹配的 routing_key。
  4. 客户端从回复队列中提取响应消息。

从客户端的角度来看,调用可以是阻塞的或非阻塞的。但是,执行哪种操作的难易程度取决于使用的客户端库。

RPC 场景的关键是确保客户端和服务对初始请求使用相同的交换机,并且客户端知道为路由键指定什么。

至于回复队列,它通常由客户端创建,然后客户端适当地填充reply_to标头。此外,尽管您可以使用与请求不同的交换机进行回复,但更常见的是对请求和回复都使用相同的交换机。

发布/订阅

JMS 具有主题队列的概念,以确保发布者的消息传递到所有订阅者。您可以通过如下方式将多个队列绑定到交换机,轻松地在 AMQP 中实现相同的功能

rabbit-pub-sub

更好的是,队列可以通过绑定键过滤它们接收的消息。如果消费者想要接收所有消息,则可以指定“#”绑定键 - “匹配任意数量的单词”通配符。正如前面提到的,令人困惑的是,“*”匹配零个或一个(点分隔的)单词。

工作分配

假设您有一个应用程序,其中包含许多需要执行的作业。使用 AMQP,您可以连接多个消费者,以便每个作业只传递到其中一个消费者。发布者不关心哪个消费者执行工作,只关心工作是否完成。这是工作分配。

配置非常简单,如下图所示

rabbit-work

因此,您有一个绑定到交换机的队列,多个消费者共享该队列。此设置保证只有一个消费者处理给定的消息,无论有多少消费者。

这些是 AMQP 代理的三种主要使用模式。虽然我已经分别描述了每一种,但通常将它们组合在一起。例如,在 RPC 模式中,多个服务可以共享同一个队列(工作分配)。如何配置交换机和队列完全取决于您,现在您应该能够充分了解如何为您的情况确定合适的设置。

如果您想进一步了解 AMQP,请查看 规范本身,尤其是关于通用架构的部分。要开始使用 RabbitMQ,只需访问 其网站

Spring:Grails 的基础

工程 | Peter Ledbrook | 2010年6月8日 | ...

在 SpringSource 的 Groovy & Grails 培训课程中,我们强调 Grails 是站在巨人的肩膀上。其中一个巨人是 Spring。如果没有它,Grails 的开发速度肯定不会那么快。它可能也没有那么灵活,无法轻松地与企业 Java 系统集成。看看可用插件的数量:许多插件都基于具有 Spring 支持的 Java 库。

在这篇文章中,我想首先了解 Grails 如何使用 Spring,然后介绍访问这种原始强大功能和灵活性的各种方法。

Spring 的孩子

您可能没有意识到这一点,但当您创建 Grails 应用程序时,您也同时创建了一个 Spring MVC 应用程序。在幕后,Grails 创建了 Spring MVC 的一个变体DispatcherServlet并配置了一堆 Bean 来完成繁重的工作。当然,这意味着您的应用程序的基础是 Spring 上下文 - 一个您稍后将可以看到可以访问的上下文。

以下是一些……

使用 SpringSource Tool Suite 2.3.3.M1 与 Roo 和 GWT

工程 | Christian Dupuis | 2010 年 6 月 2 日 | ...

到目前为止,你们中的大多数人可能已经听说过 Google I/O 大会上关于 Spring、Roo、STS 和 GWT 的公告。BenRod 最近在其各自的 博客 文章 中对此进行了报道。如果您错过了主题演讲,我强烈建议您观看 YouTube 上的录制内容以了解情况(相关部分从录制开始的 1:09:00 开始)。

今天,我想提供一些详细的步骤和说明,说明如何使用 Roo 和 STS 创建您的第一个 GWT 应用程序。

安装

在启动 Roo shell 并开始键入命令之前,我们需要下载并安装所有先决条件。尽管很多……

什么是面向插件的架构?

工程 | Peter Ledbrook | 2010 年 6 月 1 日 | ...

Grails 是一个用于快速轻松地开发 Web 应用程序的绝佳框架。您还可以访问大量插件,这些插件提供功能或使与其他系统的集成变得轻松便捷。这一切都很好,但在本文中,我想讨论一下当您的应用程序增长并开始陷入控制器、域类和其他文件的海洋时会发生什么。

关注点分离

软件架构中最有用的模式之一称为关注点分离。其思想是将与特定功能或关注点相关的所有内容分组到一个独立的单元中。该单元中的代码不应承担任何其他责任。例如,Web 服务的业务逻辑应该在一个类中,而 SOAP 消息的处理应该在另一个类中:业务逻辑和 SOAP 处理是两个不同的关注点。

这种模式的真正优点在于您可以将这些单元聚合为更粗粒度的关注点,因此您最终可以在多个级别上使用该模式。例如,假设上面提到的 Web 服务……

SpringSource dm Server 2.0.2 今天发布。

工程 | Christopher Frost | 2010 年 5 月 27 日 | ...

此版本修复了一些错误,发行说明可从 JIRA 获取。此版本可以从 SpringSource.org 上的项目 页面 下载。

  • 内核启动硬超时限制已增加,以允许 dm Server 在较慢的机器上运行。
  • 记录了 OSGi Web 容器中的一个限制,不支持 Tomcat <context> 元素。
  • 修复 ServiceScoper 类以关闭所有输入流。
  • 添加了支持偶尔容忍 File.list 返回 null,这表现为拾取目录偶尔会自行清空,原因不明。
  • 现在可以使用 ServerOsgiBundleXmlWebApplicationContext 中的 @Configurable。

该项目正在捐赠给 Eclipse 基金会作为 Virgo。我们的目标是适时发布 Virgo 的基线版本,该版本在功能上等同于 dm Server 2.0。有关更多信息,请参阅 Virgo 网站。除了 dm Server 之外,SpringSource 还将为 Virgo 提供商业支持。

Spring Insight 1.0.0.M3 发布

工程 | Jon Travis | 2010 年 5 月 26 日 | ...

Spring Insight 团队自豪地宣布发布 Spring Insight 1.0.0.M3。此版本包含大量新的增强功能,可为您提供更高的生产力,并使您的应用程序更快地投入生产。Spring Insight 可作为 tc Server Developer EditionSpringSource Tool Suite 的一部分使用,但您可以在 http://springsource.org/insight 获取新的开发人员版本。设置时间通常需要 10 秒。

Spring Insight 1.0.0.M3 Screencast

Speed Tracer

最受关注的新功能是我们与 Google Speed Tracer 的集成,该功能在上一周的 Google IO 大会 上宣布。这种创新的组合使开发人员能够全面了解 Web 请求中执行的所有工作——从 CSS 样式和视图呈现到 JDBC 查询和 JSP 呈现时间。与 Google 的工程师合作,利用这项技术取得了一些突破,这真是令人兴奋。您一定会喜欢此功能!它是一个无缝集成的功能,易于使用,并为您提供了前所未有的可见性。

更简单的 UI

我们还在应用程序中添加了许多信息:吞吐量和错误率指标、健康区域、更深入地了解 Spring 控制器、更深入的 JDBC 支持、应用程序健康状况等等。但是,这些新信息不应让人不知所措,因为我们也投入了大量时间来简化,使我们的 UI 清晰易懂且易于导航。

开发套件

最后,我们发布了我们的 Insight 开发套件 (IDK)。我们从许多用户那里了解到,他们希望能够在 Insight 中自定义其应用程序,或者希望添加其他指标。Insight 现在通过其 @InsightOperation 和 @InsightEndPoint 注解以及 IDK 和创建更深入插件的教程提供了此功能。IDK 包括 Insight 附带的所有插件的源代码(Apache 2.0 许可)以及 IDK API——编写您自己的应用程序的绝佳示例和说明。

Spring Insight 团队正在努力开发下一个版本,我们的列车正在沿着轨道行驶,我们迫不及待地想听取您的反馈和建议。从 http://springsource.org/insight 获取版本,并在 社区论坛 中留下您的评论……

Spring Python 1.1 书籍已出版

工程 | Greg L. Turnquist | 2010 年 5 月 24 日 | ...

Spring Python 1.1 书籍 已出版!Spring Python 采用 Spring FrameworkSpring Security 的概念,并将其应用于 Python 世界。

在这本书中,您将使用 依赖注入面向方面编程数据访问事务管理远程调用安全 来编写代码。在第一个案例研究中,您将构建一个银行 Web 应用程序,并了解如何协同使用所有这些组件来快速满足您的需求。在第二个案例研究中,您将集成 Python 和 Java,构建一个航班预订系统。

本书充满了代码……

更多 Grails 1.3 功能

工程 | Peter Ledbrook | 2010 年 5 月 24 日 | ...

上周,我描述了 Grails 如何将插件视为可以从与 Maven 兼容的存储库中提取的普通依赖项。虽然这是 1.3 的主要新功能,但它并不是唯一的。在这篇文章中,我将介绍其他一些功能,首先介绍一个我最近才发现的功能。

命名查询

GORM 提供了三种不同的执行数据库查询的方式
  • 动态查找器,例如 Book.findByTitleAndAuthorLike(...);
  • 标准查询,使用简洁的 DSL;以及
  • HQL,Hibernate 的类似 SQL 的查询语言。
这三个功能提供了易用性和强大的混合,为您提供了所需的灵活性。但仍然缺少一些东西。

开发一个非平凡的 Grails 应用程序,您很快就会意识到您经常一遍又一遍地使用相同的查询。你应该怎么做?复制粘贴技术很简单,但会给您带来重大的维护问题。您可以为每个常用的服务方法编写服务方法……

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部