首个 Eclipse Gemini Blueprint 里程碑版本发布

工程 | Costin Leau | 2010年7月1日 | ...

紧随STS在 Eclipse 3.6 上运行和 Gemini Web里程碑公告之后,我很高兴地宣布 Gemini Blueprint 的第一个里程碑版本已可供下载。作为Gemini项目的一部分,Blueprint 基于 Spring Dynamic Modules v2 代码库,并且是 OSGi 4.2 Blueprint 规范的参考实现。除了反映迁移到 Eclipse 基金会的更改之外,1.0.0.M1 代码库也已升级到最新的 Spring 框架版本。Gemini Blueprint 采用 Apache 许可证和 Eclipse 公共许可证双重许可。

虽然将现有的 Spring DM 应用程序迁移到 Gemini Blueprint 应该非常简单,但有一份指南

首个 Eclipse Gemini Web 里程碑版本发布

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

Gemini Eclipse Gemini Web的第一个里程碑版本 (1.1.0.M01) 现已可供下载,采用Eclipse 公共许可证Apache 许可证 2.0双重许可。

SpringSource 开发了 OSGi Web 容器的参考实现,然后将代码贡献给 Eclipse 作为Gemini的 Web 子项目。Gemini 的目标是提供 Java EE 技术的模块化实现。Gemini Web 提供 servlet 和 JSP 技术。

Gemini Web 在 Equinox OSGi 框架上运行并嵌入 Tomcat。它也集成到 Eclipse Virgo Web 服务器中。

有关更多信息,请参阅文档wiki

Apache Tomcat 7.0.0 Beta 版现已可用

发布 | Adam Fitzgerald | 2010年6月29日 | ...

第一个Apache Tomcat 7版本,Tomcat 7.0.0 Beta 版,现已从 Apache 软件基金会的 Tomcat 7 下载页面提供。

SpringSource 的 Tomcat 专家Mark ThomasTomcatExpert.com上描述了该版本的详细信息。除了实现 Servlet 3.0、JSP 2.2 和 EL 2.2 规范之外,Tomcat 7 还拥有许多新功能

  • 内存泄漏预防和检测
  • 防止会话固定攻击
  • 一个简单的过滤器,用于向应用程序添加跨站点请求伪造保护
  • 简化的嵌入
  • 别名支持
  • 增强 Manager 和 Host Manager 应用程序的安全性

有兴趣使用 Tomcat 的开发人员还应该查看tc Server Developer Edition,它集成了Spring Insight性能分析控制台。tc Server 团队正在跟踪 Tomcat Beta 过程,并将提供…

GORM 陷阱 (第一部分)

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

您是 Grails 的新手吗?或者您是否遇到了第一个 GORM“奇特之处”?如果是这样,那么您需要阅读本系列关于 GORM 陷阱的文章。这些文章不仅会重点介绍那些经常让人措手不及的小问题,还会解释为什么 GORM 会以这种方式运行。

希望您已经知道 GORM 是 Grails 附带的数据库访问库。它基于可能是最流行的 Java ORM:Hibernate。正如您所料,Hibernate 是一个功能强大且灵活的库,它为 GORM 带来了巨大的好处。但使用它也需要付出代价:许多…

首个 Virgo 里程碑版本发布

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

Virgo from EclipseRT 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 现已可用

发布 | Adam Fitzgerald | 2010年6月16日 | ...

Juergen Hoeller宣布 Spring 3.0.3 现已可用。此次小版本修复了 100 多个针对 Spring 3.0.2 报告的小问题,特别是在 JSP 标签库和 Portlet 会话处理中,以及在 ConversionService 细节中。再次强调,此版本赶上了最近的第三方版本:OpenJPA 2.0 正式版、Hibernate 3.5.2 和 JBoss 6.0.0 M3,所有这些版本现在都完全支持与 Spring 3 结合使用。

下载 | 文档 | Javadoc API | 更改日志 | JIRA

请注意,我们不再提供依赖项下载。获取与 Spring 一起使用的第三方库的推荐方法是 Maven/Ivy;您也可以下载您选择的第三方分发版并从中获取 jar 文件。请注意,除非您想要升级,否则没有理由升级第三方库:最简单的解决方案是继续使用您了解并信任的版本。

不要忘记,Spring 用户可以在社区论坛中提问,并在JIRA中识别问题。

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 版本,甚至…

了解 AMQP,RabbitMQ 使用的协议

工程 | 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 是一个不错的选择。如果需要,您可以在消息头部指定内容类型和编码,但这似乎并不常见。

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

交换机类型的概念使事情略微复杂化。AMQP 规范定义了以下四种类型

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

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

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

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

绑定键(Binding key) 匹配?(Match?)
NYSE.TECH.MSFT 是(Yes)
# 是(Yes)
NYSE.# 是(Yes)
*.* 否(No)
NYSE.* 否(No)
NYSE.TECH.* 是(Yes)
NYSE.*.MSFT 是(Yes)

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

远程过程调用(RPC)

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

rabbit-rpc

一般顺序如下

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

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

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

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

发布/订阅(Pub(lish)/Sub(scribe))

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

rabbit-pub-sub

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

工作分配(Work distribution)

假设您有一个应用程序,其中有很多需要执行的作业。使用 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 上下文作为基础 - 一个您稍后可以访问的上下文。

这里有一些…

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部