Spring for Apache Hadoop 1.0.0 M2 的亮点

工程 | Costin Leau | 2012 年 6 月 13 日 | ...

我很高兴地宣布 Spring for Apache Hadoop 项目的第二个里程碑版本 (1.0.0.M2) 现已可用。在这篇博客文章中,我想快速重点介绍 M2 中的主要新功能。

HBase DAO 支持

Spring Framework 中最通用和最强大的功能之一是数据访问对象(或 DAO)支持。Spring for Hadoop 1.0.0 M2 为 HBase 添加了相同的功能。熟悉流行的模板和回调模式的用户会感到非常轻松,因为该框架负责表查找、资源清理和异常转换,让开发人员专注于真正重要的事情。有关更多信息,请参阅 API 和参考文档。顺便说一下,我们还在发行版中包含了一个新的示例,hbase-crud,以帮助您立即开始使用。

Cascading Taps

在 M2 中,我们通过为 Spring Framework 和 Spring Integration 资源Taps 扩展了与 Cascading 库的集成。Spring Integration 适配器(无论是入站还是出站)的丰富功能(如 File、TCP、Twitter、FTP、RSS 等)现已可用于 Cascading(及其扩展,如 CascalogScalding)。这仅仅是个开始——期待在此方面有更多新闻。

Hadoop 安全

使用 M2,从一个普通的 Hadoop 安装(例如开发机器)迁移到完全 Kerberos 安全的 Hadoop 集群是透明的。文件系统、Map/Reduce 和 Pig 组件都具有安全意识,在适当的凭据下执行并支持用户模拟。有关更多信息,请参阅专用章节

增强的普通 Map/Reduce 支持

从一开始,Spring for Apache Hadoop 就为 Map/Reduce 作业提供了广泛的支持——无论是普通 Java Map/Reduce、还是工具。在 M2 中,我们全面添加了对 Hadoop 通用选项支持,使得作业提供,无论是通过单独命名资源还是通过模式匹配,都可以一行完成。此外,我们还增强了基于 jar 的作业的引导——不再需要将类放在类路径上,作业可以从 jar 中完全隔离加载。类(及其依赖项)不会泄露到应用程序中,从而避免了各种版本冲突和依赖蔓延。工具声明也得到了改进,可以自动读取 Jar 元数据及其主类 (Main-Class),提供了一个强大的、完全托管的替代 Hadoop shell 的替换方案jar调用。

两个新示例

最后同样重要的是,发行版中添加了两个新示例hbase-crud,正如我之前提到的,展示了声明式和编程式的 HBase 支持以及pig-scripting,演示了 JVM 和 Pig 脚本:前者在 HDFS 中进行数据准备以供后者进行数据分析。还有更多示例正在开发中,如果您想看到任何特别的内容,请告诉我们。

我希望您喜欢这个新的里程碑版本。请继续,获取 1.0.0 M2,试用一下,并告诉我们您的想法!

其他新闻:Project Serengeti

就新发布版本而言,Spring for Apache Hadoop 1.0.0 M2 并不是 Hadoop 方面的唯一新闻。今天,VMware 公布了 Serengeti 项目,该项目用于虚拟化和高可用性的 Hadoop。请参阅 Richard McDougall 关于该项目动机和当前状态的博客文章……

本周 Spring,2012 年 6 月 5 日

工程 | Josh Long | 2012 年 6 月 6 日 | ...

欢迎回到新一期的本周 Spring。和往常一样,这周有很多内容要看,所以让我们开始吧……

  1. Chris Beams 最近关于 Spring 支持的各种依赖注入风格的网络研讨会视频已发布。Chris 是 Spring 框架的核心工程师(也是个全面优秀的人)。如果您仍然认为 Spring 配置需要 XML,那么这个视频绝对值得一看。
    	  </LI> 
     <LI> Oleg Zhurakousky announced the availability of 
    	 <a href = "http://www.springsource.org/node/3569">
    	 Spring Integration 2.1.2 RELEASE and 2.2.0M2</A>. The new releases are filled with many important bug fixes as well as several  
    	
    	 new features.  
    	 </LI>
    	<LI>  Roy Clarkson has announced the availability of <a href= "http://www.springsource.org/spring-android/news/1.0.0-released">Spring Android 1.0.0.RELEASE</A>! The project is an extension of the Spring Framework that aims to simplify the development of native Android applications by providing RESTTemplate support for…

本周 Spring:2012 年 5 月 29 日

工程 | Adam Fitzgerald | 2012 年 5 月 29 日 | ...

欢迎回到新一期的本周 Spring!和往常一样,我们有很多内容要介绍,所以让我们直接开始吧!

  1. Chris Beams 宣布 Spring 3.2 的第一个里程碑版本现已可用!这个版本太棒了!
    	It includes 
    
    	initial support for asynchronous <CODE> @Controller</CODE> methods,
    	early support for JCache-based cache providers,
    	significant performance improvements in autowiring of non-singleton beans,
    	initial delay support for <CODE> @Scheduled</CODE> and <CODE> &lt;task:scheduled&gt;</CODE>,
    	ability to choose between multiple executuors with <CODE>@Async</CODE>,
    	enhanced bean profile selection using the not (<CODE>!</CODE>) operator,  
    	48 bugs fixed, 8 new features and 36 improvements implemented. 
    	
    

    现在就查看最新、最棒的版本,并随时提供反馈!

    当我在我的 Twitter 账户上征求本综述中可以考虑的项目时,一位用户立即回复说:“随着 Spring 3.2 的消息,社区是否希望 3.2 M1 之后直接跟着 RC1 进行一次投票怎么样?这个版本太好了,等不及了。” 我同意,这个版本确实……

Spring Roo 1.2.2.RELEASE 可用

工程 | Alan Stewart | 2012 年 5 月 28 日 | ...

Spring Roo 团队很高兴地宣布 1.2.2.RELEASE 版本现已可用。这是 1.2 版本的第二个维护版本,包含许多问题的修复,并支持 Spring Framework 3.1.1 和 JDK 7。Roo 1.2.2 还包含了我们新合作伙伴埃森哲提供的出色的新“tailor”功能。

希望您喜欢这个新版本!

Alan

Spring Roo 项目负责人

事务、缓存和 AOP:理解 Spring 中的代理用法

工程 | Michael Isvy | 2012 年 5 月 23 日 | ...

在 Spring 框架中,许多技术特性都依赖于代理的使用。我们将使用三个示例深入探讨这个主题:事务缓存Java 配置

本博客文章中展示的所有代码示例都可以在我的 github 账户上找到。

事务

第一步:无事务

下面的 Service 类尚未事务化。让我们先看看它原来的样子,然后再让它变成事务化的。

@Service
public class AccountServiceImpl  implements AccountService {
 //…

//Not specifying a transaction policy here!
 public void create(Account account) {
 entityManager.persist(account);
 }
}

由于方法“create”没有事务性,它很可能会抛出异常(因为这个 Account 对象不应该……

本周 Spring - 2012 年 5 月 22 日

工程 | Josh Long | 2012 年 5 月 22 日 | ...

欢迎回到新一期的本周 Spring。和往常一样,本周我们有很多精彩内容!

  1. Rossen Stoyanchev 在他的 Spring MVC 3.2 预览系列中又发表了一篇博客。最新一篇介绍了一个 Spring MVC 聊天示例
  2. Oliver Gierke 宣布了 Spring Data JPA 的 1.1.0 GA 版本。Spring Data JPA 使构建基于 JPA 的存储库变得非常简单,从而省去了繁琐的模板代码。这个新版本包括用于查询生成的新关键字 (LessThanEqual, GreaterThanEqual, Before, After, StartsWith, EndsWith, 和 Contains),一个方便的 PersistenceUnitPostProcessor 用于扫描 JPA 实体(用于 Spring 3.1 之前的版本),支持 @Query 中的原生查询,以及支持声明式锁定。
  3. Jonathan Brisbin 宣布了 Spring Data REST 的 1.0.0.M2 版本。Spring Data REST 可以轻松地将您的 Spring 存储库对象导出为 RESTful 端点。新版本包括支持调用 Repository 接口的查询方法,支持 JSR 303 和 Spring Validator 验证,以及改进的对在每次保存或删除前后发出的 Spring ApplicationEvents 的支持,以及基于注解的配置。
  4. Oleg Zhurakousky 宣布了 Spring Integration 2.2 的第一个里程碑版本。此版本包括依赖项升级、JPA 支持以及对“发布者确认和返回”的支持,这些功能在 Spring AMQP 中是新支持的。
  5. Gary Russell 宣布了 Spring AMQP 的 1.1.0 版本,其中包括对 RabbitMQ 2.8.x 客户端的支持,后者又支持镜像队列、代理故障转移、发布者确认、返回、联合交换等等。
  6. Matt Vickery 写了一篇很棒的文章,介绍了Spring Integration 的 splitter-aggregator 模式
  7. Willie Wheeler 在他的自定义配置管理数据库(CMDB)方面发表了一篇很棒的文章。文章详细介绍了该项目,然后谈论了他在重建 CMDB 后端时对 Spring Data 存储库的使用。写得好,Willie!
  8. Doug Haber 撰写了一篇精彩的文章,介绍了如何使用 Spring Data 和 Spring 3.1 中的 REST 支持处理分页
  9. 博主panbhatt写了一篇详细的文章,介绍了如何使用 Spring MVC 的 REST 支持来解决他遇到的一组特定问题。
  10. 博主OBSERWATORZY描述了他在尝试消费 RESTful 服务时的特定思考过程,并想知道 Spring 是否提供了解决方案(当然提供了!)。请继续阅读他的解决方案。
  11. Vishal Biyani 整理了一篇不错的入门文章,介绍了如何开始使用 Spring Roo 和 Cloud Foundry
  12. RabbitMQ 博客有一篇精彩的文章,介绍了队列理论(以及吞吐量、延迟和带宽的介绍)
  13. JAXEnter 对本文中提到的一些新闻发布进行了很好的汇总,包括 Spring AMQP 和 Spring Data JPA 的 GA 版本。

本周 Spring,2012 年 5 月 15 日

工程 | Josh Long | 2012 年 5 月 16 日 | ...

欢迎回到新一期的本周 Spring! 和往常一样,本周我们有很多内容要介绍。那么,继续吧!

  1. Rossen Stoyanchev 刚刚发布了他的博客系列文章的第二和第三部分,介绍了 Spring MVC 3.2 的新功能。在第一部分中,Rossen 介绍了如何使 Spring MVC @Controller 方法异步。在第二篇文章中,Rossen 介绍了如何在现有 Web 应用程序中添加长轮询。长轮询在许多需要通过客户端应用程序模拟服务器端推送的场景中非常有用。
  2. <LI>  The video for <a href= "http://blog.springsource.org/author/ozhurakousky/">Oleg Zhurakousky</A>'s followup webinar introducing <a href ="http://www.springsource.org/node/3550">More Practical Tips and Tricks with Spring Integration</A> has just been posted. Check it out! </LI> 
     <LI> <A href ="http://blog.springsource.org/author/rclarkson/">Roy Clarkson</A>  just announced that <a href = "http://www.springsource.org/spring-mobile/news/1.0.0-released">Spring Mobile 1.0.0 has  been released</A>!  </LI>
    
    
    
    <LI>  SpringSource and Cloud Foundry rockstar  <a  href  ="http://blog.springsource…

Spring MVC 3.2 预览:聊天示例

工程 | Rossen Stoyanchev | 2012 年 5 月 16 日 | ...

最后更新于 2012 年 11 月 5 日 (Spring MVC 3.2 RC1)

之前博客文章中,我介绍了 Spring MVC 3.2 中基于 Servlet 3 的异步功能,并使用了 spring-mvc-showcase 和 Spring AMQP 的股票示例来演示。本文介绍了一个聊天示例,其中外部事件不是 AMQP 消息,而是带有聊天消息的 HTTP POST 请求。在文章的第二部分,我将转向分布式聊天,其中事件是 Redis 通知。

聊天在 Web 应用程序中不是一个常见的要求。然而,它是一个只能通过实时通知来满足的需求的很好示例。它对时间延迟比电子邮件或状态警报更敏感,并且在浏览器中与朋友聊天、在网络研讨会期间与同事聊天或在购物网站上与真人聊天并不少见。您可以想象其他类型的在线协作。

示例

spring-mvc-chat 示例可在 Github 上获得。虽然这不是本文的重点,但客户端使用了 Thymeleafknockout.js 和 jQuery。Thymeleaf 是 JSP 的一个极好的替代品,它支持预览,使设计师可以双击 HTML 模板并查看,而 JSP 则需要 Servlet 容器。knockout.js 是一个客户端 MVC 框架,对于将行为附加到 HTML 元素非常方便。要快速了解它,请按照其优秀的教程之一进行操作。jQuery 用于 DOM 脚本和 Ajax 请求。

ChatController

ChatController 暴露了获取和发布聊天消息的操作。以下是获取消息的方法


@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public DeferredResult<List<String>> getMessages(@RequestParam int messageIndex) {

  final DeferredResult<List<String>> deferredResult = new DeferredResult<List<String>>(null, Collections.emptyList());
  this.chatRequests.put(deferredResult, messageIndex);

  deferredResult.onCompletion(new Runnable() {
    @Override
    public void run() {
      chatRequests.remove(deferredResult);
    }
  });

  List<String> messages = this.chatRepository.getMessages…

Spring MVC 3.2 预览:在现有 Web 应用程序中添加长轮询

工程 | Rossen Stoyanchev | 2012 年 5 月 14 日 | ...

最后更新于 2012 年 11 月 5 日 (Spring MVC 3.2 RC1)

在我的上一篇文章中,我讨论了如何通过返回一个 Callable 使 Spring MVC 控制器方法异步,该 Callable 然后由 Spring MVC 在单独的线程中调用。

但是,如果异步处理依赖于在 Spring MVC 未知的线程中接收某些外部事件,例如接收 JMS 消息、AMQP 消息、Redis 发布/订阅通知、Spring Integration 事件等等,该怎么办?我将通过修改 Spring AMQP 项目中的现有示例来探讨这种情况。

示例

Spring AMQP 有一个股票交易示例,其中 QuoteController 通过 Spring AMQP 的 RabbitTemplate 发送交易执行消息,并通过 Spring AMQP 的 RabbitMQ 监听容器以消息驱动的 POJO 风格接收交易确认和价格报价消息。

在浏览器中,示例使用轮询来显示价格报价。对于交易,初始请求提交交易,并返回一个确认 ID,然后用于轮询最终确认。我更新了示例以利用 Spring 3.2 Servlet 3 异步支持。master 分支包含更改前的代码,spring-mvc-async 分支包含更改后的代码。下面的图片显示了对价格报价请求频率的影响(使用 Chrome 开发者工具)

更改前:传统轮询

更改后:长轮询

正如您所见,使用常规轮询时,新请求发送非常频繁(相隔几毫秒),而使用长轮询时,请求可能相隔 5、10、20 甚至更多秒——这显著减少了总请求数量,同时不损失延迟,即新价格报价在浏览器中出现所需的时间。

获取报价

那么需要进行哪些更改呢?从客户端角度来看,传统轮询和长轮询是无法区分的,因此 HTML 和 JavaScript 没有改变。从服务器角度来看,请求必须被保留直到新报价到达。以下是控制器处理报价请求的方式



// Class field
private Map<String, DeferredResult> suspendedTradeRequests = new ConcurrentHashMap<String, DeferredResult>();

...

@RequestMapping("/quotes")
@ResponseBody
public DeferredResult<List<Quote>> quotes(@RequestParam(required = false) Long timestamp) {

  final DeferredResult<List<Quote>> result = new DeferredResult<List<Quote>>(null, Collections.emptyList());
  this.quoteRequests.put(result, timestamp);

  result.onCompletion(new Runnable() {
    public void run() {
      quoteRequests…

Spring MVC 3.2 预览:使控制器方法异步化

工程 | Rossen Stoyanchev | 2012 年 5 月 10 日 | ...

最后更新于 2012 年 11 月 5 日 (Spring MVC 3.2 RC1)

之前文章中,我介绍了 Spring MVC 3.2 中基于 Servlet 3 的异步功能,并讨论了实时更新的技术。在本文中,我将深入探讨更多技术细节,并讨论异步处理如何融入 Spring MVC 请求生命周期。

快速提醒一下,您可以通过更改任何现有控制器方法的返回类型为 Callable 来使其异步化。例如,一个返回视图名称的控制器方法可以改为返回 Callable<String>。一个返回名为 Person 的对象的 @ResponseBody 可以改为返回 Callable<Person>。对于任何其他控制器返回类型也是如此。

一个核心思想是,您已经了解的关于控制器方法工作原理的一切都尽可能保持不变,除了剩余的处理将在另一个线程中发生。在异步执行方面,保持事情简单很重要。正如您将看到的,即使是这个看似简单的编程模型更改,也有相当多的内容需要考虑。

spring-mvc-showcase 已更新以支持 Spring MVC 3.2。请查看 CallableController。您可能会期望,像 @ResponseBody@ResponseStatus 这样的方法注解也适用于 Callable 返回的值。从 Callable 抛出的异常被视为由控制器抛出,在这种情况下通过 @ExceptionHandler 方法处理。等等。

如果您通过浏览器中的“Async Requests”选项卡执行 CallableController 的方法之一,您应该会看到类似以下的输出

08:25:15 [http-bio-8080-exec-10] DispatcherServlet - DispatcherServlet with name 'appServlet' processing GET request for [...]
08:25:15 [http-bio-8080-exec-10] RequestMappingHandlerMapping - Looking up handler method for path /async/callable/view
08:25:15 [http-bio-8080-exec-10] RequestMappingHandlerMapping - Returning handler method [...]
08:25:15 [http-bio-8080-exec-10] WebAsyncManager - Concurrent handling starting for GET [...]
08:25:15 [http-bio-8080-exec-10] DispatcherServlet - Leaving response open for concurrent…

订阅 Spring 邮件列表

通过 Spring 邮件列表保持联系

订阅

领先一步

VMware 提供培训和认证,助您快速进步。

了解更多

获取支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看全部