Spring3 Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)

本文详细介绍了Spring3中的task命名空间,如何部分取代quartz功能,配置和API更加简单,并提供了使用注解的方式进行任务调度的示例。同时,针对任务在指定时间后总是执行两次的问题,提出了通过将Task配置独立出来并在web.xml中通过context-param加载的解决方案。

在spring3 中的新引入的task 命名空间。可以部分取代 quartz 功能,配置和API更加简单,并且支持注解方式。但是如果需要使用比较复杂的任务调度。还是建议使用quartz。

 

 

第一步:

        在Spring的相关配置文件中(applicationContext.xml或者是{project_name}_servelt.xml或者是独立的配置文件如XXX_quartz.xml)中配置并开启Spring Schedule Task.注意其中高亮的部分是必须的。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task-3.0.xsd
       ">
    <mvc:annotation-driven />

    <context:component-scan base-package="com.mytools.validator.engine" />
   
    <!-- 启动定时器 -->
    <task:annotation-driven/>    
</beans>

 

第二步:

        可以在类中的需要定时执行的方法下指定如下Annotation

 @Scheduled(cron="0 33/3 * * * ?") //每小时的33分钟开始执行,每3分钟执行1次
    public void start() throws ServletException {
                 validate();
}

备注:其实@Scheduled中可以指定如下3中时间表达式:

(1)fixedRate:每隔多少毫秒执行一次该方法。如:


          @Scheduled(fixedRate=2000)  // 每隔2秒执行一次
          public void scheduleMethod(){  
                    System.out.println("Hello world...");  
          }  
     (2)fixedDelay:当一次方法执行完毕之后,延迟多少毫秒再执行该方法。

 

  (3)cron:详细配置了该方法在什么时候执行。cron值是一个cron表达式。如:


                @Scheduled(cron="0 0 0 * * SAT")  
                public voidarchiveOldSpittles() {  
                 // ...  
                }

 

 

到指定时间后,任务总是执行2次的解决方案:

这是因为我们很容易在一个基于Spring的Web工程中启动2个定时线程:

第一次:web容器启动的时候,读取applicationContext.xml(或者别的Spring核心配置文件)文件时,会加载一次。


第二次:Spring本身会加载applicationContext.xml(或者别的Spring核心配置文件)一次。

 

解决方案:将你的Task的相关配置独立出来并在web.xml中通过context-param加载。而不是通过spring加载。

1) 独立出Spring-Task,如新命名一个文件名叫cms_quartz.xml

2)    在web.xml中去加载该文件:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/cms-servlet.xml,classpath:cms-quartz.xml</param-value>
    </context-param>

 

 

 

 

 

<think>好的,用户现在想用Mermaid来画AutoSar中CPU调度的Runnable任务从硬件到软件周期的运行过程。之前用户的问题是关于BootLoader启动流程的时序图,现在需要转向AutoSar的CPU调度,特别是Runnable任务。首先,我需要理解AutoSar的基本架构,特别是Runnable任务在其中的角色。AutoSar中的Runnable任务属于SWC(SoftwareComponent),由RTE管理,被OS调度执行。用户需要从硬件电路开始,展示到软件周期的整个过程。这可能涉及到硬件中断触发、OS调度器、RTE事件触发、Runnable执行等步骤。接下来,我得考虑如何用Mermaid的时序图来表现这个过程。硬件层可能包括中断控制器、定时器等;软件层包括OS、RTE、SWC。需要展示中断触发调度器,调度器激活Runnable,任务执行后再回到等待状态,形成周期。 用户之前的BootLoader时序图有分层结构,使用box区分硬件和软件,用箭头表示信号传递。这里可以沿用类似的结构,但需要调整参与者和流程。可能的关键阶段包括硬件定时器中断、OS调度决策、RTE事件触发、Runnable执行、资源释放等。需要注意AutoSar的术语准确,比如OS的调度策略、Runnable的触发事件(如TimingEvent)。还要考虑时间参数,如调度周期$T_{cycle}$,执行时间$t_{exec}$,可能用note标注。用户可能还想展示错误处理或资源争用的情况,比如锁机制。另外,多核调度的话可以用并行块,但用户的问题暂时是单核,可以放在相关问题里。 需要检查是否符合之前的格式要求:行内公式用$,独立公式用$$,正确的中文回答,生成相关问题。引用标识可能需要添加,比如关于调度策略或时间参数的地方。 最后,验证时序图是否清晰展示周期性,硬件到软件的交互,以及AutoSar各模块的协作。可能的问题包括如何表示周期循环、事件触发机制、资源管理,这些可以作为相关问题列出。</think>### AutoSar CPU调度Runnable任务的硬件到软件周期时序图 #### 时序图设计要点 1. **分层架构** ```mermaid box rgb(220,220,220) 硬件层 participant 定时器 participant 中断控制器 participant ECU电源 end box rgb(200,240,200) 软件层 participant OS调度器 participant RTE participant Runnable任务 participant 资源锁 end ``` 2. **周期调度公式** 设任务周期为$T_{cycle}$,执行时间为$t_{exec}$,需满足: $$t_{exec} \leq T_{cycle} - t_{overhead}$$ 其中$t_{overhead}$包含上下文切换时间[^1] #### 完整时序图示例 ```mermaid sequenceDiagram box rgb(220,220,220) 硬件层 participant 定时器 participant 中断控制器 participant ECU电源 end box rgb(200,240,200) 软件层 participant OS调度器 participant RTE participant Runnable任务 participant 资源锁 end %% 硬件触发阶段 ECU电源->>定时器: 供电启动 定时器->>中断控制器: 周期中断信号@T=10ms 中断控制器->>OS调度器: IRQn_TimeTick %% 操作系统响应 activate OS调度器 OS调度器->>OS调度器: 更新tick计数$$n_{tick}=n_{tick}+1$$ OS调度器->>RTE: 触发TimingEvent deactivate OS调度器 %% RTE事件处理 activate RTE RTE->>资源锁: 请求互斥锁(Mutex) alt 锁可用 资源锁-->>RTE: 授予锁 RTE->>Runnable任务: 激活Runnable实体 else 锁被占用 RTE-->>OS调度器: 报告优先级反转 end deactivate RTE %% 任务执行阶段 activate Runnable任务 Runnable任务->>Runnable任务: 执行算法逻辑 note right: 执行时间$$t_{exec}=2.5ms$$ Runnable任务->>资源锁: 释放互斥锁 Runnable任务-->>OS调度器: 返回任务状态码 deactivate Runnable任务 %% 周期循环 loop 每10ms周期 定时器->>中断控制器: 新周期触发 end ``` #### 关键语法解析 1. **中断信号标注** ```mermaid 定时器->>中断控制器: 周期中断信号@T=10ms ``` 2. **资源争用表示** ```mermaid alt 锁可用 资源锁-->>RTE: 授予锁 else 锁被占用 RTE-->>OS调度器: 报告优先级反转 end ``` 3. **时间约束公式** ```mermaid note right: 执行时间$$t_{exec}=2.5ms$$ ``` 4. **多核调度扩展** ```mermaid par 核0任务 OS调度器->>Runnable任务_0: 激活 and 核1任务 OS调度器->>Runnable任务_1: 激活 end ``` #### 优化技巧 1. **优先级继承协议** ```mermaid rect rgb(255,240,240) OS调度器->>资源锁: 提升持有者优先级 note left: 防止优先级反转 end ``` 2. **任务监控机制** ```mermaid Runnable任务->>OS调度器: 发送 Alive信号@Δt=1ms OS调度器->>看门狗: 确认任务存活 ``` 3. **负载均衡表示** ```mermaid loop 每100ms OS调度器->>OS调度器: 计算CPU利用率$$U=\sum (t_{exec}/T_{cycle})$$ end ``` --- ### 相关问题 1. 如何表示多核处理器的负载均衡策略? 2. 时间触发(TT)与事件触发(ET)调度有何时序差异? 3. 怎样可视化任务超时(Timeout)的处理流程? 4. 如何添加任务(Task Chain)的时序依赖关系? 5. 怎样表示OSEK直接优先级与AutoSar扩展优先级的区别? --- ### 高级应用示例(时间保护机制) ```mermaid sequenceDiagram participant 定时器 participant OS调度器 participant Runnable任务 定时器->>OS调度器: 周期中断 activate OS调度器 OS调度器->>Runnable任务: 激活 activate Runnable任务 OS调度器->>OS调度器: 启动执行时间监控$$t_{max}=3ms$$ alt t_exec <= t_max Runnable任务-->>OS调度器: 正常完成 else OS调度器->>Runnable任务: 强制终止 OS调度器->>错误日志: 记录ECUC_时间违例 end deactivate OS调度器 deactivate Runnable任务 ``` --- ### 验证建议 1. 使用时间轴插件验证时序约束: $$ \sum_{i=1}^n \frac{C_i}{T_i} \leq U_{lub} $$ 其中$U_{lub}$为最小上界利用率[^2] 2. 通过Worst Case Execution Time(WCET)分析标注关键路径: ```mermaid note over Runnable任务: WCET=3.8ms @ -40°C ``` 3. 使用Mermaid的loop语法验证周期稳定性: ```mermaid loop 100个周期 OS调度器->>Runnable任务: 激活 end ``` [^1]: AutoSar OS规范4.3.1节上下文切换时间要求 [^2]: 基于Rate Monotonic调度理论的最小上界利用率公式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值