先说概括系统:64位windows Server  数据库:db2自己写了一个java程序,里面包括一个spring定时器,然后打成jar文件,顺便写了一个bat文件。
定时器的任务就是:每天7点10分定时查询一个数据库然后将查询的数据导入到另外一个数据库。
很简单吧,现在的问题是这样的:通过观察:
1:重启系统后,点击bat文件(任务管理器会出现 java.exe 进程),定时器会执行,但执行几天后 突然停止,不包报何异常。2:当上面的不执行后,我发现任务管理器不仅有 java.exe 进程 还会有 javaw.exe 进程。然后我将这两个进程都结束掉,从新启动bat文件,等第二天7点10分执行后,第三天又不执行了,又不报任何异常猜想:是不是因为这个javaw.exe 的原因导致spring定时器不执行,
还有什么情况会导致定时器不执行,但进程还在,也就是定时器僵死在那了。顺便贴一下相关代码
************************************************************* applicationContext.xml  *****************************************<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ......>
<description>Spring公共配置 </description> <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
<context:component-scan base-package="com" />

<!-- 定义受环境影响易变的变量 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="false" />
<property name="locations">
<list>

<value>file:/C:/application.properties
</value>
</list>
</property>
</bean>



<bean id="ejobctuhb" class="com.executor.ExportDataCICS_TRAN_USR_HP_B1"></bean>
<bean id="ijobctuhb" class="com.executor.ImportDataCICS_TRAN_USR_HP_B1"></bean>

<bean id="ejobmw2hb" class="com.executor.ExportDataMVSPM_WORKLOAD2_HV_B1"></bean>
<bean id="ijobmw2hb" class="com.executor.ImportDataMVSPM_WORKLOAD2_HV_B1"></bean>

<bean id="ejobooub" class="com.executor.ExportDataOMEG_OMEG_UMBR_B1"></bean>
<bean id="ijobooub" class="com.executor.ImportDataOMEG_OMEG_UMBR_B1"></bean>

数据库配置滤去
</beans>
****************** applicationContext-quartz.xml ************
<bean id="scheduleInfoAction" class="com.scheduler.task.Task">
    <property name="schedulerFactory" ref="schedulerFactoryid"/>
</bean>

<bean id="schedulerJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="scheduleInfoAction" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
</bean>

<bean id="exportImportTrigger"
class="com.scheduler.init.InitializingCronTrigger">
<property name="jobDetail" ref="schedulerJobDetail" />
</bean>

<!-- 执行调度任务 -->
<bean autowire="no"  id="schedulerFactoryid" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
     <!-- 添加执行任务-->
     <ref bean="exportImportTrigger"/>
</list>
</property>
</bean>*************************** Task 代码 ***********************************
@Repository
public class Task { private final Log logger = LogFactory.getLog(getClass());
private Scheduler schedulerFactory;


@Autowired
ExportDataCICS_TRAN_USR_HP_B1 ejobctuhb;
@Autowired
ImportDataCICS_TRAN_USR_HP_B1 ijobctuhb;



@Autowired
ExportDataMVSPM_WORKLOAD2_HV_B1 ejobmw2hb;
@Autowired
ImportDataMVSPM_WORKLOAD2_HV_B1 ijobmw2hb;

@Autowired
ExportDataOMEG_OMEG_UMBR_B1 ejobooub;
@Autowired
ImportDataOMEG_OMEG_UMBR_B1 ijobooub;




private static Scheduler scheduler;
public Scheduler getSchedulerFactory() {
return schedulerFactory;
} public void setSchedulerFactory(Scheduler schedulerFactory) {
this.schedulerFactory = schedulerFactory;
Task.scheduler = schedulerFactory; } public void removeAllScheduler() {
} public void execute() throws SchedulerException, Exception {
startJob();
}

public void startJob() {
try {
Configuration rc = new Configuration(Constant.propertiesPath);

String expression = rc.getValue("scheduled.sec") + " " + rc.getValue("scheduled.min") + " " + rc.getValue("scheduled.hou") + " " + rc.getValue("scheduled.day") + " " + rc.getValue("scheduled.mon") + " " + rc.getValue("scheduled.wee");

JobDetail jobDetail = new JobDetail("jobName" ,
 ExportImportTask.class);



jobDetail.getJobDataMap().put("ejobctuhb", ejobctuhb);
jobDetail.getJobDataMap().put("ijobctuhb", ijobctuhb);

jobDetail.getJobDataMap().put("ejobmw2hb", ejobmw2hb);
jobDetail.getJobDataMap().put("ijobmw2hb", ijobmw2hb);

jobDetail.getJobDataMap().put("ejobooub", ejobooub);
jobDetail.getJobDataMap().put("ijobooub", ijobooub);



CronTrigger cronTrigger = new CronTrigger();
cronTrigger.setName("Test_EI Task");
CronExpression cexp = new CronExpression(expression);
cronTrigger.setCronExpression(cexp);
Task.scheduler.scheduleJob(jobDetail, cronTrigger);
Task.scheduler.start();

} catch (Exception ex) {
}
}
}
************************* ExportImportTask 代码 **********************************@Service
public class ExportImportTask implements  Job{

private final Log logger = LogFactory.getLog(getClass());


@Override
public void execute(JobExecutionContext jobExecutionContext){ Configuration rc = new Configuration(Constant.propertiesPath); try {
String date;
date = DateUtil.getYesterdayDate(null);
logger.info(date+" 数据操作开始....");
if(checkJOBStatus(DateUtil.getTodayDate())) {

ExportDataCICS_TRAN_USR_HP_B1 ejobctuhb = (ExportDataCICS_TRAN_USR_HP_B1)jobExecutionContext
.getJobDetail().getJobDataMap().get("ejobctuhb");

ImportDataCICS_TRAN_USR_HP_B1 ijobctuhb = (ImportDataCICS_TRAN_USR_HP_B1)jobExecutionContext
.getJobDetail().getJobDataMap().get("ijobctuhb");

logger.info("定时导出CICS_TRAN_USR_HP_B1线程任务开始...");
System.out.println("定时导出CICS_TRAN_USR_HP_B1开始.....");
//启动新线程来执行
new Thread(new ThreadWork(ejobctuhb,ijobctuhb,"CICS_TRAN_USR_HP_B1",date)).start();



ExportDataMVSPM_WORKLOAD2_HV_B1 ejobmw2hb = (ExportDataMVSPM_WORKLOAD2_HV_B1)jobExecutionContext
.getJobDetail().getJobDataMap().get("ejobmw2hb");

ImportDataMVSPM_WORKLOAD2_HV_B1 ijobmw2hb = (ImportDataMVSPM_WORKLOAD2_HV_B1)jobExecutionContext
.getJobDetail().getJobDataMap().get("ijobmw2hb");

logger.info("定时导出MVSPM_WORKLOAD2_HV_B1线程任务开始...");
System.out.println("定时导出MVSPM_WORKLOAD2_HV_B1开始.....");

//启动新线程来执行
new Thread(new ThreadWork(ejobmw2hb,ijobmw2hb,"MVSPM_WORKLOAD2_HV_B1",date)).start();


ExportDataOMEG_OMEG_UMBR_B1 ejobooub = (ExportDataOMEG_OMEG_UMBR_B1)jobExecutionContext
.getJobDetail().getJobDataMap().get("ejobooub");

ImportDataOMEG_OMEG_UMBR_B1 ijobooub = (ImportDataOMEG_OMEG_UMBR_B1)jobExecutionContext
.getJobDetail().getJobDataMap().get("ijobooub");

logger.info("定时导出OMEG_OMEG_UMBR_B1线程任务开始...");
System.out.println("定时导出OMEG_OMEG_UMBR_B1开始.....");

//启动新线程来执行
new Thread(new ThreadWork(ejobooub,ijobooub,"OMEG_OMEG_UMBR_B1",date)).start();

} else {


logger.info("****昨日"+date+"数据未完成入库,请检查****");


}



}  catch (Exception e1) {
e1.printStackTrace();
logger.info(e1.getMessage());

}



private boolean checkJOBStatus(String todayDate){
ApplicationContext springContext = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml"});
DataService dataService = (DataService)springContext.getBean("dataService");
return dataService.checkJOBStatus(todayDate);
}


class ThreadWork implements Runnable{
ExportData ed  = null;
ImportData id = null;
String tableName = null;
String date = null;
public ThreadWork(ExportData ed,ImportData id,String tableName,String date){
this.ed = ed;
this.id = id;
this.tableName = tableName;
this.date = date;
}
public void run() {
List list = ed.doJob(tableName,date);
if(list.size() != 0) {
id.doJob(tableName,list);
}
}

}

}
**************************************************  ExportData 代码 **************************************************
public interface ExportData {

public List doJob(String tableName, String date);}doJob主要功能为导入导出 就不再贴其接口实现的代码了
************************************************** InitializingCronTrigger 代码****************************************
@SuppressWarnings("serial")
public class InitializingCronTrigger extends CronTriggerBean implements
Serializable {
/**
 * 构建定时器初始的定时规则
 */ private final Log logger = LogFactory.getLog(getClass());

public InitializingCronTrigger() {
try {

logger.info("初始化定时任务开始时间.");             
//测试时间
setCronExpression("10 * * * * ?");

} catch (ParseException e) {
e.printStackTrace();
}
} /**
 * 
 * @return
 */
@SuppressWarnings("unused")
private String printTime() {
String str2 = "";
String sdf = printNextTime();
String[] result = sdf.split("\\D");
for (int i = 0; i < result.length; i++) {
str2 += result[i];
}
return str2;
}

/**
 * 
 * @return
 */
@SuppressWarnings("static-access")
public String printNextTime() {
Calendar cal = Calendar.getInstance();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
String d = sdf.format(date);
cal.setTime(date);
cal.add(cal.MINUTE, 1);
} catch (Exception e) {
e.printStackTrace();
}
return sdf.format(cal.getTime());
}}main 方法直接
MainClass mc = new MainClass();
mc.logger.info("定时任务开始读取配置文件...");
System.out.println("定时任务开始读取配置文件...");
ApplicationContext springContext = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml","classpath:applicationContext-quartz.xml"});   
mc.logger.info("定时任务读取配置文件完成.");
System.out.println("定时任务读取配置文件完成.");

mc.logger.info("定时任务已经启动,请不要关闭此程序.");
System.out.println("定时任务已经启动,请不要关闭此程序.");麻烦高手帮忙看看。问题若能解决继续加分都可以!spring定时器java定时器

解决方案 »

  1.   

    至于你说的java.exe和javaw .exe这两个是java网络服务的运行线程,只要你的机子上运行着类似于tomcat之类的java网络环境服务,就会有的,原则上不应该影响你的程序。
      

  2.   

    时间没问题的 系统重新启动后 都能运行10来天 然后就突然僵死在那了并且java进程还在的
      

  3.   


    javaw .exe这个是java网络服务的运行线程 但我服务器上没有tomcat 类似的容器
    只有db2  congnos等。 
      

  4.   

    重启机器后 运行了10天又出现问题了 这次把这个CronTrigger cronTrigger = new CronTrigger();
    cronTrigger.setName("Test_EI Task");
    CronExpression cexp = new CronExpression(expression);
    cronTrigger.setCronExpression(cexp);
    Task.scheduler.scheduleJob(jobDetail, cronTrigger);
    Task.scheduler.start();} catch (Exception ex) {
    }catch里面的异常打印了一下报:
    *******************************
    org.quartz.ObjectAlreadyExistsException: Unable to store Job with name: 'jobName' and group: 'DEFAULT', because one alre
    ady exists with this identification.
            at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:221)
            at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:193)
            at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:743)
            at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:243)
            at com.ccb.scheduler.task.Task.startJob(Task.java:157)
            at com.ccb.scheduler.task.Task.execute(Task.java:111)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273)
            at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(Me
    thodInvokingJobDetailFactoryBean.java:264)
            at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
            at org.quartz.core.JobRunShell.run(JobRunShell.java:199)
            at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546)*******************************************我只有一个任务怎么会报这个错呢