【Spring】The Task namespace

来源:互联网 发布:淘宝卖的减肥药可靠吗 编辑:程序博客网 时间:2024/05/15 17:22

    从Spring 3.0开始,有一个用于配置TaskExecutor和TaskScheduler实例的XML命名空间。 它还提供了一种方便的方式来配置使用触发器进行调度的任务。

    1. “scheduler” 元素

        以下元素将创建一个具有指定线程池大小的ThreadPoolTaskScheduler实例。

<task:scheduler id="scheduler" pool-size="10"/>

        池中线程名称的前缀为“id”属性提供的值。 ‘scheduler’元素比较简单。 如果不提供“pool-size”属性,默认线程池只有一个线程。 调度程序没有其他配置选项。

    2. “executor” 元素

        以下将创建一个ThreadPoolTaskExecutor实例:

<task:executor id="executor" pool-size="10"/>

        与上面的调度程序一样,池内线程名称的前缀为’id’属性提供的值。 就池大小而言,’executor’元素支持比’scheduler’元素更多的配置选项。 首先,ThreadPoolTaskExecutor的线程池本身可以更加配置。 执行者的线程池并不只是单个大小,而是可能具有不同的核心和最大大小的值。 如果提供了一个值,则执行器将具有固定大小的线程池(核心和最大大小相同)。 但是,“执行者”元素的“pool-size”属性也接受“min-max”形式的范围。

<task:executor        id="executorWithPoolSizeRange"        pool-size="5-25"        queue-capacity="100"/>

        从该配置可以看出,还提供了一个“队列容量”值。 还应根据执行者的队列容量来考虑线程池的配置。 主要的想法是,当一个任务被提交时,执行者将首先尝试使用一个空闲的线程,如果活动线程的数目当前小于核心大小。 如果达到核心大小,则只要其容量尚未达到,任务将被添加到队列中。 只有这样,如果已经达到了队列的容量,执行器将会创建一个超出核心大小的新线程。 如果达到最大大小,那么执行者将拒绝该任务。

        默认情况下,队列是无限制的,但是这很少是所需的配置,因为如果在所有池线程正忙时将足够的任务添加到队列中,可能会导致OutOfMemoryErrors。 此外,如果队列是无限制的,那么最大大小根本不起作用。 由于执行程序将始终在创建超出核心大小的新线程之前尝试队列,所以队列必须具有有限的容量,线程池可以超出核心大小(这就是为什么使用固定大小的池是唯一合理的情况,当使用 一个无界队列)。

        稍后,我们将审查保持活动设置的效果,这又增加了提供池大小配置时要考虑的另一个因素。首先,如上所述,让我们考虑一个任务被拒绝的情况。默认情况下,当任务被拒绝时,线程池执行程序将抛出一个TaskRejectedException异常。但是,拒绝政策实际上是可配置的。使用作为AbortPolicy实现的默认拒绝策略时抛出异常。对于在重负载下可以跳过某些任务的应用程序,可以配置DiscardPolicy或DiscardOldestPolicy。 CallerRunsPolicy的另一个选项适用于需要在负载较重的情况下节省提交的任务的应用程序。而不是抛出异常或丢弃任务,该策略将简单地强制正在调用submit方法的线程来运行该任务本身。这个想法是这样的一个调用者在运行该任务时会很忙,而且不能立即提交其他任务。因此,它提供了一种简单的方法来限制传入的负载,同时保持线程池和队列的限制。通常,这允许执行者“赶上”正在处理的任务,从而释放队列,池中或两者的一些容量。任何这些选项都可以从对“执行者”元素上的“reject-policy”属性的可用值的枚举中进行选择。

<task:executor        id="executorWithCallerRunsPolicy"        pool-size="5-25"        queue-capacity="100"        rejection-policy="CALLER_RUNS"/>

        最后,保持活动设置确定在终止之前哪些线程可能保持空闲的时间限制(以秒为单位)。 如果存在超过当前在池中的线程核心数量,则在等待这段时间后,不处理任务,多余的线程将被终止。 时间值为零将导致多余的线程在执行任务后立即终止,而不会在任务队列中保留后续工作。

<task:executor        id="executorWithKeepAlive"        pool-size="5-25"        keep-alive="120"/>

    3. “scheduled-tasks” 元素

        Spring Task的命名空间最强大的功能是支持在Spring应用程序上下文中配置要调度的任务。 这遵循类似于Spring中其他“方法调用者”的方法,例如由用于配置消息驱动的POJO的JMS命名空间提供的方法。 基本上,“ref”属性可以指向任何Spring管理的对象,“method”属性提供要在该对象上调用的方法的名称。 这是一个简单的例子。

<task:scheduled-tasks scheduler="myScheduler">    <task:scheduled ref="beanA" method="methodA" fixed-delay="5000"/></task:scheduled-tasks><task:scheduler id="myScheduler" pool-size="10"/>

        可以看到,调度程序由外部元素引用,每个单独的任务都包括其触发元数据的配置。 在上述示例中,该元数据定义了具有固定延迟的周期性触发,指示每个任务执行完成后等待的毫秒数。 另一个选项是“固定速率”,指示该方法应该执行多长时间,而不管以前的执行需要多长时间。 此外,对于固定延迟和固定速率任务,可以指定“初始延迟”参数,指示在方法的第一次执行之前等待的毫秒数。 为了更多的控制,可以提供“cron”属性。 这是一个演示这些其他选项的示例。

<task:scheduled-tasks scheduler="myScheduler">    <task:scheduled ref="beanA" method="methodA" fixed-delay="5000" initial-delay="1000"/>    <task:scheduled ref="beanB" method="methodB" fixed-rate="5000"/>    <task:scheduled ref="beanC" method="methodC" cron="*/5 * * * * MON-FRI"/></task:scheduled-tasks><task:scheduler id="myScheduler" pool-size="10"/>
原创粉丝点击