在 Spring 中使用 Cloud Foundry Worker

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

毫无疑问,你已经阅读了 Jennifer Hickey 的精彩博客文章,其中 介绍了 Cloud Foundry worker,它们在设置 Ruby Resque 后台作业中的应用,以及今天这篇介绍 Spring 支持的文章

Spring 开发人员的关键要点

  1. 你需要通过 gem update vmc 更新你的 vmc 版本。
  2. Cloud Foundry worker 允许你运行 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 worker 更简单、更自然的常见架构和安排。我们将从 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 作业本身是一个 worker 线程,它与一个 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 MVC 3.2 预览:实时更新的技术

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

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

在我的上一篇文章中,我介绍了 Spring MVC 3.2 中基于 Servlet 3 的新的异步支持,并讨论了长时间运行的请求。异步处理的第二个非常重要的动机是浏览器需要接收实时更新。示例包括浏览器中的聊天、股票报价、状态更新、实时体育比赛结果等等。诚然,并非所有示例对延迟都同样敏感,但它们都具有相似的需求。

在标准的 HTTP 请求-响应语义中,浏览器发起请求,服务器发送响应,这意味着服务器在收到来自浏览器的请求之前不能发送新信息。为此发展出了几种方法,包括传统轮询长轮询HTTP 流,以及最近出现的 WebSocket 协议。

传统轮询

浏览器不断发送请求来检查新信息,服务器每次都立即响应。这适用于可以以合理稀疏的间隔进行轮询的场景。例如,邮件客户端可以每10分钟检查一次新消息。这很简单且有效。但是,当需要尽快显示新信息时,这种方法就会变得低效,在这种情况下必须非常频繁地进行轮询。

长轮询

浏览器不断发送请求,但服务器在有新信息可发送之前不会响应。从客户端的角度来看,这与传统轮询相同。从服务器的角度来看,这与长时间运行的请求非常相似,并且可以使用第一部分中讨论的技术进行扩展。

响应可以保持打开多长时间?浏览器通常设置为在5分钟后超时,而像代理这样的网络中介甚至可能更快超时。因此,即使没有新信息到达,长轮询请求也应定期完成,以便浏览器发送新的请求。这篇IETF 文档建议使用30到120秒之间的超时值,但实际使用的值可能取决于你对分隔浏览器和服务器的网络中介有多少控制权。

长轮询可以显著减少接收低延迟信息更新所需的请求数量,尤其是在新信息以不规则间隔可用的情况下。然而,更新越频繁,它就越接近传统轮询。

HTTP 流

浏览器向服务器发送请求,服务器在有信息可发送时响应。然而,与长轮询不同的是,服务器保持响应开放,并在新更新到达时继续发送。这种方法消除了轮询的需要,但也更显著地偏离了典型的 HTTP 请求-响应语义。例如,客户端和服务器需要约定如何解释响应流,以便客户端知道一个更新在哪里结束,另一个更新在哪里开始。此外,网络中介可能会缓存响应流,这会阻碍此方法的意图。这就是为什么现在长轮询更常用。

WebSocket 协议

浏览器向服务器发送 HTTP 请求以切换到 WebSocket 协议,服务器通过确认升级来响应。此后,浏览器和服务器可以在 TCP 套接字上双向发送数据帧。

WebSocket 协议旨在取代轮询,特别适用于浏览器和服务器之间需要高频率交换消息的场景。通过 HTTP 的初始握手确保 WebSocket 请求可以穿过防火墙。然而,也存在显著挑战,因为大多数部署的浏览器不支持 WebSocket,并且在穿过网络中介方面还有进一步的问题

WebSocket 围绕着文本或二进制消息的双向交换。这导致了与基于 RESTful、HTTP 的架构截然不同的方法。事实上,需要在 WebSocket 之上使用其他一些协议,例如 XMPP、AMQP、STOMP 或其他协议,而哪一个或哪几个将成为主流还有待观察。

WebSocket 协议已由 IETF 标准化,而 WebSocket API 正在由 W3C 标准化的最后阶段。已经有一些 Java 实现可用,包括 Jetty 和 Tomcat 等 Servlet 容器。Servlet 3.1 规范可能会支持初始的 WebSocket 升级请求,而单独的 JSR-356 将定义基于 Java 的 WebSocket API。

回到 Spring MVC 3.2,Servlet 3 异步特性可用于长时间运行的请求以及 HTTP 流,Filip Hanik 将这些技术称为“客户端 AJAX 调用的服务器版本”。至于 WebSocket,Spring 3.2 尚未提供支持,但很有可能会包含在 Spring 3.3 中。你可以关注 SPR-9356 获取进度更新。

下一篇文章将转向示例代码,更详细地解释 Spring MVC 3.2 的新特性。

Spring MVC 3.2 预览:介绍 Servlet 3,异步支持

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

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

概述

Spring MVC 3.2 引入了基于 Servlet 3 的异步请求处理。这是介绍这项新功能并提供理解如何以及为何使用它的背景的几篇博客文章中的第一篇。

早期版本的主要目的是寻求反馈。自 3.2 M1 版本发布后首次发布以来,我们在这里和 JIRA 都收到了大量反馈。感谢所有尝试并评论的人!已经进行了很多更改,而且还有时间收集更多反馈!

概览

从编程模型的角度来看,新功能看起来非常简单。控制器方法现在可以返回一个 java.util.concurrent.Callable 来异步完成处理。然后,Spring MVC 将借助 TaskExecutor 在单独的线程中调用该 Callable。这是一段之前的代码片段


// Before
@RequestMapping(method=RequestMethod.POST)
public String processUpload(final MultipartFile file) {
    // ...
    return "someView";
}

// After
@RequestMapping(method=RequestMethod.POST)
public Callable<String> processUpload(final MultipartFile file) {

  return new Callable<String>() {
    public Object call() throws Exception {
      // ...
      return "someView";
    }
  };
}

控制器方法还可以返回一个 DeferredResult(Spring MVC 3.2 中的新类型),以便在 Spring MVC 不知的线程中完成处理。例如,响应 JMS 或 AMQP 消息、Redis 通知等。这是另一段代码片段


@RequestMapping("/quotes")
@ResponseBody
public DeferredResult<String> quotes() {
  DeferredResult<String> deferredResult…

本周 Spring 焦点,2012年5月1日

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

欢迎来到又一期的《本周 Spring 焦点》!我正在 SpringOne On The Road - London 活动期间,在会议室后方撰写此文,当时 Adrian Colyer 正在进行精彩的主题演讲。

  1. 你们错过 Oleg Zhurakousky 的网络研讨会《Spring Integration 实用技巧与窍门》了吗?别担心,视频已在线可用

    另外,务必在本周三,5月3日,观看第二部分,分别面向欧洲北美

    	</LI>
    	<LI> <a href = "http://blog.springsource.org/author/rclarkson/">Roy Clarkson</A> has announced the <a href = "http://www.springsource.org/spring-mobile/news/1.0.0.rc2-released">latest release of Spring Mobile</A>.  
    		 The release has several enhancements including more refined resolution, and improved site switching behavior. 
    		
    		</LI> 
    		<LI>  <a href = "http://blog.springsource.org/author/jbrisbin/">Jonathan Brisbin</A> just announced <a href="http://blog.springsource.org/author…

本周 Spring 焦点 - 2012年4月24日

工程 | Josh Long | 2012年4月24日 | ...

欢迎回到又一期的《本周 Spring 焦点》!在我编辑这篇文章时,我正迫不及待地等待 Costin Leau 在阳光明媚、美丽的乌克兰基辅开始他关于 Spring 和 NOSQL 的演讲,这是 Cloud Foundry Open Tour 欧洲站的第一站。这次活动的参与人数惊人!如果你正在阅读这篇文章,那么你已经错过了参加基辅活动的机会,但务必注册即将到来的莫斯科伦敦活动。

  1. 在 SpringOne 2GX 2011 的这场演讲中,Mark Fisher 和 Thomas Risberg 通过将关系型数据库更改为 NoSQL 数据库,引入模块化,添加多语言支持,并利用常见的企业集成模式整合消息队列和事件驱动的请求处理,从而改造了一个单体企业应用程序
  2. 你们注意到《优秀著作 Spring Roo 实战》的最终版刚刚出版了吗?
        This book is, as Ben Alex (Spring Roo project founder) put it, "an insightful and comprehensive treatment." I (personally) can't recommend it enough. Ken Rimple and Srini Penchikala, as long time readers of this roundup will know, are frequent Spring community bloggers and 
    

    定期提供关于 Spring 的精彩内容。

  3. 			 <LI>  
    		Blogger Billy Sj&ouml;berg on DZone has a great post on how <a href = "http://www.dzone.com/links/r/bridging_between_jms_and_rabbitmq_amqp_using_spri.html">to bridge JMS and RabbitMQ</A>. 
    		 This example uses <a href = "http://www.springsource…

本周 Spring 焦点:2012年4月17日

工程 | Adam Fitzgerald | 2012年4月17日 | ...

欢迎回到又一期的《本周 Spring 焦点》。本周是报名参加 SpringOne on the Road 伦敦基辅莫斯科活动的最后机会,所以务必注册。让我们开始吧!

  1. Chris Richardson 关于Java 开发人员的 NoSQL 选项的网络研讨会录音已在 SpringSourceDev YouTube 频道上线。
  2. Shekhar Gulati 关于 Spring Roo 的精彩介绍继续在 IBM 的 developerWorks 门户上发布。最新一期介绍了如何编写高级(和封装)Spring Roo 插件
  3. <LI>  This article, which introduces how to use <a href = "http://java.dzone.com/articles/use-javafx2-spring">Spring to assemble  JavaFX 2 components</a> is short and to the point.  I'd probably use Spring's Java configuration option to fully exploit all the custom components, however. The nice thing about the approach outlined (over using FXML, directly, is that beans configured this way benefit from all the services that Spring provides, including dependency injection and AOP). Nice post, Andy!  </LI>
    
    <LI>Blogger <EM>Rob Gordon</EM> has a nice post introducing <a href ="http://rgordon.co…

本周 Spring 焦点,2012年4月10日

工程 | Josh Long | 2012年4月11日 | ...

多么棒的一周!Cloud Foundry Open Tour 正在顺利进行中,刚刚结束了亚洲和美国站的巡回。现在,向欧洲进发!(如果你在欧洲,现在是确保你的位置的时候了!)

在我们继续分享最新最精彩的内容之前,我想提醒大家关注 Spring Integration 大师 Oleg Zhurakousky 即将举办的网络研讨会:《Spring Integration 实用技巧》。像往常一样,有一场面向北美,一场面向欧洲

  1. Gunnar Hillert 写了一篇博客,介绍了一个在 SpringSource Tool Suite 中备受关注的功能:创建 Spring Integration 项目的易用模板。干得好,Gunnar!此外,还可以观看 Gunnar 在 SpringSource YouTube 频道上的配套视频 使用 STS 创建 Spring Integration 项目
  2. Michael Isvy 写了一篇很棒的博客,解释了在升级到 Spring 3.1 时应该注意的一些事项。非常实用!
  3.  <LI> Spring Integration 2.1.1 has been released! This is the first maintenance release of 2.1.x branch and contains the usual things like bug fixes and improvements related to AMQP, Gemfire, Mongo and Redis modules which were first introduced in Spring Integration 2.1.0. All together 56 issues were resolved with this release. 
    	 For more, consult <a href = "http://www.springsource.org/node/3520">the release announcement</A>.</LI>
    		
    <LI>  Gabriel Axel talks about the <a href = "http://www.gabiaxel.com/2012/04/spring-social-google-first-milestone-is.html">first milestone of Spring Social…

使用 STS 创建 Spring Integration 项目

工程 | Gunnar Hillert | 2012年4月9日 | ...

就在几天前,SpringSource Tool Suite™ (STS) 2.9.1 发布了。除了许多新功能外,它还提供了许多对Spring Integration 用户来说特别令人兴奋的功能。首先,最新的 STS 版本增加了对 Spring Integration 2.1 的支持,并改进了 Spring Integration 流程的可视化能力。STS 现在支持所有最近添加的 Spring Integration 适配器,例如:

此外,所有现有的 Spring Integration 适配器都已更新,以支持新的可视化元素。Spring Integration 用户的另一个出色新增功能是 SpringSource Tool Suite 2.9.x 现在提供了对 Spring Integration 的模板支持。因此,在使用Spring Template Project Wizard 创建新项目时,你现在可以在以下 3 个新的面向 Spring Integration 的模板之间进行选择:
  • Spring Integration 项目(Standalone)- Simple
  • Spring Integration 项目(Standalone)- File
  • Spring Integration 项目(War
Simple 模板创建一个基本的 Spring Integration 项目,它作为一个独立的 Java 应用程序运行,仅使用核心 Spring Integration 组件。为了演示文件轮询功能,File 模板使用额外的组件来轮询文件目录并路由这些文件。最后,War 模板允许用户轻松创建基本的 Spring Integration 项目,这些项目旨在作为 WAR 部署的一部分在 servlet 容器(例如 Tomcat)中运行。为了说明目的,War 模板使用了 Spring Integration 的Twitter 适配器

创建新的 Spring Integration 项目

为了使用 STS Spring 模板开始一个新项目,请在主菜单中转到 File,然后是 NEW,再然后是 Spring Template Project。接下来将显示Template Selection Screen

 

[caption id="attachment_10681" align="aligncenter" width="342" caption="模板选择屏幕"][/caption]

此屏幕提供了所有可用 Spring 模板的列表,包括前面提到的 3 个新的 Spring Integration 模板。如果你在模板名称前面看到那个小箭头——这意味着实际的模板尚未下载。一旦下载,模板将缓存在你的机器上,你无需再次下载模板文件,除非你点击刷新

本周 Spring 焦点 - 2012年4月3日

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

欢迎来到又一期的《本周 Spring 焦点Cloud Foundry Open Tour 正在顺利进行中,到目前为止举办得非常好,吸引了社区的关注。

There are still some (well, there were yesterday!) early bird spots in the upcoming shows in <a href = "http://opentour.cloudfoundry.com/2012/austin">Austin</A>, <a href = "http://opentour.cloudfoundry.com/2012/washington">Washington D.C.</a>, <a href = "http://opentour.cloudfoundry.com/2012/kiev">Kiev</A>, <a href = "http://opentour.cloudfoundry.com/2012/moscow">Moscow</A>, and <a href  = "http://opentour.cloudfoundry.com/2012/london">London</A>, so book now. 

  1. Spring I/O 大会的一些精彩内容现已在线提供!这场大会今年二月在西班牙举行,使用西班牙语和英语进行,因此无论你讲哪种语言,都有很多精彩内容。一旦你克服了开头的音频问题,Adrian Colyer 的主题演讲非常棒。我找不到 SpringIO 特定的标签,但你可以向下滚动轻松地从其他视频中识别它们。敬请期待,很快就会发布更多内容。
  2.  <LI> Tobias Fiohre (who  seemingly lives  <EM>only</Em> to please us, the lucky developers in the  Spring community!)  has put up…

本周 Spring 焦点 - 2012年3月27日

工程 | Josh Long | 2012年3月28日 | ...

欢迎来到又一期的《本周 Spring 焦点》。像往常一样,我们有很多内容要分享。在发布这篇文章时,Cloud Foundry Open Tour 正在北京进行中,并很快就会来到你附近的城市。这次活动是一个非常独特的机会,可以向专家学习更多关于 Cloud Foundry 和 Spring 的知识——不要错过,立即注册。

  1. Spring Web 大师 Rossen Stoyanchev 宣布Spring Web Flow 2.3.1 已发布。这是一个维护版本,包含升级到 Spring 3.1.1 和 JavaServer Faces 2.1.7,以及一系列错误修复。
  2. SpringSource Tool Suite 负责人 Martin Lippert 宣布发布 Cloud Foundry Integration for Eclipse 1.0。此版本为所有 Eclipse 发行版,包括 SpringSource Tool Suite,带来了完整且一致的 Cloud Foundry 集成。
  3. Martin 宣布发布了 SpringSource Tool Suite 2.9.1 版本,包含新功能和错误修复。
  4. <LI>    <a href = "http://www.springone2gx.com/conference/speaker/mark_fisher">Mark Fisher</A> and <a href = "http://www.springone2gx.com/conference/speaker/thomas_risberg">Thomas Risberg</A>'s epic talk from <a href = "http://www.springone2gx.com">SpringOne 2GX 2011</A>  - <EM><A href = "http://www.infoq.com/presentations/Architecture-Choices-for-Scalable-Cloud-Apps">Architecture Choices for Scalable Cloud Apps</A></EM> -  that introduces how to build scalable architectures in the cloud using technologies like Spring Integration and Cloud Foundry is now up on InfoQ. 
    	  </LI>
    	
    
  5. Maciej Walkowiak 写了一篇博客,介绍了如何结合一些自定义的 Tomcat 配置来使用Spring 3.1 profiles,以在不改变部署二进制文件的情况下激活 Spring profile
  6. Michal Jastak 写了一篇很棒的文章,介绍了如何使用Spring MVC 3.1 对flash attributes的支持
  7. Tobias Flohre 又来发文了,这次是关于Spring Batch的两篇文章。第一篇介绍了Spring Batch 中的事务基础,第二篇介绍了一些重启基于游标的读取器和写入器的细微之处
     </LI> 
    
  8. Artur Mkrtchyan 写了一篇很棒的文章,介绍了如何安装Redis(一个快速、高度优化的数据结构服务器),以及如何使用Spring Data Redis(Spring Data 伞形项目的一部分,便于访问各种所谓的 NoSQL 和大数据存储)来构建与 Redis 交互的 Spring 应用程序

订阅 Spring 资讯

通过 Spring 资讯保持联系

订阅

领先一步

VMware 提供培训和认证,助你加速进步。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部