我项目使用定时器后 突然发现 同一时刻同一个方法被执行2次,日志显示都是同一个线程在执行。不知道什么原因,弄了很久 才发现原来是Tomcat中配置问题:
  问题描述:
    要求项目不加项目名称就能访问到,因此要在Tomcat的server.xml中写上
    <Context path="" docBase="gy_Quertz" debug="0" reloadable="true"/>、
   gy_Quertz 即项目名称。这样项目就不要加项目名称也可以访问了。
   但是问题就在这里 如果加上这句话  Quartz会在同一时刻将我一个方法执行2次。我测试过 不加这句话的话
   就是正常的一次!
   这是什么原因 (希望能明白原理)如果我又想加上那句话又只让 Quartz正常的执行一次!我该怎么解  
      决!?? 谢谢了!
   quartztomcatpath测试

解决方案 »

  1.   

    <Context path="" docBase="D:\aaa"  reloadable="true" debug="0"/>是不是你的项目的加上路径的事呢,试试
      

  2.   

    加上项目名称就不用再输入项目了啊 这样就可以直接访问了:localhost:8080就可以了,因为项目最后部署到服务器上不也是这样的么。
    但是 加上这个项目名称后 定时器就会出现如上情况
      

  3.   

    你的Quertz配置在哪里写着呢?如果是在applicationContext.xml里面写的话就会出现执行两次的情况,把配置那块描述一下吧
      

  4.   

    这应该跟你的Quertz配置有关的。
      

  5.   

    执行方法配置在xml文件里面了还是java文件呢,跟这个有关吧
      

  6.   

    没有applicationContext.xml啊 我项目采用的是jsp+servlet+jdbc做的!那个定时的计划是在一个叫quartz_job.xml文件里面定义的规则如下:
    <?xml version="1.0" encoding="UTF-8"?> 
    <quartz>  
      <!-- 定时汇总数量 每天凌晨1点钟半 执行统计 0 30 1 * * ?-->
      <job> 
        <job-detail>  
          <concurrent>false</concurrent>
          <name>statisticsBid</name>  
          <group>statisticsBid</group>
          <job-class>net.gy_center.servlet.StatisticsBidServlet</job-class>
        </job-detail>  
        <trigger>  
          <cron>  
            <name>statisticsBid</name>
            <group>statisticsBid</group>  
            <job-group>statisticsBid</job-group>  
            <job-name>statisticsBid</job-name>  
            <cron-expression>0 30 1 * * ?</cron-expression>  
         </cron>  
        </trigger>  
      </job>
    </quartz>  在web.xml中是这样配置的:
       <!-- Quartz定时调度 star-->
    <servlet>   
       <servlet-name>QuartzInitializer</servlet-name>   
       <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>   
       <init-param>  
         <param-name>shutdown-on-unload</param-name>  
         <param-value>true</param-value>  
       </init-param>  
       <init-param>  
        <param-name>config-file</param-name>  
        <param-value>quartz.properties</param-value>   
       </init-param>  
       <load-on-startup>1</load-on-startup>  
     </servlet> 
    <!-- Quartz定时调度  end-->
    这个web.xml加载的应该是quartz.properties
    quartz.properties文件内容如下:
       org.quartz.scheduler.instanceName = TestScheduler
    org.quartz.scheduler.instanceId = one
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount =  2
    org.quartz.threadPool.threadPriority = 4
    org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
    org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
    org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}
    org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
    org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
    org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
    org.quartz.plugin.jobInitializer.failOnFileNotFound = true
    org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
    org.quartz.plugin.shutdownhook.cleanShutdown =trueorg.quartz.plugin.jobInitializer.fileName = quartz_job.xml这一句就是我的xml文件。
      

  7.   

    jsp+servlet+jdbc
    用监听器不行吗?ServletContextListener
    项目启动就开始定时器
    何来的配置文件
      

  8.   

    监听器能达到 像quartz 那样强大时间自定嘛?就是cron表达式的功效
      

  9.   

    我没有仔细看你的内容,不过执行两次任务的事儿我倒是遇到过,当初查了一些资料,发现是因为TOMCAT会启动项目两次,具体为什么是两次我忘了,我把项目移出WEBAPPS文件夹就没事了。要不你试试??
      

  10.   

    是不是跟你的job-class是个servlet有关系?
      

  11.   

    好吧 在倒数二楼的提示下 终于是找到问题了!
    Tomcat里面我配置了项目名称  是Tomcat加载了2次项目