java限制方法执行时间

核心第一步

创建线程池对象

核心第二步

创建Callable对象,重写call方法。

核心第三步

创建Future 对象

核心第四步

方法调用,设置超时时间

-----------------------------------------------------  完整实例代码如下 ------------------------------------------------------

    /**
     * 实现父类的抽象方法,执行定时命令
     * @param context 请求内容
     */
    public void executeJob(JobExecutionContext context)throws JobExecutionException {
        String outJobClass = "";
        ExecutorService exec = null;
        try {
            JobDataMap dataMap = context.getJobDetail().getJobDataMap();
            final String    configId = StringUtil.toString(dataMap.get("configId"));
            final Map    jobMap = (Map) dataMap.get("jobMap");
            final List jobList = (List) dataMap.get("jobList");
            final String jobClass = StringUtil.toString(jobMap.get("S_JOB_CLASS"));
            outJobClass = jobClass;

            //通过反射机制,给任务执行类 发送执行命令
            String pre = "com.cattsoft.xplus.task.quartz.agent.impl.";
            final BusinessAgent agent = (BusinessAgent)Class.forName(pre + 
                    jobClass).newInstance();
            //核心第一步,创建线程池对象
            exec = Executors.newFixedThreadPool(1);
            //核心第二步,创建Callable对象
                Callable<String> call = new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        //开始执行耗时操作
                        agent.execute(configId, jobMap, jobList);
                        return null;
                    }
                };
            //核心第三步,创建Future对象
            Future<String> future = exec.submit(call);
            //核心第四步,方法调用,设置超时时间
            future.get(60*10, TimeUnit.SECONDS); //任务处理超时时间设为 10分钟
            
        } catch (TimeoutException ex) {
            LOG.info("处理超时啦...."+outJobClass);
            ex.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            LOG.info("发送定时任务到Agent端失败!!!"+outJobClass);
        }catch(Throwable e) {
            e.printStackTrace();
            LOG.info("发送定时任务到Agent出系统异常!!!"+outJobClass);
        } finally {
            // 关闭线程池
            if(exec != null) {
                exec.shutdownNow();
            }
        }
        
    }

猜你喜欢

转载自blog.csdn.net/wohiusdashi/article/details/82107732