本周 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 还包括由我们的新合作伙伴 Accenture 提供的优秀的新“裁剪”功能。

我希望您喜欢这个新版本!

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 的存储库变得非常简单,从而免除了您编写冗长的样板代码。此新版本包括用于查询生成的新的关键字(LessThanEqualGreaterThanEqualBeforeAfterStartsWithEndsWithContains)、一个方便的 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 ApplicationEvent 的改进支持以及基于注解的配置。
  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 分割器-聚合器模式
  7. Willie Wheeler 在他的博客上发布了一篇很棒的文章,讨论自定义配置管理数据库(CMDB)。这篇文章详细介绍了该项目,然后讨论了他在使用 Spring Data 的存储库重建 CMDB 后端时的经验。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 模板,允许设计人员双击 HTML 模板并查看它,这与需要 Servlet 容器的 JSP 不同。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 控制器方法异步,然后由 Spring MVC 在单独的线程中调用该方法。

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

示例

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

在浏览器中,示例使用轮询来显示价格报价。对于交易,初始请求会提交交易并返回一个确认 ID,然后使用该 ID 轮询最终确认。我已更新示例以利用 Spring 3.2 Servlet 3 异步支持。 主分支 包含更改之前的代码,而 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方法。以此类推。

如果您通过浏览器中的“异步请求”选项卡执行其中一个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…

将 Cloud Foundry Workers 与 Spring 一起使用

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

您无疑已经阅读了 Jennifer Hickey 令人惊叹的博文 介绍 Cloud Foundry workers、它们在设置 Ruby Resque 后台作业 中的应用,以及 今天介绍 Spring 支持的文章

Spring 开发人员的关键要点

  1. 您需要使用gem update vmc更新您的vmc版本。
  2. Cloud Foundry workers 允许您运行public static void main作业。也就是说,Cloud Foundry worker 本质上是一个进程,其级别低于 Web 应用程序,这自然映射到许多所谓的后台作业。
  3. 您需要提供 Cloud Foundry 将运行的命令。您可以提供您希望它使用的java咒语,但更简单的方法是提供一个 shell 脚本,并让 Cloud Foundry 为您运行该 shell 脚本。您提供的命令应使用$JAVA_OPTS,Cloud Foundry 已提供该命令以确保一致的内存使用情况和 JVM 设置。
  4. 有多种方法可以自动化 Cloud Foundry 可部署应用程序的创建。如果您使用 Maven,那么 org.codehaus.mojo:appassembler-maven-plugin 插件将帮助您创建一个启动脚本并打包您的.jars以方便部署,以及指定一个入口点类。
  5. 其他一切基本上都相同。当您对 Java .jar项目执行vmc push时,Cloud Foundry 会询问您该应用程序是否为独立应用程序。确认,然后它将引导您完成后续设置。

因此,让我们看一下使用 Cloud Foundry workers 更轻松、更自然的几种常见架构和安排。我们将根据 Spring 框架和两个相关项目 Spring IntegrationSpring Batch 来查看这些模式,这两个项目在 Web 应用程序内部和外部都蓬勃发展。正如我们将看到的,这两个框架都支持解耦和改进的组合能力。我们将做什么何时做分开,并将做什么在哪里做分开,这两者都是为了释放前端的容量。

我有一个时间表要遵守!

我经常遇到的一个问题是:如何在 Cloud Foundry 上执行作业调度?Cloud Foundry 支持 Spring 应用程序,而 Spring 当然一直都支持企业级调度抽象,例如 Quartz 和 Spring 3.0 的@Scheduled注解。@Scheduled非常棒,因为它非常易于添加到现有应用程序中。在最简单的情况下,您将@EnableScheduling添加到您的 Java 配置或<task:annotation-driven/>添加到您的 XML 中,然后在您的代码中使用@Scheduled注解。这在企业应用程序中是一件非常自然的事情——也许您有一个需要运行的分析或报告流程?一些长时间运行的批处理流程?我准备了一个示例,演示了如何使用@Scheduled运行 Spring Batch Job。Spring Batch 作业本身是一个工作线程,它与一个 Web 服务配合使用,该 Web 服务的 SLA 不佳,不适合实时使用。在 Spring Batch 中处理工作更安全、更干净,因为它的恢复和重试功能可以弥补任何网络中断、网络延迟等问题。我将您引导至 代码示例以获取大部分详细信息,我们将只查看入口点,然后查看将应用程序部署到 Cloud Foundry。

					    
// set to every 10s for testing.
@Scheduled(fixedRate = 10 * 1000)
public void runNightlyStockPriceRecorder() throws Throwable {
	JobParameters params = new JobParametersBuilder()
		.addDate("date", new Date())
		.toJobParameters();
	JobExecution jobExecution = jobLauncher.run(job, params);
	BatchStatus batchStatus = jobExecution.getStatus();
	while (batchStatus.isRunning()) {
		logger.info("Still running...");
		Thread.sleep(1000);
	}
	logger.info(String.format("Exit status: %s", jobExecution.getExitStatus().getExitCode()));
	JobInstance jobInstance = jobExecution.getJobInstance…

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部