Spring 散点(2)

任务执行与规划

写 backend jobs 一个常见的概念就是 job、executor 和 scheduler,所谓的 job 往往是 Runnable/Callable 的抽象,而 executor/scheduler 是为了减少程序员直接写 thread 产生的困境,executor 往往是类似一个 thread-pool 的东西,scheduler 就是将 job 扔到 executor 上的东西。Java 的开发包里面已经提供了这两者的实现,spring 将使用它们的过程变得格外的简单。

spring 提供了以下 executor(实现的是 JDK 的 interface,使用 execute 方法执行):

  • SimpleAsyncExecutor 并不重用 thread 的 executor,来一个 job 创建一个线程运行
  • SyncTaskExecutor 并不使用多线程,而用单线程依次执行
  • ConcurrentTaskExecutor 本质上是 JDK5 的 executor 的 wrapper
  • SimpleThreadPoolExecutor 本质是 Quartz 的 executor 的 wrapper
  • ThreadPoolExecutor 是 JDK5 的 ThreadPoolExecutor 的 wrapper
  • TimerTaskExecutor 类似 SyncTaskExecutor 但是在多个线程里面同步调用的
  • WorkManagerTaskExecutor 是 CommonJ WorkManager 的 wrapper

提供的 scheduler(实现 TaskScheduler 接口)可以

  • 根据一个 Trigger 来执行 Runnable
  • 指定时间执行 Runnable
  • 指定周期执行 Runnable

为了简化使用这两个东西,spring 提供了 task namespace 下面的一些 tag,如 task:executor 可以定义 executor,task:scheduler 可以定义 scheduler,如果需要 schedule task 只需要使用 task:scheduled-tasks,指定对应的 scheduler 等信息,然后就可以插入 task:scheduled 子节点,每个子节点可以声明对象和方法(即不需要实现任何 interface 而是将那部分抽象也简化了),以及执行这个 task 的周期等属性。这样 XML 里面只有 task、scheduler 以及每个 task 的 bean。

同样,spring 也提供了通过 annotation 来处理这些 task 的能力。

脚本语言支持

通过 lang:language 可以让 spring 使用其他脚本语言定义的 bean,同时可以动态的读入更新(即如果这些文件发生了修改,spring 会重新解析),支持的语言有 JRuby、groovy、beanshell。更进一步,可以在 lang:inline-script 里面执行内嵌在 XML 里的脚本语言。似乎到 spring 3.2 也有 project 引入 spring 对 scala 的支持。

——————
Fulfil her week, and we will give thee this also for the service which thou shalt serve with me yet seven other years.

Advertisements
Spring 散点(2)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s