Return-Path: X-Original-To: apmail-zest-commits-archive@minotaur.apache.org Delivered-To: apmail-zest-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 41AB718EC4 for ; Sat, 5 Dec 2015 09:20:17 +0000 (UTC) Received: (qmail 57583 invoked by uid 500); 5 Dec 2015 09:20:17 -0000 Delivered-To: apmail-zest-commits-archive@zest.apache.org Received: (qmail 57557 invoked by uid 500); 5 Dec 2015 09:20:17 -0000 Mailing-List: contact commits-help@zest.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@zest.apache.org Delivered-To: mailing list commits@zest.apache.org Received: (qmail 57519 invoked by uid 99); 5 Dec 2015 09:20:17 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 05 Dec 2015 09:20:17 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id E2687DFC8E; Sat, 5 Dec 2015 09:20:16 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: niclas@apache.org To: commits@zest.apache.org Date: Sat, 05 Dec 2015 09:20:17 -0000 Message-Id: <96ce247259024504840b1ed752cdff24@git.apache.org> In-Reply-To: <2c9cf8bf3b0d432e8070aa47ae075e8f@git.apache.org> References: <2c9cf8bf3b0d432e8070aa47ae075e8f@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/3] zest-java git commit: ZEST-130 - FIrst attempt at the Quartz integration issue. Doesn't work. Quartz is too complex and has not been able to separate its concerns well enough, forcing all new JobStore implementations to do a lot more work than shou http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggerWrapper.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggerWrapper.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggerWrapper.java new file mode 100644 index 0000000..47ec9f5 --- /dev/null +++ b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggerWrapper.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.zest.library.scheduler; + +import java.util.Date; +import org.apache.zest.api.mixin.Mixins; +import org.apache.zest.api.property.Property; +import org.quartz.Calendar; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.JobKey; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.TriggerKey; +import org.quartz.spi.OperableTrigger; + +@Mixins( TriggerWrapper.OperableMixin.class) +public interface TriggerWrapper extends OperableTrigger +{ + enum State {waiting, aquired } + Property trigger(); + + Property nextTime(); + + Property state(); + + abstract class OperableMixin + implements OperableTrigger{ + + @Override + public void triggered( Calendar calendar ) + { + + } + + @Override + public Date computeFirstFireTime( Calendar calendar ) + { + return null; + } + + @Override + public CompletedExecutionInstruction executionComplete( JobExecutionContext context, + JobExecutionException result + ) + { + return null; + } + + @Override + public void updateAfterMisfire( Calendar cal ) + { + + } + + @Override + public void updateWithNewCalendar( Calendar cal, long misfireThreshold ) + { + + } + + @Override + public void validate() + throws SchedulerException + { + + } + + @Override + public void setFireInstanceId( String id ) + { + + } + + @Override + public String getFireInstanceId() + { + return null; + } + + @Override + public void setNextFireTime( Date nextFireTime ) + { + + } + + @Override + public void setPreviousFireTime( Date previousFireTime ) + { + + } + + @Override + public void setKey( TriggerKey key ) + { + + } + + @Override + public void setJobKey( JobKey key ) + { + + } + + @Override + public void setDescription( String description ) + { + + } + + @Override + public void setCalendarName( String calendarName ) + { + + } + + @Override + public void setJobDataMap( JobDataMap jobDataMap ) + { + + } + + @Override + public void setPriority( int priority ) + { + + } + + @Override + public void setStartTime( Date startTime ) + { + + } + + @Override + public void setEndTime( Date endTime ) + { + + } + + @Override + public void setMisfireInstruction( int misfireInstruction ) + { + + } + + @Override + public int compareTo( Trigger other ) + { + return -1; + } + + @Override + public Object clone() + { + throw new UnsupportedOperationException( "This operation is not supported." ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroup.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroup.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroup.java new file mode 100644 index 0000000..79e98d1 --- /dev/null +++ b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroup.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.zest.library.scheduler; + +import org.apache.zest.api.association.NamedAssociation; +import org.apache.zest.api.entity.EntityComposite; + +public interface TriggersGroup extends EntityComposite +{ + NamedAssociation triggers(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroups.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroups.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroups.java new file mode 100644 index 0000000..e89f773 --- /dev/null +++ b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/TriggersGroups.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.zest.library.scheduler; + +import org.apache.zest.api.association.NamedAssociation; +import org.apache.zest.api.entity.EntityComposite; + +public interface TriggersGroups extends EntityComposite +{ + NamedAssociation groups(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJob.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJob.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJob.java new file mode 100644 index 0000000..927df41 --- /dev/null +++ b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJob.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.zest.library.scheduler; + +import org.apache.zest.api.common.Optional; +import org.apache.zest.api.entity.EntityComposite; +import org.apache.zest.api.property.Property; +import org.apache.zest.library.constraints.annotation.Matches; +import org.quartz.Job; + +public interface ZestJob extends Job, EntityComposite +{ +// @Matches( "job://[a-zA-Z0-9_]+\\.[a-zA-Z0-9_]+" ) +// Property identity(); + + @Optional + Property description(); +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobDetail.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobDetail.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobDetail.java new file mode 100644 index 0000000..5324dd0 --- /dev/null +++ b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobDetail.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.zest.library.scheduler; + +import java.lang.reflect.UndeclaredThrowableException; +import org.apache.zest.api.common.Optional; +import org.apache.zest.api.injection.scope.This; +import org.apache.zest.api.mixin.Mixins; +import org.apache.zest.api.property.Property; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; +import org.quartz.JobKey; + +@Mixins( ZestJobDetail.ZestJobDetailMixin.class ) +public interface ZestJobDetail extends JobDetail +{ + + interface State + { + Property jobIdentity(); + + @Optional + Property description(); + + Property jobClass(); + } + + class ZestJobDetailMixin implements JobDetail + { + + @This + State state; + + @Override + public JobKey getKey() + { + String id = state.jobIdentity().get(); + id = id.substring( "job://".length() ); + String[] split = id.split( "\\." ); + return JobKey.jobKey( split[ 1 ], split[ 0 ] ); + } + + @Override + public String getDescription() + { + return state.description().get(); + } + + @Override + public Class getJobClass() + { + String classname = state.jobClass().get(); + try + { + @SuppressWarnings( "unchecked" ) + Class jobClass = (Class) getClass().getClassLoader() + .loadClass( classname ); + return jobClass; + } + catch( ClassNotFoundException e ) + { + throw new UndeclaredThrowableException( e ); + } + } + + @Override + public JobDataMap getJobDataMap() + { + return null; + } + + @Override + public boolean isDurable() + { + return true; + } + + @Override + public boolean isPersistJobDataAfterExecution() + { + return false; + } + + @Override + public boolean isConcurrentExectionDisallowed() + { + return false; + } + + @Override + public boolean requestsRecovery() + { + return false; + } + + @Override + public JobBuilder getJobBuilder() + { + throw new UnsupportedOperationException( "Quartz JobBuilder is not supported in Apache Zest. Use EntityBuilders." ); + } + + @Override + public Object clone() + { + throw new UnsupportedOperationException( "clone() should not be needed as JobDetail is a ValueComposite." ); + } + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobFactory.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobFactory.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobFactory.java new file mode 100644 index 0000000..312d707 --- /dev/null +++ b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/ZestJobFactory.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.zest.library.scheduler; + +import org.apache.zest.api.injection.scope.Structure; +import org.apache.zest.api.unitofwork.UnitOfWork; +import org.apache.zest.api.unitofwork.UnitOfWorkFactory; +import org.quartz.Job; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.spi.JobFactory; +import org.quartz.spi.TriggerFiredBundle; + +public class ZestJobFactory + implements JobFactory +{ + @Structure + private UnitOfWorkFactory uowf; + + @Override + public Job newJob( TriggerFiredBundle bundle, Scheduler scheduler ) + throws SchedulerException + { + JobDetail jobDetail = bundle.getJobDetail(); + Class jobType = jobDetail.getJobClass(); + if( ZestJob.class.isAssignableFrom( jobType ) ) + { + JobKey jobKey = jobDetail.getKey(); + String jobId = "job://" + jobKey.getGroup() + "." + jobKey.getName(); + + @SuppressWarnings( "unchecked" ) + ZestJob job = createJob( (Class) jobType, jobId ); + return job; + } + return null; + } + + private T createJob( Class jobType, String jobId ) + { + UnitOfWork uow = uowf.currentUnitOfWork(); + return uow.get( jobType, jobId ); + } +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/SchedulerAssembler.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/SchedulerAssembler.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/SchedulerAssembler.java deleted file mode 100644 index 317abd1..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/SchedulerAssembler.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2010-2012, Paul Merlin. - * Copyright (c) 2012, Niclas Hedhman. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.bootstrap; - -import org.apache.zest.api.unitofwork.concern.UnitOfWorkConcern; -import org.apache.zest.bootstrap.Assemblers; -import org.apache.zest.bootstrap.AssemblyException; -import org.apache.zest.bootstrap.EntityDeclaration; -import org.apache.zest.bootstrap.ModuleAssembly; -import org.apache.zest.bootstrap.ServiceDeclaration; -import org.apache.zest.bootstrap.ValueDeclaration; -import org.apache.zest.library.scheduler.SchedulerConfiguration; -import org.apache.zest.library.scheduler.SchedulerService; -import org.apache.zest.library.scheduler.internal.TaskRunner; -import org.apache.zest.library.scheduler.ScheduleFactory; -import org.apache.zest.library.scheduler.internal.Schedules; -import org.apache.zest.library.scheduler.CronSchedule; -import org.apache.zest.library.scheduler.OnceSchedule; -import org.apache.zest.library.scheduler.timeline.Timeline; -import org.apache.zest.library.scheduler.timeline.TimelineForScheduleConcern; -import org.apache.zest.library.scheduler.timeline.TimelineRecord; -import org.apache.zest.library.scheduler.timeline.TimelineScheduleMixin; -import org.apache.zest.library.scheduler.timeline.TimelineSchedulerServiceMixin; - -/** - * Assembler for Scheduler. - * - * Use this Assembler to add the Scheduler service to your application. - * This Assembler provide a fluent api to programmatically configure configuration defaults and - * activate the Timeline service assembly that allow to browse in past and future Task runs. - * - * Here is a full example: - *
- *      new SchedulerAssembler().
- *              visibleIn( Visibility.layer ).
- *              withConfig( configModuleAssembly, Visibility.application ).
- *              withTimeline().
- *              assemble( module );
- * 
- */ -public class SchedulerAssembler - extends Assemblers.VisibilityConfig -{ - - private static final int DEFAULT_WORKERS_COUNT = Runtime.getRuntime().availableProcessors() + 1; - private static final int DEFAULT_WORKQUEUE_SIZE = 10; - - private boolean timeline; - - /** - * Activate the assembly of Timeline related services. - * - * @return SchedulerAssembler - */ - public SchedulerAssembler withTimeline() - { - timeline = true; - return this; - } - - @Override - public void assemble( ModuleAssembly assembly ) - throws AssemblyException - { - assembly.services( ScheduleFactory.class ); - assembly.entities( Schedules.class ); - EntityDeclaration scheduleEntities = assembly.entities( CronSchedule.class, OnceSchedule.class ); - - ValueDeclaration scheduleValues = assembly.values( CronSchedule.class, OnceSchedule.class ); - - ServiceDeclaration schedulerDeclaration = assembly.services( SchedulerService.class ) - .visibleIn( visibility() ) - .instantiateOnStartup(); - - assembly.transients( Runnable.class ).withMixins( TaskRunner.class ).withConcerns( UnitOfWorkConcern.class ); - - if( timeline ) - { - scheduleEntities.withTypes( Timeline.class ) - .withMixins( TimelineScheduleMixin.class ) - .withConcerns( TimelineForScheduleConcern.class ); - - scheduleValues.withTypes( Timeline.class ) - .withMixins( TimelineScheduleMixin.class ) - .withConcerns( TimelineForScheduleConcern.class ); - - // Internal - assembly.values( TimelineRecord.class ); - schedulerDeclaration.withTypes( Timeline.class ).withMixins( TimelineSchedulerServiceMixin.class ); - } - - if( hasConfig() ) - { - configModule().entities( SchedulerConfiguration.class ) - .visibleIn( configVisibility() ); - SchedulerConfiguration defaults = assembly.forMixin( SchedulerConfiguration.class ).declareDefaults(); - defaults.workersCount().set( DEFAULT_WORKERS_COUNT ); - defaults.workQueueSize().set( DEFAULT_WORKQUEUE_SIZE ); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/package.html ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/package.html b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/package.html deleted file mode 100644 index b9a2ef1..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/bootstrap/package.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -

Scheduler Assembly.

- - \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultRejectionHandler.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultRejectionHandler.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultRejectionHandler.java deleted file mode 100644 index 9a8e631..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultRejectionHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -package org.apache.zest.library.scheduler.defaults; - -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import org.apache.zest.library.scheduler.SchedulerService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DefaultRejectionHandler - implements RejectedExecutionHandler -{ - private static final Logger LOGGER = LoggerFactory.getLogger( SchedulerService.class ); - - @Override - public void rejectedExecution( Runnable r, ThreadPoolExecutor executor ) - { - LOGGER.error( "Runnable [" + r + "] was rejected by executor [" + executor + "]" ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultScheduleFactoryMixin.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultScheduleFactoryMixin.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultScheduleFactoryMixin.java deleted file mode 100644 index 27c7125..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultScheduleFactoryMixin.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -package org.apache.zest.library.scheduler.defaults; - -import org.apache.zest.api.entity.EntityBuilder; -import org.apache.zest.api.injection.scope.Service; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.structure.Module; -import org.apache.zest.api.unitofwork.UnitOfWork; -import org.apache.zest.library.scheduler.SchedulerService; -import org.apache.zest.library.scheduler.Task; -import org.apache.zest.library.scheduler.Schedule; -import org.apache.zest.library.scheduler.ScheduleFactory; -import org.apache.zest.library.scheduler.CronSchedule; -import org.apache.zest.library.scheduler.OnceSchedule; -import org.apache.zest.spi.uuid.UuidIdentityGeneratorService; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DefaultScheduleFactoryMixin - implements ScheduleFactory -{ - private static final Logger logger = LoggerFactory.getLogger( ScheduleFactory.class ); - - @Structure - private Module module; - - @Service - private SchedulerService scheduler; - - @Service - private UuidIdentityGeneratorService uuid; - - @Override - public CronSchedule newCronSchedule( Task task, String cronExpression, DateTime start ) - { - return newPersistentCronSchedule( task, cronExpression, start ); - } - - @Override - public Schedule newOnceSchedule( Task task, DateTime runAt ) - { - return newPersistentOnceSchedule( task, runAt ); - } - - private CronSchedule newPersistentCronSchedule( Task task, String cronExpression, DateTime start ) - { - UnitOfWork uow = module.currentUnitOfWork(); - EntityBuilder builder = uow.newEntityBuilder( CronSchedule.class ); - CronSchedule instance = builder.instance(); - instance.task().set( task ); - instance.start().set( start ); - instance.identity().set( uuid.generate( CronSchedule.class ) ); - instance.cronExpression().set( cronExpression ); - CronSchedule schedule = builder.newInstance(); - logger.info( "Schedule {} created: {}", schedule.presentationString(), schedule.identity().get() ); - return schedule; - } - - private Schedule newPersistentOnceSchedule( Task task, DateTime runAt ) - { - UnitOfWork uow = module.currentUnitOfWork(); - EntityBuilder builder = uow.newEntityBuilder( OnceSchedule.class ); - OnceSchedule builderInstance = builder.instance(); - builderInstance.task().set( task ); - builderInstance.start().set( runAt ); - builderInstance.identity().set( uuid.generate( OnceSchedule.class ) ); - OnceSchedule schedule = builder.newInstance(); - logger.info( "Schedule {} created: {}", schedule.presentationString(), schedule.identity().get() ); - return schedule; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultThreadFactory.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultThreadFactory.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultThreadFactory.java deleted file mode 100644 index 43520bd..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/defaults/DefaultThreadFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -package org.apache.zest.library.scheduler.defaults; - -import java.util.concurrent.atomic.AtomicInteger; -import org.apache.zest.api.injection.scope.This; -import org.apache.zest.library.scheduler.internal.Execution; -import org.apache.zest.library.scheduler.SchedulerService; - -public class DefaultThreadFactory - implements java.util.concurrent.ThreadFactory -{ - private static final AtomicInteger POOL_NUMBER = new AtomicInteger( 1 ); - private final ThreadGroup group; - private final AtomicInteger threadNumber = new AtomicInteger( 1 ); - private final String namePrefix; - - protected DefaultThreadFactory( @This SchedulerService me ) - { - SecurityManager sm = System.getSecurityManager(); - group = ( sm != null ) ? sm.getThreadGroup() : Execution.ExecutionMixin.TG; - namePrefix = me.identity().get() + "-P" + POOL_NUMBER.getAndIncrement() + "W"; - } - - @Override - public Thread newThread( Runnable runnable ) - { - Thread thread = new Thread( group, runnable, namePrefix + threadNumber.getAndIncrement(), 0 ); - if( thread.isDaemon() ) - { - thread.setDaemon( false ); - } - if( thread.getPriority() != Thread.NORM_PRIORITY ) - { - thread.setPriority( Thread.NORM_PRIORITY ); - } - return thread; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Execution.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Execution.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Execution.java deleted file mode 100644 index 08eb627..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Execution.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -package org.apache.zest.library.scheduler.internal; - -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import org.apache.zest.api.concern.Concerns; -import org.apache.zest.api.configuration.Configuration; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.injection.scope.This; -import org.apache.zest.api.mixin.Mixins; -import org.apache.zest.api.structure.Module; -import org.apache.zest.api.unitofwork.NoSuchEntityException; -import org.apache.zest.api.unitofwork.UnitOfWork; -import org.apache.zest.api.unitofwork.concern.UnitOfWorkConcern; -import org.apache.zest.library.scheduler.Schedule; -import org.apache.zest.library.scheduler.Scheduler; -import org.apache.zest.library.scheduler.SchedulerConfiguration; - -/** - * This composite handles the Execution of Schedules. - * - * The composite is internal and should never be used by clients. - */ -@Mixins( Execution.ExecutionMixin.class ) -public interface Execution -{ - void dispatchForExecution( Schedule schedule ); - - void start() - throws Exception; - - void stop() - throws Exception; - - void updateNextTime( ScheduleTime schedule ); // This method is public, only because the UnitOfWorkConcern is wanted. - - class ExecutionMixin - implements Execution, Runnable - { - public static final ThreadGroup TG = new ThreadGroup( "Zest Scheduling" ); - - private final Object lock = new Object(); - - @Structure - private Module module; - - @This - private Scheduler scheduler; - - @This - private Configuration config; - - @This - private ThreadFactory threadFactory; - - @This - private RejectedExecutionHandler rejectionHandler; - - private final SortedSet timingQueue = new TreeSet<>(); - private volatile boolean running; - private ThreadPoolExecutor taskExecutor; - private volatile Thread scheduleThread; - - @Override - public void run() - { - running = true; - while( running ) - { - try - { - ScheduleTime scheduleTime = timing(); - if( scheduleTime != null ) - { - waitFor( scheduleTime ); - - if( isTime( scheduleTime ) ) // We might have been awakened to reschedule - { - updateNextTime( scheduleTime ); - } - } - else - { - waitFor( 100 ); - } - } - catch( Throwable e ) - { - e.printStackTrace(); - } - } - } - - private ScheduleTime timing() - { - synchronized( lock ) - { - if( timingQueue.size() == 0 ) - { - return null; - } - return timingQueue.first(); - } - } - - private boolean isTime( ScheduleTime scheduleTime ) - { - long now = System.currentTimeMillis(); - return scheduleTime.nextTime() <= now; - } - - private void waitFor( ScheduleTime scheduleTime ) - throws InterruptedException - { - long now = System.currentTimeMillis(); - long waitingTime = scheduleTime.nextTime() - now; - waitFor( waitingTime ); - } - - private void waitFor( long waitingTime ) - { - if( waitingTime > 0 ) - { - synchronized( lock ) - { - try - { - lock.wait( waitingTime ); - } - catch( InterruptedException e ) - { - // should be ignored. - } - } - } - } - - @Override - public void updateNextTime( ScheduleTime oldScheduleTime ) - { - long now = System.currentTimeMillis(); - - try (UnitOfWork uow = module.newUnitOfWork()) // This will discard() the UoW when block is exited. We are only doing reads, so fine. - { - submitTaskForExecution( oldScheduleTime ); - Schedule schedule = uow.get( Schedule.class, oldScheduleTime.scheduleIdentity() ); - long nextTime = schedule.nextRun( now + 1000 ); - if( nextTime != Long.MIN_VALUE ) - { - ScheduleTime newScheduleTime = new ScheduleTime( oldScheduleTime.scheduleIdentity(), nextTime ); - synchronized( lock ) - { - // Re-add to the Timing Queue, to re-position the sorting. - timingQueue.remove( oldScheduleTime ); - timingQueue.add( newScheduleTime ); - } - } - else - { - synchronized( lock ) - { - timingQueue.remove( oldScheduleTime ); - } - } - } - catch( NoSuchEntityException e ) - { - e.printStackTrace(); -// scheduler.cancelSchedule( oldScheduleTime.scheduleIdentity() ); - } - } - - private void submitTaskForExecution( ScheduleTime scheduleTime ) - { - Runnable taskRunner = module.newTransient( Runnable.class, scheduleTime ); - this.taskExecutor.submit( taskRunner ); - } - - public void dispatchForExecution( Schedule schedule ) - { - long now = System.currentTimeMillis(); - long nextRun = schedule.nextRun( now + 1000 ); - if( nextRun > 0 ) - { - synchronized( lock ) - { - timingQueue.add( new ScheduleTime( schedule.identity().get(), nextRun ) ); - lock.notifyAll(); - } - } - } - - @Override - public void start() - throws Exception - { - SchedulerConfiguration configuration = config.get(); - Integer workersCount = configuration.workersCount().get(); - Integer workQueueSize = configuration.workQueueSize().get(); - createThreadPoolExecutor( workersCount, workQueueSize ); - taskExecutor.prestartAllCoreThreads(); - - SecurityManager sm = System.getSecurityManager(); - ThreadGroup threadGroup = sm != null ? sm.getThreadGroup() : TG; - scheduleThread = new Thread( threadGroup, this, "Scheduler" ); - scheduleThread.start(); - } - - private void createThreadPoolExecutor( Integer workersCount, Integer workQueueSize ) - { - int corePoolSize = 2; - if( workersCount > 4 ) - { - corePoolSize = workersCount / 4 + 1; - } - if( corePoolSize > 50 ) - { - corePoolSize = 20; - } - if( workersCount > 200 ) - { - workersCount = 200; - } - taskExecutor = new ThreadPoolExecutor( corePoolSize, workersCount, - 0, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue<>( workQueueSize ), - threadFactory, rejectionHandler ); - } - - @Override - public void stop() - throws Exception - { - running = false; - synchronized( this ) - { - scheduleThread.interrupt(); - } - taskExecutor.shutdown(); - try - { - taskExecutor.awaitTermination( 5, TimeUnit.SECONDS ); - } - catch( InterruptedException e ) - { - e.printStackTrace(); - } - taskExecutor.shutdownNow(); - } - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/ScheduleTime.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/ScheduleTime.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/ScheduleTime.java deleted file mode 100644 index b008de7..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/ScheduleTime.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.zest.library.scheduler.internal; - -import org.apache.zest.api.util.NullArgumentException; - -public final class ScheduleTime - implements Comparable -{ - private String scheduleIdentity; - private long nextTime; - - public ScheduleTime( String scheduleIdentity, long nextTime ) - { - NullArgumentException.validateNotEmpty( "scheduleIdentity", scheduleIdentity ); - this.scheduleIdentity = scheduleIdentity; - this.nextTime = nextTime; - } - - public long nextTime() - { - return nextTime; - } - - public String scheduleIdentity() - { - return scheduleIdentity; - } - - @Override - public int compareTo( ScheduleTime another ) - { - if( this.scheduleIdentity.equals( another.scheduleIdentity ) ) - { - return 0; - } - - if( this.nextTime < another.nextTime ) - { - return -1; - } - return 1; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/SchedulerMixin.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/SchedulerMixin.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/SchedulerMixin.java deleted file mode 100644 index 3afafa5..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/SchedulerMixin.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.zest.library.scheduler.internal; - -import org.apache.zest.api.configuration.Configuration; -import org.apache.zest.api.injection.scope.Service; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.injection.scope.This; -import org.apache.zest.api.service.ServiceActivation; -import org.apache.zest.api.structure.Module; -import org.apache.zest.api.unitofwork.NoSuchEntityException; -import org.apache.zest.api.unitofwork.UnitOfWork; -import org.apache.zest.api.unitofwork.UnitOfWorkCompletionException; -import org.apache.zest.api.usecase.UsecaseBuilder; -import org.apache.zest.library.scheduler.Scheduler; -import org.apache.zest.library.scheduler.SchedulerConfiguration; -import org.apache.zest.library.scheduler.SchedulerService; -import org.apache.zest.library.scheduler.SchedulesHandler; -import org.apache.zest.library.scheduler.Task; -import org.apache.zest.library.scheduler.CronSchedule; -import org.apache.zest.library.scheduler.Schedule; -import org.apache.zest.library.scheduler.ScheduleFactory; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SchedulerMixin - implements Scheduler, ServiceActivation -{ - private static final Logger LOGGER = LoggerFactory.getLogger( Scheduler.class ); - - @Service - private ScheduleFactory scheduleFactory; - - @Structure - private Module module; - - @This - private SchedulerService me; - - @This - private SchedulesHandler schedulesHandler; - - @This - private Execution execution; - - @This - private Configuration config; - - public SchedulerMixin() - { - } - - @Override - public Schedule scheduleOnce( Task task, int initialSecondsDelay ) - { - long now = System.currentTimeMillis(); - Schedule schedule = scheduleFactory.newOnceSchedule( task, new DateTime( now + initialSecondsDelay * 1000 ) ); - saveAndDispatch( schedule ); - return schedule; - } - - @Override - public Schedule scheduleOnce( Task task, DateTime runAt ) - { - Schedule schedule = scheduleFactory.newOnceSchedule( task, runAt ); - saveAndDispatch( schedule ); - return schedule; - } - - @Override - public Schedule scheduleCron( Task task, String cronExpression ) - { - DateTime now = new DateTime(); - Schedule schedule = scheduleFactory.newCronSchedule( task, cronExpression, now ); - saveAndDispatch( schedule ); - return schedule; - } - - @Override - public Schedule scheduleCron( Task task, @CronSchedule.CronExpression String cronExpression, DateTime start ) - { - Schedule schedule = scheduleFactory.newCronSchedule( task, cronExpression, start ); - saveAndDispatch( schedule ); - return schedule; - } - - @Override - public void scheduleCron( Schedule schedule ) - { - saveAndDispatch( schedule ); - } - - @Override - public Schedule scheduleCron( Task task, String cronExpression, long initialDelay ) - { - DateTime start = new DateTime( System.currentTimeMillis() + initialDelay ); - Schedule schedule = scheduleFactory.newCronSchedule( task, cronExpression, start ); - saveAndDispatch( schedule ); - return schedule; - } - - @Override - public void cancelSchedule( String scheduleId ) - { - UnitOfWork uow = module.currentUnitOfWork(); - Schedule schedule = null; - try - { - schedule = uow.get( Schedule.class, scheduleId ); - } - catch( NoSuchEntityException e ) - { - return; - } - cancelSchedule( schedule ); - } - - @Override - public void cancelSchedule( Schedule schedule ) - { - Schedules active = schedulesHandler.getActiveSchedules(); - if( active.schedules().remove( schedule ) ) - { - schedule.cancelled().set( true ); - } - } - - private void saveAndDispatch( Schedule schedule ) - { - Schedules schedules = schedulesHandler.getActiveSchedules(); - schedules.schedules().add( schedule ); - execution.dispatchForExecution( schedule ); - } - - private void loadSchedules() - throws UnitOfWorkCompletionException - { - try (UnitOfWork ignored = module.newUnitOfWork( UsecaseBuilder.newUsecase( "Initialize Schedules" ) )) - { - Schedules schedules = schedulesHandler.getActiveSchedules(); - for( Schedule schedule : schedules.schedules() ) - { - dispatch( schedule ); - } - } - } - - private void dispatch( Schedule schedule ) - { - try - { - if( !schedule.cancelled().get() && !schedule.done().get() ) - { - execution.dispatchForExecution( schedule ); - } - } catch( Exception e ) - { - e.printStackTrace(); - } - } - - @Override - public void activateService() - throws Exception - { - // Throws IllegalArgument if corePoolSize or keepAliveTime less than zero, - // or if workersCount less than or equal to zero, - // or if corePoolSize greater than workersCount. - execution.start(); - loadSchedules(); - LOGGER.debug( "Activated" ); - } - - @Override - public void passivateService() - throws Exception - { - execution.stop(); - LOGGER.debug( "Passivated" ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Schedules.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Schedules.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Schedules.java deleted file mode 100644 index 95563c1..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/Schedules.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ -package org.apache.zest.library.scheduler.internal; - -import org.apache.zest.api.association.ManyAssociation; -import org.apache.zest.library.scheduler.Schedule; - -public interface Schedules -{ - ManyAssociation schedules(); -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/TaskRunner.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/TaskRunner.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/TaskRunner.java deleted file mode 100644 index fa52d73..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/internal/TaskRunner.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -package org.apache.zest.library.scheduler.internal; - -import java.lang.reflect.UndeclaredThrowableException; -import java.util.concurrent.locks.ReentrantLock; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.injection.scope.Uses; -import org.apache.zest.api.structure.Module; -import org.apache.zest.api.unitofwork.UnitOfWork; -import org.apache.zest.api.usecase.UsecaseBuilder; -import org.apache.zest.library.scheduler.Task; -import org.apache.zest.library.scheduler.Schedule; - -public class TaskRunner - implements Runnable -{ - private static ReentrantLock lock = new ReentrantLock(); - - @Structure - private Module module; - - @Uses - private ScheduleTime schedule; - - @Override - public void run() - { - // TODO: (niclas) I am NOT happy with this implementation, requiring 3 UnitOfWorks to be created. 15-20 milliseconds on my MacBook. If there is a better way to detect overrun, two of those might not be needed. - UnitOfWork uow = module.newUnitOfWork( UsecaseBuilder.newUsecase( "Task Runner initialize" ) ); - try - { - lock.lock(); - Schedule schedule = uow.get( Schedule.class, this.schedule.scheduleIdentity() ); - if( !schedule.running().get() ) // check for overrun. - { - try - { - schedule.taskStarting(); - schedule.running().set( true ); - uow.complete(); // This completion is needed to detect overrun - - uow = module.newUnitOfWork( UsecaseBuilder.newUsecase( "Task Runner" ) ); - schedule = uow.get( schedule ); // re-attach the entity to the new UnitOfWork - Task task = schedule.task().get(); - lock.unlock(); - task.run(); - lock.lock(); - uow.complete(); - uow = module.newUnitOfWork( UsecaseBuilder.newUsecase( "Task Runner conclude" ) ); - schedule = uow.get( schedule ); // re-attach the entity to the new UnitOfWork - schedule.running().set( false ); - schedule.taskCompletedSuccessfully(); - schedule.executionCounter().set( schedule.executionCounter().get() + 1 ); - } - catch( RuntimeException ex ) - { - schedule.running().set( false ); - processException( schedule, ex ); - } - } - else - { - schedule.overrun().set( schedule.overrun().get() + 1 ); - } - uow.complete(); - } - catch( Exception e ) - { - e.printStackTrace(); - throw new UndeclaredThrowableException( e ); - } - finally - { - uow.discard(); - try - { - lock.unlock(); - } - catch( IllegalMonitorStateException e ) - { - // ignore, as it may happen on certain exceptions. - } - } - } - - private void processException( Schedule schedule, RuntimeException ex ) - { - Throwable exception = ex; - while( exception instanceof UndeclaredThrowableException ) - { - exception = ( (UndeclaredThrowableException) ex ).getUndeclaredThrowable(); - } - schedule.taskCompletedWithException( exception ); - schedule.exceptionCounter().set( schedule.exceptionCounter().get() + 1 ); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/package.html ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/package.html b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/package.html deleted file mode 100644 index a796ce1..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/package.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -

Scheduler Library.

- - \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/schedule/package.html ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/schedule/package.html b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/schedule/package.html deleted file mode 100644 index 7c74250..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/schedule/package.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -

Scheduler Schedules.

- - \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/Timeline.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/Timeline.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/Timeline.java deleted file mode 100644 index 1c2e7e7..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/Timeline.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2010-2012, Paul Merlin. - * Copyright (c) 2012, Niclas Hedhman. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -import java.time.ZonedDateTime; -import org.apache.zest.api.unitofwork.concern.UnitOfWorkPropagation; - -/** - * Timeline allow to browse in past and future Task runs. - */ -// START SNIPPET: timeline -public interface Timeline -{ -// END SNIPPET: timeline - - /** - * @param maxResults Maximum number of TimelineRecord to compute - * - * @return Last past records - */ - @UnitOfWorkPropagation( UnitOfWorkPropagation.Propagation.MANDATORY ) -// START SNIPPET: timeline - Iterable getLastRecords( int maxResults ); -// END SNIPPET: timeline - - /** - * @param maxResults Maximum number of TimelineRecord to compute - * - * @return Next running or future records - */ - @UnitOfWorkPropagation( UnitOfWorkPropagation.Propagation.MANDATORY ) -// START SNIPPET: timeline - Iterable getNextRecords( int maxResults ); -// END SNIPPET: timeline - - /** - * @param from Lower limit - * @param to Upper limit - * - * @return Records between the given dates - */ - @UnitOfWorkPropagation( UnitOfWorkPropagation.Propagation.MANDATORY ) -// START SNIPPET: timeline - Iterable getRecords( ZonedDateTime from, ZonedDateTime to ); -// END SNIPPET: timeline - - /** - * @param from Lower limit - * @param to Upper limit - * - * @return Records between the given dates - */ - @UnitOfWorkPropagation( UnitOfWorkPropagation.Propagation.MANDATORY ) -// START SNIPPET: timeline - Iterable getRecords( long from, long to ); -} -// END SNIPPET: timeline http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineForScheduleConcern.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineForScheduleConcern.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineForScheduleConcern.java deleted file mode 100644 index 2ec856d..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineForScheduleConcern.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2012, Niclas Hedhman. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -import java.io.BufferedOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.util.List; -import org.apache.zest.api.concern.ConcernOf; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.injection.scope.This; -import org.apache.zest.api.structure.Module; -import org.apache.zest.api.value.ValueBuilder; -import org.apache.zest.library.scheduler.Schedule; - -public abstract class TimelineForScheduleConcern - extends ConcernOf - implements Schedule -{ - @This - private TimelineScheduleState state; - - @Structure - private Module module; - - @Override - public void taskStarting() - { - addRecord( TimelineRecordStep.STARTED, "" ); - next.taskStarting(); - } - - @Override - public void taskCompletedSuccessfully() - { - addRecord( TimelineRecordStep.SUCCESS, "" ); - next.taskCompletedSuccessfully(); - } - - @Override - public void taskCompletedWithException( Throwable ex ) - { - TimelineRecordStep step = TimelineRecordStep.FAILURE; - String details = "Exception occurred:" + getStackTrace( ex ); - addRecord( step, details ); - next.taskCompletedWithException( ex ); - } - - private void addRecord( TimelineRecordStep step, String details ) - { - ValueBuilder builder = module.newValueBuilder( TimelineRecord.class ); - TimelineRecord prototype = builder.prototype(); - prototype.step().set( step ); - prototype.taskName().set( task().get().name().get() ); - List tags = task().get().tags().get(); - prototype.taskTags().set( tags ); - prototype.timestamp().set( System.currentTimeMillis() ); - prototype.scheduleIdentity().set( this.identity().get() ); - prototype.details().set( details ); - TimelineRecord record = builder.newInstance(); - List timelineRecords = state.history().get(); - timelineRecords.add( record ); - state.history().set( timelineRecords ); - } - - private String getStackTrace( Throwable ex ) - { - ByteArrayOutputStream baos = new ByteArrayOutputStream( 1000 ); - BufferedOutputStream out = new BufferedOutputStream( baos ); - PrintStream print = new PrintStream( out ); - ex.printStackTrace( print ); - print.flush(); - return baos.toString(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecord.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecord.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecord.java deleted file mode 100644 index 1c7c304..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecord.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2010-2012, Paul Merlin. - * Copyright (c) 2012, Niclas Hedhman. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -import java.util.List; -import org.apache.zest.api.common.UseDefaults; -import org.apache.zest.api.entity.Queryable; -import org.apache.zest.api.mixin.Mixins; -import org.apache.zest.api.property.Property; -import org.apache.zest.api.value.ValueComposite; -import org.apache.zest.library.scheduler.Scheduler; - -/** - * Record in {@link Scheduler}'s {@link Timeline}. - * - * {@link TimelineRecord}s are {@link Comparable} regarding their {@link TimelineRecord#timestamp()}. - */ -@Mixins( TimelineRecord.Mixin.class ) -public interface TimelineRecord - extends Comparable, ValueComposite -{ - /** - * @return Identity of the associated {@link Scheduler} - */ - Property scheduleIdentity(); - - /** - * @return Timestamp of this record - */ - Property timestamp(); - - /** - * @return Name of the associated {@link org.apache.zest.library.scheduler.Task} - */ - Property taskName(); - - /** - * @return Tags of the associated {@link org.apache.zest.library.scheduler.Task} - */ - @UseDefaults - Property> taskTags(); - - Property step(); - - /** - * @return Details text of this record - */ - @Queryable( false ) - @UseDefaults - Property details(); - - abstract class Mixin - implements TimelineRecord - { - - @Override - public int compareTo( TimelineRecord o ) - { - return timestamp().get().compareTo( o.timestamp().get() ); - } - } - -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecordStep.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecordStep.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecordStep.java deleted file mode 100644 index e1110ce..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineRecordStep.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2012, Paul Merlin. - * Copyright (c) 2012, Niclas Hedhman. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -public enum TimelineRecordStep -{ - STARTED, - SUCCESS, - FAILURE, - FUTURE -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleMixin.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleMixin.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleMixin.java deleted file mode 100644 index 01d9628..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleMixin.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2012, Niclas Hedhman. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -import java.time.ZonedDateTime; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.injection.scope.This; -import org.apache.zest.api.structure.Module; -import org.apache.zest.api.value.ValueBuilder; -import org.apache.zest.library.scheduler.Schedule; - -public class TimelineScheduleMixin - implements Timeline -{ - @Structure - private Module module; - - @This - private TimelineScheduleState state; - - @This - private Schedule me; - - @Override - public Iterable getLastRecords( int maxResults ) - { - List timelineRecords = state.history().get(); - int size = timelineRecords.size(); - if( size < maxResults ) - { - return Collections.unmodifiableCollection( timelineRecords ); - } - SortedSet result = new TreeSet<>(); - for( int i = size - maxResults; i < size; i++ ) - { - result.add( timelineRecords.get( i ) ); - } - return result; - } - - @Override - public Iterable getNextRecords( int maxResults ) - { - SortedSet result = new TreeSet<>(); - long time = System.currentTimeMillis(); - for( int i = 0; i < maxResults; i++ ) - { - time = me.nextRun( time ); - result.add( createFutureRecord( time ) ); - } - return result; - } - - @Override - public Iterable getRecords( ZonedDateTime from, ZonedDateTime to ) - { - return getRecords( from.toInstant().toEpochMilli(), to.toInstant().toEpochMilli() ); - } - - @Override - public Iterable getRecords( long from, long to ) - { - long now = System.currentTimeMillis(); - SortedSet result = new TreeSet<>(); - result.addAll( getPastRecords( from ) ); - result.addAll( getFutureRecords( now, to ) ); - return result; - } - - private Collection getPastRecords( long from ) - { - SortedSet result = new TreeSet<>(); - List timelineRecords = state.history().get(); - for( TimelineRecord record : timelineRecords ) - { - Long timestamp = record.timestamp().get(); - if( timestamp >= from ) - { - result.add( record ); - } - } - return result; - } - - private Collection getFutureRecords( long now, long to ) - { - if( now > to ) - { - return Collections.emptyList(); - } - - SortedSet result = new TreeSet<>(); - long time = now; - while( time <= to ) - { - time = me.nextRun( time ); - if( time <= to ) - { - result.add( createFutureRecord( time ) ); - } - } - return result; - } - - private TimelineRecord createFutureRecord( long when ) - { - ValueBuilder builder = module.newValueBuilder( TimelineRecord.class ); - TimelineRecord prototype = builder.prototype(); - prototype.step().set( TimelineRecordStep.FUTURE ); - prototype.taskName().set( me.task().get().name().get() ); - List tags = me.task().get().tags().get(); - prototype.taskTags().set( tags ); - prototype.timestamp().set( when ); - prototype.scheduleIdentity().set( me.identity().get() ); - prototype.details().set( "" ); - return builder.newInstance(); - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleState.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleState.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleState.java deleted file mode 100644 index c6ff172..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineScheduleState.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2012, Niclas Hedhman. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -import java.util.List; -import org.apache.zest.api.common.UseDefaults; -import org.apache.zest.api.property.Property; - -public interface TimelineScheduleState -{ - @UseDefaults - Property> history(); -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineSchedulerServiceMixin.java ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineSchedulerServiceMixin.java b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineSchedulerServiceMixin.java deleted file mode 100644 index d04934c..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/TimelineSchedulerServiceMixin.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2012, Niclas Hedhman. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zest.library.scheduler.timeline; - -import java.time.ZonedDateTime; -import java.util.SortedSet; -import java.util.TreeSet; -import org.apache.zest.api.injection.scope.Structure; -import org.apache.zest.api.injection.scope.This; -import org.apache.zest.api.service.ServiceComposite; -import org.apache.zest.api.structure.Module; -import org.apache.zest.functional.Iterables; -import org.apache.zest.library.scheduler.SchedulerService; -import org.apache.zest.library.scheduler.SchedulesHandler; -import org.apache.zest.library.scheduler.Schedule; -import org.apache.zest.library.scheduler.internal.Schedules; - -/** - * WARN TimelineService Mixin use SortedSets to keep records ordered and repeatedly search for the next run. - * Could be greedy with large intervals - */ -public abstract class TimelineSchedulerServiceMixin - implements Timeline, ServiceComposite -{ - @Structure - private Module module; - - @This - private SchedulerService scheduler; - - @This - private SchedulesHandler schedulesHandler; - - @Override - public Iterable getLastRecords( int maxResults ) - { - SortedSet result = new TreeSet<>(); - - Schedules schedules = schedulesHandler.getActiveSchedules(); - for( Schedule schedule : schedules.schedules() ) - { - Timeline timeline = (Timeline) schedule; - Iterable lastRecords = timeline.getLastRecords( maxResults ); - Iterables.addAll( result, lastRecords ); - } - return Iterables.limit( maxResults, Iterables.reverse( result ) ); - } - - @Override - public Iterable getNextRecords( int maxResults ) - { - SortedSet result = new TreeSet<>(); - Schedules schedules = schedulesHandler.getActiveSchedules(); - for( Schedule schedule : schedules.schedules() ) - { - Timeline timeline = (Timeline) schedule; - Iterable lastRecords = timeline.getNextRecords( maxResults ); - Iterables.addAll( result, lastRecords ); - } - return Iterables.limit( maxResults, result ); - } - - @Override - public Iterable getRecords( ZonedDateTime from, ZonedDateTime to ) - { - SortedSet result = new TreeSet<>(); - - Schedules schedules = schedulesHandler.getActiveSchedules(); - for( Schedule schedule : schedules.schedules() ) - { - Timeline timeline = (Timeline) schedule; - Iterable lastRecords = timeline.getRecords( from, to ); - Iterables.addAll( result, lastRecords ); - } - return result; - } - - @Override - public Iterable getRecords( long from, long to ) - { - SortedSet result = new TreeSet<>(); - - Schedules schedules = schedulesHandler.getActiveSchedules(); - for( Schedule schedule : schedules.schedules() ) - { - Timeline timeline = (Timeline) schedule; - Iterable lastRecords = timeline.getRecords( from, to ); - Iterables.addAll( result, lastRecords ); - } - return result; - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/551c04d5/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/package.html ---------------------------------------------------------------------- diff --git a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/package.html b/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/package.html deleted file mode 100644 index 1b757d2..0000000 --- a/libraries/scheduler/src/main/java/org/apache/zest/library/scheduler/timeline/package.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -

Scheduler Timeline.

- - \ No newline at end of file