我写了一个Spring定时任务,在执行时,它却跑了两遍,网上的方法也试过了不行,在这里希望有大神指路,跪谢!
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- ______________________________调度配置开始______________________________ -->
<!-- 配置调度类 -->
<bean id="reportSchedule" class="com.ly.filter.ReportSchedule"></bean>
<!-- 配置MethodInvokingJobDetailFactoryBean -->
<bean id="jobtask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="reportSchedule"></property>
<!-- <property name="targetMethod" value="qdwy_loginReport"></property>-->
<property name="targetMethod" value="qdwy_hyloginReport"></property>
</bean>
<!-- 配置定时表达式 -->
<bean id="doTime2" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobtask2"></property>
<property name="cronExpression" value="0 0 15 * * ? *"></property>
</bean>
<!-- 配置调度工厂:如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime2"/>
</list>
</property>
</bean>
<!-- 调度配置结束 -->
</beans>
调度类
package com.ly.filter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.inject.Inject;
import org.joda.time.DateTime;
import com.ly.entity.background.Group;
import com.ly.entity.background.LoginTempReport;
import com.ly.mapper.LoginMonthReportMapper;
public class ReportSchedule {
@Inject
private LoginMonthReportMapper loginMonthReportMapper;
public void qdwy_loginReport(){
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":调度开始");
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":调度结束");
}
public void qdwy_hyloginReport(){
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":调度开始");
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":调度结束");
}
}
执行一次就关掉啊
它是在一次定时内跑了两次,如何关闭?
代码和配置贴出来
配置贴出来了,帮看看有没有没写的?谢谢啦
@举林会天下:
我也没从配置找到问题, 但是 我注意到配置中一开始有两个 targetMethod ,后来注释掉了一个,
<!-- <property name="targetMethod" value="qdwy_loginReport"></property>-->
<property name="targetMethod" value="qdwy_hyloginReport"></property>
是否配置没有重新部署而未生效,
你重新部署一下,再修改方法中的输出区分一下方法,再看看输出是什么样的:
public void qdwy_loginReport(){
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":qdwy_loginReport调度开始");
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":qdwy_loginReport调度结束");
}
public void qdwy_hyloginReport(){
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":qdwy_hyloginReport调度开始");
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+":qdwy_hyloginReport调度结束");
}
@苍枫露雨:一开始配置中的两个方法放一块,有报错,之后 我把配置中的两个方法分开写,但结果还是执行了两遍。。。。,还有什么其他的思路吗?
@举林会天下:
刚刚看了下,一个 MethodInvokingJobDetailFactoryBean 中只能配置一个方法。
你修改输出了吗?改了输出的结果是什么?
@苍枫露雨: 输出的结果:一个方法结束后输出‘’调度结束’两次
@举林会天下:
再问两个问题:
1. web.xml是怎么配置的?
2. 现象是定时任务第一次执行两次,还是一直都是执行两次? 把执行的线程名称打印出来Thread.currentThread().getName()
@举林会天下:
感觉像是bean加载了两次,
@苍枫露雨: 它如何加载了两次呢?又是在哪里加载了两次呢?是配置文件吗,可是我只在Spring中注入了一遍啊
@举林会天下:
看下你web.xml的配置
@苍枫露雨: web.xml需要配置什么,我没有在web.xml中配置啊,要不你贴一下web.xml的代码
@举林会天下:
web.xml没有配置,怎么去找到spring的配置文件去扫描bean呢,
你看看web.xml中有没有类似下面的代码
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> </context-param>
还有之前的说的打印线程名称的结果怎么样?
@举林会天下:
或者你把代码发到github或者oschine git上,我给你看看,