Tomcat下的定时任务

本文介绍如何利用Servlet侦听器与Java定时器实现周期性任务执行。通过实现ServletContextListener接口,并重写contextInitialized与contextDestroyed方法,可以在应用启动和关闭时分别启动和停止定时任务。此外,还展示了如何通过继承TimerTask类并覆盖run方法来自定义定时任务。

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

package axtic.servlet;  
 // 下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现 javax.servlet.ServletContextListener接口,同时实现它的 contextInitialized(ServletContextEvent event)和 contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个 接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。  
  
import java.util.Timer;//定时器类  
import axtic.bean.exportHistoryBean;  
import javax.servlet.ServletContextEvent;  
import javax.servlet.ServletContextListener;  
public class SysContextListener implements ServletContextListener  
{  
  private Timer timer = null;  
  public void contextInitialized(ServletContextEvent event)  
  {//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能  
      timer = new Timer(true);  
      event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到  
      timer.schedule(new exportHistoryBean(event.getServletContext()),0,5*1000);//调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时。  
      event.getServletContext().log("已经添加任务");  
  }  
  public void contextDestroyed(ServletContextEvent event)  
  {//在这里关闭监听器,所以在这里销毁定时器。  
      timer.cancel();  
      event.getServletContext().log("定时器销毁");  
  }  
}  
接下来可以编写自己的功能类,此类一定要extends定时器类中TimerTask .下面介绍TimerTask的实现,上面的代码中看到了在构造Timer Task时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载Timer Task的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小 时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR 表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置 了当前是否正在执行的状态标志isRunning。示例代码如下所示:
Java代码  收藏代码
package axtic.bean;  
  
import java.util.Calendar;  
import java.util.TimerTask;  
import javax.servlet.ServletContext;  
public class exportHistoryBean extends TimerTask  
{  
  private static final int C_SCHEDULE_HOUR = 0;  
  private static boolean isRunning = false;  
  private ServletContext context = null;   
  public exportHistoryBean(ServletContext context)  
  {  
      this.context = context;   
  }  
  
  public void run()  
  {  
    Calendar c = Calendar.getInstance();  
    if(!isRunning)  
    {  
      if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY))  
      {  
        isRunning = true;  
        context.log("开始执行指定任务");  
        //-------------------开始保存当日历史记录  
         
         
         
        //在这里编写自己的功能,例:  
        //File file = new File("temp");  
        //file.mkdir();  
        //启动tomcat,可以发现在tomcat根目录下,会自动创建temp文件夹  
  
        //-------------------结束  
        isRunning = false;  
        context.log("指定任务执行结束");  
      }  
      else  
      {  
        context.log("上一次任务执行还未结束");  
      }  
    }  
  }  
}  
最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中
Xml代码  收藏代码
<web-app>  
  
<listener>  
         <listener-class>  
             axtic.servlet.SysContextListener  
          </listener-class>  
</listener>  
  
  
<servlet/>  
<servlet-mapping/>  
</web-app>   
这个J2EE小提示阐述了ServletContextListener的用法。这个事件类作为Web应用程序的一部分,处理Web应用程序的 servlet上下文(context)的变化的通知。这可以解释为,好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因 此,在通知上下文(context)初始化和销毁的时候,ServletContextListner非常有用。



### HRTF算法原理及应用 #### HRTF的基本原理 HRTF(Head Related Transfer Function,头部相关传递函数)是一种用于模拟三维空间声音定位的数字信号处理技术。其核心思想是通过数学模型来描述声音从声源传播到双耳过程中所受到的物理影响,包括头部、耳廓、耳道等结构对声波的反射、折射和衍射效应。 在实际环境中,当一个声音到达人的耳朵时,由于人体结构的影响,不同方向的声音会具有不同的频谱特征。大脑利用这些特征以及时间差和强度差来判断声音的方向。HRTF通过测量或计算特定方向下的这些特征,并将其表示为一对滤波器(分别对应左右耳),从而使得经过HRTF处理的声音能够在立体声耳机上重现原始的空间位置感[^1]。 #### HRTF的数据获取 为了构建准确的HRTF数据集,通常需要进行精确的测量实验。实验中使用人工头模型或者真人受试者,在自由场条件下放置多个扬声器于不同的方位角和仰角,然后记录每个位置处由扬声器发出的测试信号经过人头与耳朵后的响应。随后,将采集到的数据转换成频率域的形式,形成对应的HRTF滤波器组。这种个性化定制的数据能够提供更加真实的听觉体验,但同时也增加了获取成本[^1]。 #### HRTF的应用领域 - **虚拟现实(VR)与增强现实(AR)**:在VR/AR系统中,HRTF被用来创建沉浸式的音频环境,让用户即使闭着眼睛也能感知到周围世界的存在及其变化。 - **游戏开发**:特别是在射击类游戏中,玩家可以通过脚步声、枪击声等音效快速识别敌人的具体方位,提高游戏的真实性和互动性[^2]。 - **远程会议系统**:借助HRTF技术可以实现更自然的多方通话体验,让参与者更容易分辨说话者的身份。 - **助听设备**:对于某些类型的助听器而言,采用适当的HRTF策略可以帮助佩戴者更好地理解来自各个方向的声音信息。 #### HRTF面临的挑战 尽管HRTF提供了强大的空间音频解决方案,但在实际应用过程中仍然存在一些难题: - 个性化问题:每个人的身体构造都有所差异,因此通用型HRTF可能无法达到最佳效果; - 计算复杂度高:实时应用时需要大量的运算资源来执行卷积操作; - 动态跟踪:如果用户头部移动,则必须相应调整应用的HRTF以保持正确的空间感知。 针对上述问题的研究正在不断推进之中,比如通过机器学习方法预测个性化的HRTF参数、优化算法减少计算负担等手段来改善用户体验。 ```python import numpy as np from scipy.signal import convolve def apply_hrtf(audio_signal, hrtf_left, hrtf_right): """ Apply HRTF filters to mono audio signal to create binaural output. :param audio_signal: Mono input signal (numpy array) :param hrtf_left: Left ear HRTF filter coefficients (numpy array) :param hrtf_right: Right ear HRTF filter coefficients (numpy array) :return: Binaural output (numpy array with shape [length, 2]) """ left_channel = convolve(audio_signal, hrtf_left, mode='full') right_channel = convolve(audio_signal, hrtf_right, mode='full') return np.column_stack((left_channel, right_channel)) ``` 该代码示例展示了如何将给定方向的HRTF应用于单声道音频信号以生成双声道输出。这里使用了`scipy.signal.convolve`函数来进行卷积运算,这是实现HRTF效果的关键步骤之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值