You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by jo...@apache.org on 2021/12/23 15:57:03 UTC
[sling-site] 01/01: add details how to specify the threadpool which is used
This is an automated email from the ASF dual-hosted git repository.
joerghoh pushed a commit to branch improvement/schedule-threadpools
in repository https://gitbox.apache.org/repos/asf/sling-site.git
commit 3b8f4514e62c082ad5a95960449f5461f96002b8
Author: Joerg Hoh <jh...@adobe.com>
AuthorDate: Thu Dec 23 16:56:50 2021 +0100
add details how to specify the threadpool which is used
---
.../bundles/scheduler-service-commons-scheduler.md | 66 ++++++++++++++--------
1 file changed, 42 insertions(+), 24 deletions(-)
diff --git a/src/main/jbake/content/documentation/bundles/scheduler-service-commons-scheduler.md b/src/main/jbake/content/documentation/bundles/scheduler-service-commons-scheduler.md
index 9df811f..bd14ad8 100644
--- a/src/main/jbake/content/documentation/bundles/scheduler-service-commons-scheduler.md
+++ b/src/main/jbake/content/documentation/bundles/scheduler-service-commons-scheduler.md
@@ -1,4 +1,4 @@
-title=Scheduler Service (commons scheduler)
+title=Scheduler Service (commons scheduler)
type=page
status=published
tags=scheduling
@@ -10,19 +10,19 @@ The scheduler is a service for scheduling other services/jobs (it uses the [open
The notion of Job used in this context is a different one than the one used for <a href="/documentation/bundles/apache-sling-eventing-and-job-handling.html">Sling Jobs</a>. The main difference is that a scheduler's job is not persisted.
</div>
-## Examples of jobs that are scheduled by leveraging the whiteboard pattern
+## Examples of jobs that are scheduled by leveraging the whiteboard pattern
The following examples show you how to define and schedule a job by leveraging the whiteboard pattern.
### Scheduling with a cron expression
-The cron expression format is described in the [Quartz Cron Documentation](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-06.html) and requires either 6 or 7 fields separated by white space. The first field always indicates the second (not the minute).
+The cron expression format is described in the [Quartz Cron Documentation](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-06.html) and requires either 6 or 7 fields separated by white space. The first field always indicates the second (not the minute).
The following job is executed every minute by setting *scheduler.expression* to the cron expression `0 * * * * ?`:
package sling.docu.examples;
-
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.felix.scr.annotations.Component;
@@ -33,10 +33,10 @@ The following job is executed every minute by setting *scheduler.expression* to
@Service(value = Runnable.class)
@Property( name = "scheduler.expression", value = "0 * * * * ?")
public class ScheduledCronJob implements Runnable {
-
+
/** Default log. */
protected final Logger log = LoggerFactory.getLogger(this.getClass());
-
+
public void run() {
log.info("Executing a cron job (job#1) through the whiteboard pattern");
}
@@ -44,27 +44,27 @@ The following job is executed every minute by setting *scheduler.expression* to
}
-### Scheduling at periodic times
+### Scheduling at periodic times
The following job is executed every ten seconds by setting *scheduler.period* to *10*:
package sling.docu.examples;
-
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.felix.scr.annotations.Property;
-
+
@Component
@Service(value = Runnable.class)
@Property( name = "scheduler.period", longValue = 10)
public class ScheduledPeriodicJob implements Runnable {
-
+
/** Default log. */
protected final Logger log = LoggerFactory.getLogger(this.getClass());
-
+
public void run() {
log.info("Executing a perodic job (job#2) through the whiteboard pattern");
}
@@ -82,7 +82,7 @@ By default, jobs can be concurrently executed. To prevent this, set the *schedul
### Scheduling the job just once in a cluster
If the same code/same services is executed on multiple nodes within a cluster, the same job might be scheduled on each instance. If this is not desired, the job can either be bound to the leader of the topology or a single instance (which one this is, is not further defined):
-
+
@Property(name="scheduler.runOn", value="LEADER");
or
@@ -150,34 +150,34 @@ The code implementing a service that simultaneously executes the job based on 3
package sling.docu.examples;
-
+
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
-
+
import org.apache.sling.commons.scheduler.Scheduler;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
-
+
/**
* This service executes scheduled jobs
- *
+ *
*/
@Component
public class HelloWorldScheduledService {
-
+
/** Default log. */
protected final Logger log = LoggerFactory.getLogger(this.getClass());
-
+
/** The scheduler for rescheduling jobs. */
@Reference
private Scheduler scheduler;
-
-
+
+
protected void activate(ComponentContext componentContext) throws Exception {
//case 1: with addJob() method: executes the job every minute
String schedulingExpression = "0 * * * * ?";
@@ -194,7 +194,7 @@ The code implementing a service that simultaneously executes the job based on 3
} catch (Exception e) {
job1.run();
}
-
+
//case 2: with addPeriodicJob(): executes the job every 3 minutes
String jobName2 = "case2";
long period = 180;
@@ -209,7 +209,7 @@ The code implementing a service that simultaneously executes the job based on 3
} catch (Exception e) {
job2.run();
}
-
+
//case 3: with fireJobAt(): executes the job at a specific date (date of deployment + delay of 30 seconds)
String jobName3 = "case3";
final long delay = 30*1000;
@@ -227,13 +227,31 @@ The code implementing a service that simultaneously executes the job based on 3
job3.run();
}
}
-
+
protected void deactivate(ComponentContext componentContext) {
log.info("Deactivated, goodbye!");
}
-
+
}
+## Using dedicated thread pools
+
+By default all scheduled jobs use the default thread pool of Sling (as provided by [Apache Sling Commons Thread Pool](/documentation/bundles/apache-sling-commons-thread-pool.html)). But it also possible to specify that a different thread pool is used. This requires 2 steps: The thread pool must be explicitly allowed to be used and then the job must be configured to be used. An optional 3rd step is to configure the thread pool.
+
+### Allow a thread pool to be used by the scheduler
+You need to add the name of the threadpool to the OSGI property ```allowedPoolNames``` of the "Apache Sling Scheduler" service (pid: ``` org.apache.sling.commons.scheduler.impl.QuartzScheduler```).
+
+
+### Specify the name of the thread pool when scheduling a job
+The way how you configure the thread pool to use depends on the way you schedule the job.
+
+If you use the whiteboard pattern, just add an additional property to the definition:
+
+ @property(name=Scheduler.PROPERTY_SCHEDULER_THREAD_POOL,value="my-thread-pool")
+to the other annotations.
+If you use the scheduler API, you can specify the thread pool name via [SchedulingOptions.threadPoolName()](https://sling.apache.org/apidocs/sling11/org/apache/sling/commons/scheduler/ScheduleOptions.html#threadPoolName-java.lang.String-).
+### Configure the thread pool
+By default the Scheduler will create [Thread Pools](/documentation/bundles/apache-sling-commons-thread-pool.html) with default settings (5 threads at maximum). But you can also configure them explicitly and adjust them to your needs; for this you need to instantiate the "Apache Sling Thread Pool Configuration" service factory and provide the name of the thread-pool as value of the OSGI property ```name```.