用Java调度并发作业

时间:2017-08-31 18:26:44

标签: java spring multithreading scheduler

我在代码中使用两种不同的方式在java中实现了Scheduler。但是,两者似乎都是顺序而非并行线程。我是java 8上的spring 4应用程序。

第一种方式

@Scheduled(cron = "0/59 * * * * *")
public void test2 (){

第二种方式

 @Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    try{

        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override public void run() {
                        try {

                            System.out.println("some configure task running every 10 seconds --" + new Date());
                        } catch (Exception e) {

                        }
                    }
                },
                new Trigger() {
                    @Override public Date nextExecutionTime(TriggerContext triggerContext) {
                        Calendar nextExecutionTime =  Calendar.getInstance();

                        Date lastActualExecutionTime = triggerContext.lastActualExecutionTime();
                        nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());

                        nextExecutionTime.add(Calendar.SECOND, 1000); 
                        return nextExecutionTime.getTime();
                    }
                }
        );

两者都不能在并发模式下工作。这是工作中的巨大不一致。例如,我希望每100秒运行一次,永远不会每100秒启动一次。根据以前的工作完成情况,它可能会延迟超过3-4分钟。 有人可以指出一个更好的解决方案。感谢

我按照以下建议尝试了以下内容。

ConcurrentTaskScheduler scheduler =  new ConcurrentTaskScheduler();
    scheduler.schedule(new Runnable() {
        @Override
        public void run() {
            System.out.println(new Date() +"start of test2 crons job running every 59 seconds test2 test2 test2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println(new Date() +"end of test2 crons job running every 59 seconds end end end ");
        }
    }, new CronTrigger("0/30 * * * * *"));

我创建了5个这样的作业并运行它们但它们仍然按顺序运行。我无法在这里找到我的错误,或者如果有人有任何代码片段或任何链接,我可以找到任何示例代码将非常有帮助。

1 个答案:

答案 0 :(得分:0)

在Spring中,它取决于您使用的特定TaskExecutor。您可以根据自己的情况选择其中几种。有关Spring提供的不同执行程序,请参阅https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-executor-types