Spring Mobile 1.0.0 发布

发布 | Roy Clarkson | May 14, 2012 | ...

亲爱的 Spring 社区成员们,

我们很高兴地宣布 Spring Mobile 1.0 正式发布!

Spring Mobile 为 Spring MVC 提供了扩展,有助于开发跨平台的移动 Web 应用程序。

此 GA 版本包含自 RC2 版本以来的细微修复和更改。更多信息请参阅更新日志参考手册

要获取软件,请下载发布版本分发包,或将Maven Artifacts添加到您的项目。示例应用程序可在 github.com/SpringSource/spring-mobile-samples 获取。

我们感谢 Scott Rossillo、Tristan Burch、Craig Walls 和 Keith Donald 对此 GA 版本的贡献,我们期待与他们以及 Spring 社区的其他成员一起致力于未来的版本。如果您正在构建移动 Web 应用程序,我们鼓励您试用 Spring Mobile 1.0 并就项目的下一次迭代与我们合作

视频:关于 Spring Integration 的更多实用技巧与窍门

新闻 | Adam Fitzgerald | May 11, 2012 | ...

本视频是 Oleg Zhurakousky 成功的Spring Integration 技巧与窍门网络研讨会的后续会议,探讨了更深入、更复杂的集成模式。本次会议的问题来自于实际的客户互动以及在 Spring Integration 论坛中最常被问到的问题。在这一期的“实用技巧与窍门”中,Oleg 涵盖了企业集成的高级主题,例如高级聚合和重新排序、异步消息流、消息 ID 定制、内容丰富和高级消息路由等。本视频基于 Oleg 在 SpringOne 2GX 2011 大会上非常成功的演讲的精炼版本。

要回顾消息传递和 Spring Integration 的基础知识,请观看 Mark Fisher 的消息驱动架构视频,并观看此系列的前一个视频:Spring Integration 技巧与窍门

如果您觉得此演示有用,请务必点赞,并订阅 SpringSourceDev 频道以观看其他录音和屏幕录像。

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

工程 | Rossen Stoyanchev | May 10, 2012 | ...

最后更新于 November 5th, 2012 (Spring MVC 3.2 RC1)

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

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

一个核心思想是,您对控制器方法工作原理的现有了解尽可能保持不变,只是剩余的处理将在另一个线程中进行。在异步执行方面,保持简单很重要。正如您将看到的,即使是这种看似简单的编程模型改变,也有相当多需要考虑的地方。

Spring MVC 3.2 已更新 spring-mvc-showcase。请查看 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…

在 Spring 中使用 Cloud Foundry Worker

工程 | Josh Long | May 09, 2012 | ...

您无疑已经阅读了 Jennifer Hickey 的精彩博客文章,介绍 Cloud Foundry workers,它们在设置 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 服务交互,而该 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 | May 08, 2012 | ...

最后更新于 November 5th, 2012 (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 socket 在两个方向上发送数据帧。

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

WebSockets 围绕着文本或二进制消息的双向交换。这与 RESTful、基于 HTTP 的架构相比,导致了显著不同的方法。事实上,需要在 WebSockets 之上运行一些其他协议,例如 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 调用”。至于 WebSockets,Spring 3.2 尚未支持,但很可能会包含在 Spring 3.3 中。您可以关注 SPR-9356 获取进展更新。

下一篇帖子将转向示例代码,并更详细地解释新的 Spring MVC 3.2 功能。

Spring MVC 3.2 预览:引入 Servlet 3 异步支持

工程 | Rossen Stoyanchev | May 07, 2012 | ...

最后更新于 November 5th, 2012 (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 Data MongoDB 1.1.0 M1 发布

发布 | Oliver Drotbohm | May 07, 2012 | ...

我很高兴宣布 Spring Data MongoDB 1.1.0 M1 版本可用。这是 1.1.0 分支的第一个里程碑版本,带来了一些新功能

下载 | JavaDocs | 参考文档 | 更新日志

该版本可从我们的 Maven 仓库获取。要了解有关该项目的更多信息,请访问 Spring Data MongoDB 页面。期待您在论坛问题跟踪器中提供反馈。

Spring Data Neo4j 2.1.0 发布候选版 1 发布

发布 | Michael Hunger | May 07, 2012 | ...

亲爱的 Spring-NOSQL 社区成员们,

Spring Data - Neo4j 的新版本候选版 1 带来了一些期待已久的改进和新增功能。

首先,SDN 已更新到 Neo4j 1.7.GA,该版本包括操作改进和 Cypher 图查询语言的新语法。为了补充新增的语言特性,此版本的 SDN 集成了一个新版本的 cypher-dsl,并提供了改进的 API。

应广泛要求,现在不仅支持唯一节点实体,还支持关系。这可以通过远程 REST 服务器或嵌入式 Neo4j 数据库实现……

SpringSource Tool Suite 3.0.0.M1 发布

发布 | Martin Lippert | May 03, 2012 | ...

亲爱的 Spring 社区成员们,

我很高兴地宣布 SpringSource Tool Suite (STS) 的第一个里程碑版本 3.0.0.M1 发布。

此里程碑版本的亮点包括

  • 该分发版本现在基于 Eclipse Juno M6 (4.2M6) 包。
  • 更新到 tc Server 2.6.5
  • 围绕 Spring 相关的内容辅助和代码模板的一些改进
  • Groovy 2.0 支持
  • Grails 2.0.3 支持
  • AspectJ/AJDT 的 Java7 支持

由于定于六月份发布的 Eclipse Juno 版本将基于新的 Eclipse 4.2 平台(而不是 3.x 开发流),我们决定基于最新的 Juno 里程碑构建来发布此 STS 里程碑构建版本,而不是基于最新的 Indigo SR2 版本。我们预计在最终 Eclipse 版本于六月份发布之前,Eclipse 平台会有很多修复,因此使用此 STS M1 构建版本可能遇到的一些小问题将会得到修复……

Spring 本周回顾,May 1, 2012

工程 | Josh Long | May 01, 2012 | ...

欢迎阅读新一期的Spring 本周回顾!我正在 Adrian ColyerSpringOne On The Road - 伦敦 活动上精彩的主题演讲期间,在房间后面写作。

  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 邮件列表

订阅 Spring 邮件列表,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速前进。

了解更多

获取支持

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

了解更多

即将到来的活动

查看 Spring 社区所有即将到来的活动。

查看全部