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.

Spring 散点(2)