You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2017/05/05 08:00:47 UTC

svn commit: r1793978 - in /sling/trunk/bundles/commons/scheduler/src: main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java

Author: cziegeler
Date: Fri May  5 08:00:47 2017
New Revision: 1793978

URL: http://svn.apache.org/viewvc?rev=1793978&view=rev
Log:
SLING-5387 : Provide support for running singleton jobs on non leader cluster nodes also

Modified:
    sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java
    sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java

Modified: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java?rev=1793978&r1=1793977&r2=1793978&view=diff
==============================================================================
--- sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java (original)
+++ sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java Fri May  5 08:00:47 2017
@@ -19,6 +19,7 @@
 package org.apache.sling.commons.scheduler.impl;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -55,6 +56,17 @@ public class WebConsolePrinter {
     @Reference
     private QuartzScheduler scheduler;
 
+    public static final class JobInfo {
+        public String name;
+        public String className;
+        public String description;
+        public String reason;
+        public boolean concurrent;
+        public String runOn;
+        public String[] triggers;
+        public Long bundleId;
+        public Long serviceId;
+    }
     /**
      * Print out the configuration
      * @see org.apache.felix.webconsole.ConfigurationPrinter#printConfiguration(java.io.PrintWriter)
@@ -76,54 +88,51 @@ public class WebConsolePrinter {
                     pw.print  ("Id        : ");
                     pw.println(s.getSchedulerInstanceId());
                     pw.println();
-                    final List<String> groups = s.getJobGroupNames();
-                    for(final String group : groups) {
+                    final List<JobInfo> activeJobs = new ArrayList<>();
+                    final List<JobInfo> disabledJobs = new ArrayList<>();
+                    for(final String group : s.getJobGroupNames()) {
                         final Set<JobKey> keys = s.getJobKeys(GroupMatcher.jobGroupEquals(group));
                         for(final JobKey key : keys) {
                             final JobDetail detail = s.getJobDetail(key);
                             final QuartzJobExecutor.JobDesc desc = new QuartzJobExecutor.JobDesc(detail.getJobDataMap());
                             // only print jobs started through the sling scheduler
                             if ( desc.isKnownJob() ) {
-                                pw.print("Job : ");
-                                pw.print(desc.name);
-                                if ( detail.getDescription() != null && detail.getDescription().length() > 0 ) {
-                                    pw.print(" (");
-                                    pw.print(detail.getDescription());
-                                    pw.print(")");
-                                }
-                                pw.print(", class: ");
-                                pw.print(desc.job.getClass().getName());
-                                pw.print(", concurrent: ");
-                                pw.print(!detail.isConcurrentExectionDisallowed());
+                                final JobInfo info = new JobInfo();
+                                info.name = desc.name;
+                                info.className = desc.job.getClass().getName();
+                                info.concurrent = !detail.isConcurrentExectionDisallowed();
+                                // check run on information
                                 if ( desc.runOn != null ) {
-                                    pw.print(", runOn: ");
-                                    pw.print(Arrays.toString(desc.runOn));
-                                    // check run on information
+                                    if ( desc.isRunOnLeader() ) {
+                                        info.runOn = "LEADER";
+                                    } else if ( desc.isRunOnSingle() ) {
+                                        info.runOn = "SINGLE";
+                                    } else {
+                                        info.runOn = Arrays.toString(desc.runOn);
+                                    }
                                     if ( desc.isRunOnLeader() || desc.isRunOnSingle() ) {
                                         if ( QuartzJobExecutor.DISCOVERY_AVAILABLE.get() ) {
                                             if ( QuartzJobExecutor.DISCOVERY_INFO_AVAILABLE.get() ) {
                                                 if ( desc.isRunOnLeader() || QuartzJobExecutor.FORCE_LEADER.get() ) {
                                                     if ( !QuartzJobExecutor.IS_LEADER.get() ) {
-                                                        pw.print(" (inactive: not leader)");
+                                                        info.reason = "not leader";
                                                     }
                                                 } else {
                                                     final String id = desc.shouldRunAsSingleOn();
                                                     if ( id != null ) {
-                                                        pw.print(" (inactive: single distributed elsewhere ");
-                                                        pw.print(id);
-                                                        pw.print(")");
+                                                        info.reason = "single distributed elsewhere " + id;
                                                     }
                                                 }
                                             } else {
-                                                pw.print(" (inactive: no discovery info)");
+                                                info.reason = "no discovery info";
                                             }
                                         } else {
-                                            pw.print(" (inactive: no discovery)");
+                                            info.reason = "no discovery";
                                         }
                                     } else { // sling IDs
                                         final String myId = QuartzJobExecutor.SLING_ID;
                                         if ( myId == null ) {
-                                            pw.print(" (inactive: no Sling settings)");
+                                            info.reason = "no Sling settings";
                                         } else {
                                             boolean schedule = false;
                                             for(final String id : desc.runOn ) {
@@ -133,30 +142,45 @@ public class WebConsolePrinter {
                                                 }
                                             }
                                             if ( !schedule ) {
-                                                pw.print(" (inactive: Sling ID)");
+                                                info.reason = "Sling ID";
                                             }
                                         }
-                                    }                            }
-                                final Long bundleId = (Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_BUNDLE_ID);
-                                if ( bundleId != null ) {
-                                    pw.print(", bundleId: ");
-                                    pw.print(String.valueOf(bundleId));
+                                    }
                                 }
-                                final Long serviceId = (Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_SERVICE_ID);
-                                if ( serviceId != null ) {
-                                    pw.print(", serviceId: ");
-                                    pw.print(String.valueOf(serviceId));
+                                info.bundleId = (Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_BUNDLE_ID);
+                                info.serviceId = (Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_SERVICE_ID);
+                                int index = 0;
+                                final List<? extends Trigger> triggers = s.getTriggersOfJob(key);
+                                info.triggers = new String[triggers.size()];
+                                for(final Trigger trigger : triggers) {
+                                    info.triggers[index] = trigger.toString();
+                                    index++;
                                 }
-                                pw.println();
-                                for(final Trigger trigger : s.getTriggersOfJob(key)) {
-                                    pw.print("Trigger : ");
-                                    pw.print(trigger);
-                                    pw.println();
+
+                                if ( info.reason != null ) {
+                                    disabledJobs.add(info);
+                                } else {
+                                    activeJobs.add(info);
                                 }
-                                pw.println();
                             }
                         }
                     }
+                    if ( !activeJobs.isEmpty() ) {
+                        pw.println();
+                        pw.println("Active Jobs");
+                        pw.println("-----------");
+                        for(final JobInfo info : activeJobs) {
+                            print(pw, info);
+                        }
+                    }
+                    if ( !disabledJobs.isEmpty() ) {
+                        pw.println();
+                        pw.println("Inactive Jobs");
+                        pw.println("-------------");
+                        for(final JobInfo info : disabledJobs) {
+                            print(pw, info);
+                        }
+                    }
                 } catch ( final SchedulerException se ) {
                     pw.print  ("Unable to print complete configuration: ");
                     pw.println(se.getMessage());
@@ -168,4 +192,41 @@ public class WebConsolePrinter {
         }
         pw.println();
     }
+
+    private void print(final PrintWriter pw, final JobInfo info) {
+        pw.print("Job : ");
+        pw.print(info.name);
+        if ( info.description != null ) {
+            pw.print(" (");
+            pw.print(info.description);
+            pw.print(")");
+        }
+        pw.print(", class: ");
+        pw.print(info.className);
+        pw.print(", concurrent: ");
+        pw.print(info.concurrent);
+        if ( info.runOn != null ) {
+            pw.print(", runOn: ");
+            pw.print(info.runOn);
+        }
+        if ( info.bundleId != null ) {
+            pw.print(", bundleId: ");
+            pw.print(String.valueOf(info.bundleId));
+        }
+        if ( info.serviceId != null ) {
+            pw.print(", serviceId: ");
+            pw.print(String.valueOf(info.serviceId));
+        }
+        pw.println();
+        if ( info.reason != null ) {
+            pw.print("Reason: ");
+            pw.println(info.reason);
+        }
+        for(final String trigger : info.triggers) {
+            pw.print("Trigger : ");
+            pw.print(trigger);
+            pw.println();
+        }
+        pw.println();
+    }
 }

Modified: sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java?rev=1793978&r1=1793977&r2=1793978&view=diff
==============================================================================
--- sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java (original)
+++ sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java Fri May  5 08:00:47 2017
@@ -73,6 +73,9 @@ public class WebConsolePrinterTest {
             assertRegexp(reader.readLine(), ".*ThreadPool.*testName.*");
             assertRegexp(reader.readLine(), ".*Id.*");
             reader.readLine();
+            reader.readLine();
+            assertRegexp(reader.readLine(), ".*Active.*Jobs.*");
+            reader.readLine();
             assertRegexp(reader.readLine(), "^Job.*testName[123].*");
             assertRegexp(reader.readLine(), "^Trigger.*Trigger.*DEFAULT.testName[123].*");
             reader.readLine();