当前位置: 首页 > 知识库问答 >
问题:

为什么我的Spring@计划任务停止了?

吴宏扬
2023-03-14

我在使用Spring 3.1.1,在WAS8.5环境中,使用Spring的@计划功能每天每8小时运行一次任务。它开始并运行了一段时间,然后无缘无故地停止。我的日志中没有任何内容表明失败。知道是什么导致了这种情况吗?现在已经发生过几次了。这不是由于服务器重启等原因。

package com.my.project.scheduler;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.context.ContextLoaderListener;

import com.my.project.scheduler.model.RetransmitEvent;

public class RetransmitTimer {    

    private static final Logger LOG = Logger.getLogger( RetransmitTimer.class );

    @Scheduled( cron = "${retransmit.cron.interval.1}" )
    public void retransmitSchedule1() {
        retransmit();
    }
    @Scheduled( cron = "${retransmit.cron.interval.2}" )
    public void retransmitSchedule2() {
        retransmit();
    }
    @Scheduled( cron = "${retransmit.cron.interval.3}" )
    public void retransmitSchedule3() {
        retransmit();
    }
    private void retransmit() {
        LOG.info( "############# AUTOMATIC RETRANSMIT EXECUTING ##############" );        
        try
        {
            [code to gather retransmitEvents omitted]
            if ( retransmitEvents.size() > 0 ) {
                LOG.info( "Total retransmits found=" + retransmitEvents.size() );
                submitRetransmits( retransmitEvents );
            }
        }    
        finally
        {    [method cleanup, etc]
            LOG.info( "############# AUTOMATIC RETRANSMIT COMPLETED ##############" );
        }
    }

    private void submitRetransmits( List<RetransmitEvent> retransmitEvents ) {
        ApplicationContext context = ContextLoaderListener.getCurrentWebApplicationContext();
        DataSource ds1 = (DataSource) context.getBean("jdbc/DS1");
        DataSource ds2 = (DataSource) context.getBean("jdbc/DS2");
        [rest of the code to process database updates omitted]
    }
}

我的应用程序上下文。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:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/task
                        http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <context:property-placeholder location="classpath:my-scheduler.properties" />
    <context:annotation-config/>
    <context:component-scan base-package="com.my.project" />

    <task:annotation-driven/> <!-- for the Scheduled annotations in the timer code -->

    <bean id="retransmitTimer" class="com.my.project.scheduler.RetransmitTimer" scope="singleton"/>

    <!-- The following Spring beans replace what would normally go into the web.xml file -->
    <!-- They're for the attachmentViewer.jar attachment retry process -->
    <bean id="jdbc/DS1" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jdbc/DS1" />
        <property name="lookupOnStartup" value="false" />
        <property name="cache" value="true" />
        <property name="proxyInterface" value="javax.sql.DataSource" />
    </bean>

    <bean id="jdbc/DS2" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jdbc/DS2" />
        <property name="lookupOnStartup" value="false" />
        <property name="cache" value="true" />
        <property name="proxyInterface" value="javax.sql.DataSource" />
    </bean>
</beans>

我的调度程序。属性

# Retransmit preferences
#   CRON parms: Second Minute Hour Day-of-Month Month Day-of-the-Week
#   So, we're set to run everyday at the top of the hour at 4am, 12pm and 8pm
retransmit.cron.interval.1=0 0 4 * * ?
retransmit.cron.interval.2=0 0 12 * * ?
retransmit.cron.interval.3=0 0 20 * * ?

我知道我可以在一行上每8小时设置一次CRON parm,但是用户可以在他们想要的方面获得非常有创造性的东西,所以我在中留下了3个条目。

以下是日志片段,显示它已经工作了几天。服务器于下午3月4日重新启动,此后再也没有重新启动过。

[2016-03-04 20:00:00,047] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-04 20:00:01,853] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-05 04:00:00,111] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-05 04:00:00,531] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-05 12:00:00,167] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-05 12:00:00,172] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-05 20:00:00,197] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-05 20:00:00,312] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-06 04:00:00,200] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-06 04:00:00,438] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-06 12:00:00,193] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-06 12:00:00,198] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-06 20:00:00,193] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-06 20:00:00,565] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-07 04:00:00,201] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-07 04:00:00,207] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-07 12:00:00,204] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-07 12:00:00,260] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-07 20:00:00,197] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-07 20:00:01,405] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############
[2016-03-08 04:00:00,198] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT EXECUTING ##############
[2016-03-08 04:00:00,568] [pool-7-thread-1] INFO  com.excellus.blue2.scheduler.RetransmitTimer - ############# AUTOMATIC RETRANSMIT COMPLETED ##############

凌晨3/8点4分后不再输入。我还应该注意,在此期间没有找到调用子方法submitRetransmits()的重传条目。

知道为什么这些预定任务会停止吗?提前谢谢。

共有2个答案

窦宏旷
2023-03-14

事实证明,我的调度程序应用程序一直在运行。这是一个日志问题。我将日志记录与其他项目分离开来,结果显示它仍在正常运行。谢谢你的建议。

祁星阑
2023-03-14

尝试发送kill-3以查看堆栈跟踪。可能有些进程是堆栈的,无法继续。您还可以检查您的传输是否有一些超时,如果没有,最好设置它。

 类似资料:
  • 我们有10个计划任务,配置为每20秒运行一次,带有以下注释(它们在晚上停止,因为依赖系统在早上4点重新启动): 我们有一个线程池taks调度器,配置池大小为10: 有时在一天中,其中一项任务在一两个小时内没有执行,然后继续定期执行。有没有可能其中一个任务正在阻止其他任务?我怎样才能知道情况是否如此?

  • 问题内容: 我正在使用类,并且正在使用其schedule方法执行某些任务,但是在执行了6次之后,我必须停止其任务。 我该怎么办? 问题答案: 在某个地方保留对计时器的引用,并使用: 停止所做的一切。您可以将此代码放在正在执行的任务中,以计算您经过的次数,例如

  • 我正在使用@Scheduled annotation运行cron作业。调度工作了一段时间,然后停止工作。我将给出我的代码的简化片段: 这是调度程序: 这是由调度器执行的任务 “开始代理”和“结束代理”的记录次数相同。所以,每一个日程安排都会正确地结束。 “开始任务”和“结束任务”的记录次数相同。所以,毫无疑问,“任务”并不是阻止事情。 但是过了一段时间就停止记录了。有什么问题吗? 这里,TASK_

  • 我已经安排了一个任务来启动批处理文件。当我使用选项运行任务时 仅在用户登录时运行 一切正常。 我想在后台运行此任务,因此我使用选项运行它 无论用户是否登录,运行。 现在,当我在该参数下运行任务时,它不起作用。我得到以下两个错误: < li >任务计划程序无法启动任务“\stmm\Daemon”的实例“{ 2a 7cc 950-fad 9-4633-9701-af 75 a 0 FD 220d }”

  • 我有一些预定的任务: 这就是我想要的样子。网络上有一些解决方案,但它们似乎都相当复杂,对我来说不太管用,而这似乎是一个相当常见的问题。

  • 问题内容: 我已经使用Spring Framework的注释创建了一个简单的计划任务。 现在,当不再需要时,我想停止此任务。 我知道在此方法开始时可能有一种方法可以检查一个条件标志,但这不会停止执行此方法。 Spring提供了什么来停止任务? 问题答案: 选项1:使用后处理器 为应停止调度的bean 提供并显式调用。 选项2:维护目标豆与其未来的映射 当必须停止对bean的调度时,可以查找该映射以