spring多个定时器的写法

本文介绍了一种简单的Spring定时任务配置方法,通过创建applicationtimer.xml文件并定义定时任务,结合Cron表达式设置执行周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sprng定时器我们java开发过程中经常使用,本篇文章给大家推荐的是我自己经常使用的一种,配置简单,书写方便。

废话不多说,直接看步骤:

        1、我们首先新建一个applicationtimer.xml用来配置所有的定时器。

        2、在applicationContext.xml里面引用这个我们的定时器配置文件:

        3、书写写正常的执行方法就OK了

以下为具体实现:

        1、新建一个applicationtimer.xml用来配置所有的定时器。

              代码内容与注释如下:

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
    default-autowire="byName" default-lazy-init="true">

   //第一个定时器

   <bean id="testobject" class="com.web.admin.SynData"></bean>//类名
    <bean id="synData"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="testobject" />
        </property>
      
        <property name="targetMethod">
            <value>synMethed</value>//类下的具体方法
        </property>
    </bean>
  
    <bean id="cronUpdateStu" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="synData" />//指向上面的bean
        </property>
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>//时间设定(网上随便找就有具体的设定方法)
        </property>
    </bean>

    //第二个定时器


    <bean id="ranking" class="com.web.admin.TimerController"></bean>//类名

    <bean id="saverank"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="ranking" />
        </property>
      
        <property name="targetMethod">
            <value>savefeedback</value>//类下的具体方法

        </property>
    </bean>
  
    <bean id="savefeedback" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="saverank" />//指向上面的bean

        </property>
        <property name="cronExpression">
            <value>1 0 0 1 * ?</value>
        </property>
    </bean>

    <!-- TaskScheduler 管理哪些定时器生效-->
    <bean id="schedulerFactory" lazy-init="false" autowire="no"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- <property name="triggers" ref="cronUpdateStu"/> -->
        <property name="triggers">
            <list>
             <ref local="cronUpdateStu" />//指向定时器的id(标蓝色)
                <ref local="savefeedback" />//指向定时器的id(标蓝色)

            </list>
        </property>
    </bean>
</beans>

2、在applicationContext.xml里面引用这个我们的定时器配置文件:

       在里面加上下面这句引用

       <import resource="classpath:/applicationtimer.xml" />

3、书写写正常的执行方法就OK了
    public class SynData {

      public void synData() {
         System.out.println("222");
      }

  }

总体而言定时器主要就是一个配置,配置好了之后按照正常的web开发流程写就OK了,希望解决一些小伙伴的问题

### 关于定时器、时间轮算法以及时间调度 在分布式系统和服务端开发中,`Timer` 和 `Timing Wheel` 是两种常见的用于实现延迟任务和周期性任务的技术方案。 #### Timing Wheel 定时轮算法 一种高效的定时器管理机制是基于 **Timing Wheel** 的设计模式。这种数据结构通过分层的时间槽来存储即将到期的任务[^2]。其核心思想在于减少内存占用的同时提高性能效率。具体来说: - 时间被划分为多个固定长度的区间(称为桶或槽),每个槽代表一定时间段内的超时事件集合。 - 当前指针会随着时间推移不断移动至下一个槽位并触发其中所有的过期任务执行。 以下是简单的伪代码表示如何向 Timing Wheel 中添加一个新的超时对象: ```java public void addTimeout(HashedWheelTimeout timeout) { long deadline = System.nanoTime() + timeout.getDelayNanos(); int tickPosition = calculateTickPosition(deadline); // 将该timeout放置到对应tick位置上的链表节点里去 HashedWheelBucket bucket = buckets[tickPosition]; synchronized (bucket) { bucket.add(timeout); } } ``` 此方法利用哈希函数计算得出目标超时期望所在的环形数组索引值,并把新创建出来的 Timeout 实例挂载上去形成单项链表形式保存起来等待稍后的处理过程调用它们完成实际业务逻辑操作[^1]。 对于大规模并发场景下的连接维护需求而言,传统的一对一映射方式显然无法满足资源约束条件的要求——即不可能针对每一个单独存在的网络链接都分配独立运行实例级别的计时组件因为这样会造成极大的开销成本增加而变得不可接受范围之内。 因此,在嵌入式领域或者高性能服务器架构下,则可以考虑采用专门为此类问题量身定制过的解决方案比如由文献资料所提到的那个指示灯控制与虚拟定时库框架就提供了很好的示范作用它不仅包含了基础的核心功能模块而且还详细阐述了整个系统的组成原理及其相互之间的作用关系图解说明文档等内容可供参考学习借鉴之处颇多值得深入研究探讨一番[^3]。 另外值得注意的是如果是在 Spring 应用程序环境中涉及到异步线程池配置方面的工作的话那么就需要记得按照官方给出的标准格式正确声明所需的命名空间定义语句这样才能确保项目能够顺利编译部署成功运行无误如下所示例子片段展示了具体的写法样式供使用者模仿套用即可达到目的效果[^4]: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"> </beans> ``` 综上所述可以看出无论是从理论层面还是实践角度出发围绕着 timer, timing wheel 以及 scheduling 这几个关键词展开讨论都能够发现很多有价值的知识点和技术细节值得大家共同交流分享经验心得互相促进成长进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值