spring异步超时无法正常工作

时间:2013-10-02 16:27:05

标签: spring asynchronous

我在Spring配置中添加了以下内容。我假设默认超时值以秒为单位,所以我将其设置为三分钟。我设置了一个异步任务来让当前线程休眠五分钟。我触发异步任务,它运行完成,没有异常或中断。我做错了什么?

<mvc:annotation-driven>
        <mvc:async-support default-timeout="180"/>
</mvc:annotation-driven>

以下是我正在调用的异步方法:

@Async
    public void generateIDOIncentiveFiles(String sessionId, String userId) throws Exception
    {
        final long SLEEP_TIME_MILLS = 5 * 60 * 1000;

        try
        {
            // Get the job entry from the JOBS table
            Job job = jobsDao.getJob(RequestHelper.JOB_IDO_INCENTIVES);

            // Check to see if the job is enabled.
            if ( job.isEnabled() == false )
                throw new Exception ( "Job is not enabled" );

            // Check to see if the job is already running.

            if ( job.isRunning() )
                throw new Exception ( "Job is running" );

            // Start the timer
            StopWatch sw = new StopWatch();
            sw.start();

            // Capture the date/time when the job was started
            Date jobStartDate = new Date();

            LOG.debug("Starting IDO Incentives Extract process..." );

            String jobCurrentStatus = "running";
            String jobLastRunMsg = "Job started";
            Date jobLastRunDate = new Date();

            jobsDao.updateJobStarted(userId, RequestHelper.JOB_IDO_INCENTIVES, jobLastRunDate, jobLastRunMsg, jobCurrentStatus);

            LOG.debug("Sleeping for five minutes..." );

            Thread.sleep(SLEEP_TIME_MILLS);

            LOG.debug("Back from sleep." );

            jobCurrentStatus = "idle";

            // Capture the date/time when the job ended
            sw.stop();
            double elapsedTime = sw.getTotalTimeSeconds();
            int elapsedTimeMinutes = (int) (elapsedTime / 60);
            Date jobEndDate = new Date();

            jobsDao.updateJobComplete(RequestHelper.JOB_IDO_INCENTIVES, "", "idle");

            // Add entry to JOB_HISTORY table

            LOG.debug("Updating job history..." );

            JobHistory jobHistory = new JobHistory();

            jobHistory.setFile_name("file name");
            jobHistory.setFile_path("file path");
            jobHistory.setElapsed_time(elapsedTimeMinutes);
            jobHistory.setEnd_date(jobEndDate);
            jobHistory.setJob_name(RequestHelper.JOB_IDO_INCENTIVES);
            jobHistory.setStart_date(jobStartDate);
            jobHistory.setStatus("Success");
            jobHistory.setUserid(userId);

            jobHistoryDao.insertJobHistory(jobHistory);

            LOG.debug("Job complete" );

        }
        catch (InterruptedException e)
        {
          e.printStackTrace(); 
        }
    }

1 个答案:

答案 0 :(得分:1)

所以就像我想的那样。

<mvc:annotation-driven>
    <mvc:async-support default-timeout="180"/>
</mvc:annotation-driven>

async-support此处与@Async无关。它与Servlet 3 asynchronous request handling.

有关

无法为@Async方法提供超时值。 Have a look at this answer for how to actually do it.