/**
 *
 * Copyright (c) 2006-2018, Speedment, Inc. 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 com.speedment.runtime.core.internal.component;

import com.speedment.common.injector.State;
import com.speedment.common.injector.annotation.ExecuteBefore;
import com.speedment.runtime.core.component.StatisticsReporterComponent;
import com.speedment.runtime.core.component.StatisticsReporterSchedulerComponent;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author Per Minborg
 */
public class StatisticsReporterSchedulerComponentImpl implements StatisticsReporterSchedulerComponent {

    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(r -> {
        final Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }); // Make the threads daemon to allow speedment applications to exit via main method completion Fix #322 

    @ExecuteBefore(State.STARTED)
    public void start(StatisticsReporterComponent src) {
        scheduler.submit(src::reportStarted);
        scheduler.scheduleAtFixedRate(src::alive, 1, 1, TimeUnit.HOURS);
    }

    @ExecuteBefore(State.STOPPED)
    public void stop(StatisticsReporterComponent src) {
        scheduler.submit(src::reportStopped);
        try {
            scheduler.awaitTermination(2, TimeUnit.SECONDS);
        } catch (InterruptedException ie) {
            System.out.println("Unable to terminate " + StatisticsReporterSchedulerComponentImpl.class.getSimpleName());
            throw new RuntimeException(ie);
        } finally {
            scheduler.shutdownNow();
        }
    }

}

@@ -724,16 +724,72 @@
 .State;%0A
+import com.speedment.common.injector.annotation.Config;%0A
 import c
@@ -1277,46 +1277,247 @@
     
-private final ScheduledExecutorService
+@Config(name = %22statistics.scheduler.enabled%22, value = %22true%22)%0A    private boolean enabled;%0A%0A    private ScheduledExecutorService scheduler;%0A%0A    @ExecuteBefore(State.INITIALIZED)%0A    public void init() %7B%0A        if (enabled) %7B%0A           
  sch
@@ -1575,16 +1575,24 @@
 (r -%3E %7B%0A
+        
         
@@ -1631,16 +1631,24 @@
         
+   
+     
 t.setDae
@@ -1666,16 +1666,24 @@
         
+      
+  
 return t
@@ -1684,16 +1684,24 @@
 turn t;%0A
+        
     %7D); 
@@ -1802,17 +1802,32 @@
 Fix #322
- 
+%0A        %7D%0A    %7D
 %0A%0A    @E
@@ -1903,32 +1903,59 @@
 omponent src) %7B%0A
+        if (enabled) %7B%0A    
         schedule
@@ -1980,24 +1980,28 @@
 rtStarted);%0A
+    
         sche
@@ -2057,24 +2057,34 @@
 nit.HOURS);%0A
+        %7D%0A
     %7D%0A%0A    @
@@ -2160,32 +2160,59 @@
 omponent src) %7B%0A
+        if (enabled) %7B%0A    
         schedule
@@ -2253,14 +2253,22 @@
     
+   
+ 
 try %7B%0A
+    
     
@@ -2332,16 +2332,20 @@
         
+ 
+   
 %7D catch 
@@ -2368,24 +2368,28 @@
 ption ie) %7B%0A
+    
             
@@ -2497,16 +2497,20 @@
 ame());%0A
+    
         
@@ -2553,16 +2553,20 @@
         
+    
 %7D finall
@@ -2565,24 +2565,28 @@
 %7D finally %7B%0A
+    
             
@@ -2610,16 +2610,30 @@
 nNow();%0A
+            %7D%0A
         

Add statistics flag