You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/11/14 05:37:24 UTC

[2/6] zest-java git commit: ZEST-128 - Fixed up Scheduler library so that schedules are not lost. Tried to introduce better separation of concerns. Added counters for Execution and Exceptions.

http://git-wip-us.apache.org/repos/asf/zest-java/blob/02491a34/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/FooTask.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/FooTask.java b/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/FooTask.java
index f4a5243..63fbee4 100644
--- a/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/FooTask.java
+++ b/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/FooTask.java
@@ -18,13 +18,17 @@
 package org.apache.zest.library.scheduler;
 
 import org.apache.zest.api.common.Optional;
+import org.apache.zest.api.common.UseDefaults;
 import org.apache.zest.api.entity.Identity;
 import org.apache.zest.api.injection.scope.This;
 import org.apache.zest.api.mixin.Mixins;
 import org.apache.zest.api.property.Property;
+import org.apache.zest.api.unitofwork.concern.UnitOfWorkPropagation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.zest.api.unitofwork.concern.UnitOfWorkPropagation.Propagation.REQUIRES_NEW;
+
 @Mixins( FooTask.Mixin.class )
 public interface FooTask
     extends Task, Identity
@@ -34,10 +38,12 @@ public interface FooTask
     @Optional
     Property<String> output();
 
-    public static abstract class Mixin
-        implements Runnable
-    {
+    @UseDefaults
+    Property<Integer> runCounter();
 
+    abstract class Mixin
+        implements Task
+    {
         private static final Logger LOGGER = LoggerFactory.getLogger( FooTask.class );
 
         @This
@@ -47,6 +53,12 @@ public interface FooTask
         public void run()
         {
             LOGGER.info( "FooTask.run({})", me.input().get() );
+            synchronized( this )
+            {
+                me.runCounter().set( me.runCounter().get() + 1 );
+                LOGGER.info( "Identity: " + me.identity().get() );
+                LOGGER.info( " Counter: " + me.runCounter().get() );
+            }
             if( me.input().get().equals( Constants.BAZAR ) )
             {
                 if( me.output().get() == null )
@@ -60,5 +72,4 @@ public interface FooTask
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/02491a34/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/SchedulerTest.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/SchedulerTest.java b/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/SchedulerTest.java
index 550eff9..b74279c 100644
--- a/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/SchedulerTest.java
+++ b/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/SchedulerTest.java
@@ -19,9 +19,6 @@
 package org.apache.zest.library.scheduler;
 
 import java.util.concurrent.Callable;
-import org.joda.time.DateTime;
-import org.joda.time.Interval;
-import org.junit.Test;
 import org.apache.zest.api.common.Visibility;
 import org.apache.zest.api.unitofwork.UnitOfWork;
 import org.apache.zest.api.unitofwork.UnitOfWorkCompletionException;
@@ -30,18 +27,23 @@ import org.apache.zest.api.usecase.UsecaseBuilder;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.library.scheduler.bootstrap.SchedulerAssembler;
+import org.apache.zest.library.scheduler.schedule.Schedule;
 import org.apache.zest.library.scheduler.timeline.Timeline;
+import org.joda.time.DateTime;
+import org.joda.time.Interval;
+import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static com.jayway.awaitility.Awaitility.await;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.zest.functional.Iterables.count;
 import static org.apache.zest.library.scheduler.Constants.BAR;
 import static org.apache.zest.library.scheduler.Constants.BAZAR;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
 
 public class SchedulerTest
     extends AbstractSchedulerTest
@@ -52,8 +54,12 @@ public class SchedulerTest
     protected void onAssembly( ModuleAssembly testAssembly )
         throws AssemblyException
     {
+        @SuppressWarnings( "UnnecessaryLocalVariable" )
         ModuleAssembly moduleAssembly = testAssembly;
+
+        @SuppressWarnings( "UnnecessaryLocalVariable" )
         ModuleAssembly configModuleAssembly = testAssembly;
+
         // START SNIPPET: assembly
         new SchedulerAssembler().visibleIn( Visibility.application )
             .withConfig( configModuleAssembly, Visibility.layer )
@@ -78,6 +84,7 @@ public class SchedulerTest
         try( UnitOfWork uow = module.newUnitOfWork( usecase ) )
         {
             FooTask task = uow.get( FooTask.class, taskId );
+            assertThat( task.runCounter().get(), equalTo( 1 ) );
             assertThat( task.output().get(), equalTo( BAR ) );
         }
     }
@@ -98,7 +105,7 @@ public class SchedulerTest
             taskIdentity = task.identity().get();
 
             DateTime expectedRun = start.withMillisOfSecond( 0 ).withSecondOfMinute( 0 ).plusMinutes( 1 );
-            scheduler.scheduleCron( task, "@minutely", true );
+            scheduler.scheduleCron( task, "@minutely" );
 
             uow.complete();
 
@@ -106,10 +113,11 @@ public class SchedulerTest
             LOGGER.info( "Task scheduled on {} to be run at {}", start.getMillis(), expectedRun.getMillis() );
         }
 
-        await( usecase.name() ).
-            atMost( sleepMillis + 5000, MILLISECONDS ).
-            until( taskOutput( taskIdentity ), equalTo( BAR ) );
+        await( usecase.name() )
+            .atMost( sleepMillis + 5000, MILLISECONDS )
+            .until( taskOutput( taskIdentity ), equalTo( 1 ) );
 
+        //noinspection unused
         try( UnitOfWork uow = module.newUnitOfWork( usecase ) )
         {
             Timeline timeline = module.findService( Timeline.class ).get();
@@ -135,38 +143,65 @@ public class SchedulerTest
 
     @Test
     public void testOnce()
-        throws UnitOfWorkCompletionException
+        throws UnitOfWorkCompletionException, InterruptedException
     {
+        System.setProperty( "zest.entity.print.state", Boolean.TRUE.toString() );
         final Usecase usecase = UsecaseBuilder.newUsecase( "TestOnce" );
         final String taskIdentity;
+        Scheduler scheduler = module.findService( Scheduler.class ).get();
+
+        Schedule schedule1;
+        Schedule schedule2;
+        Schedule schedule3;
+        Schedule schedule4;
         try( UnitOfWork uow = module.newUnitOfWork( usecase ) )
         {
-            Scheduler scheduler = module.findService( Scheduler.class ).get();
-
             FooTask task = createFooTask( uow, usecase.name(), BAZAR );
             taskIdentity = task.identity().get();
 
-            scheduler.scheduleOnce( task, 2, true );
+            schedule1 = scheduler.scheduleOnce( task, 1 );
+            schedule2 = scheduler.scheduleOnce( task, 2 );
+            schedule3 = scheduler.scheduleOnce( task, 3 );
+            schedule4 = scheduler.scheduleOnce( task, 4 );
 
             uow.complete();
         }
+        Thread.sleep(5000);
+        await( usecase.name() )
+            .atMost( 30, SECONDS )
+            .until( taskOutput( taskIdentity ), equalTo( 4 ) );
 
-        await( usecase.name() ).until( taskOutput( taskIdentity ), equalTo( BAR ) );
+        try( UnitOfWork uow = module.newUnitOfWork( usecase ) )
+        {
+            schedule1 = uow.get( schedule1 );
+            schedule2 = uow.get( schedule2 );
+            schedule3 = uow.get( schedule3 );
+            schedule4 = uow.get( schedule4 );
+            assertThat(schedule1.cancelled().get(), equalTo( false ));
+            assertThat(schedule2.cancelled().get(), equalTo( false ));
+            assertThat(schedule3.cancelled().get(), equalTo( false ));
+            assertThat(schedule4.cancelled().get(), equalTo( false ));
+            assertThat(schedule1.done().get(), equalTo( true ));
+            assertThat(schedule2.done().get(), equalTo( true ));
+            assertThat(schedule3.done().get(), equalTo( true ));
+            assertThat(schedule4.done().get(), equalTo( true ));
+            assertThat(schedule1.running().get(), equalTo( false ));
+            assertThat(schedule2.running().get(), equalTo( false ));
+            assertThat(schedule3.running().get(), equalTo( false ));
+            assertThat(schedule4.running().get(), equalTo( false ));
+        }
     }
 
-    private Callable<String> taskOutput( final String taskIdentity )
+    private Callable<Integer> taskOutput( final String taskIdentity )
     {
-        return new Callable<String>()
-        {
-            @Override
-            public String call()
-                throws Exception
+        return () -> {
+            try( UnitOfWork uow = module.newUnitOfWork() )
             {
-                try( UnitOfWork uow = module.newUnitOfWork() )
-                {
-                    FooTask task = uow.get( FooTask.class, taskIdentity );
-                    return task == null ? null : task.output().get();
-                }
+                FooTask task = uow.get( FooTask.class, taskIdentity );
+                Integer count = task.runCounter().get();
+                System.out.println("Count reached: " + count);
+                uow.discard();
+                return count;
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/02491a34/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/docsupport/SchedulerDocs.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/docsupport/SchedulerDocs.java b/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/docsupport/SchedulerDocs.java
index d0774f5..6de65b7 100644
--- a/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/docsupport/SchedulerDocs.java
+++ b/libraries/scheduler/src/test/java/org/apache/zest/library/scheduler/docsupport/SchedulerDocs.java
@@ -41,7 +41,7 @@ public class SchedulerDocs
     public void method()
     {
         MyTaskEntity myTask = todo();
-        Schedule schedule = scheduler.scheduleOnce( myTask, 10, false );
+        Schedule schedule = scheduler.scheduleOnce( myTask, 10 );
         // myTask will be run in 10 seconds from now
     }