Hi,

the solution to your problem is easy: change the last argument when
you add your job from 'true' to 'false'. This boolean instructs the
scheduler if a job can run concurrently. If false, the scheduler will
only start a new job if the previous has finished.
If you schedule a job to run every minute but your job takes longer
than 1 minute, than you run into this potential problem - but with
canRunConcurrently set to 'false' this is nicely handled for you

Regards
Carsten

2011/8/5 sam ” <[email protected]>:
> Hey,
>
> I am using org.apache.sling.commons.scheduler.Scheduler   to run a job with
> run() method, every 60 seconds.
>
> Looking at log, it looks like there are 5 threads accessing run() method..
> 05.08.2011 11:18:46.084 *DEBUG* [pool-1-thread-1]
> com.example.RemoteFeedService Finishing run() in RemoteFeedService
> 05.08.2011 11:18:46.084 *DEBUG* [pool-1-thread-5]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
> 05.08.2011 11:18:46.084 *DEBUG* [pool-1-thread-2]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
> 05.08.2011 11:18:46.085 *DEBUG* [pool-1-thread-3]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
> 05.08.2011 11:18:46.085 *DEBUG* [pool-1-thread-4]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
> 05.08.2011 11:18:46.085 *DEBUG* [pool-1-thread-3]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
> 05.08.2011 11:18:46.086 *DEBUG* [pool-1-thread-2]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
> 05.08.2011 11:19:03.928 *DEBUG* [pool-1-thread-5]
> com.example.RemoteFeedService Starting run() in RemoteFeedService
>
>
> I am registering the job to Scheduler as the following:
>    @Activate
>    private void activate(Map<String, ?> config) throws Exception {
>
>        isEnabled = OsgiUtil.toBoolean(config.get(IS_ENABLED), false);
>        schedPeriod = OsgiUtil.toLong(config.get(SCHEDULE_PERIOD), 0);
>
>        removeJob();
>        if (isEnabled && schedPeriod > 0) {
>            scheduler.addPeriodicJob(JOB_NAME, this, null, schedPeriod,
> true);
>        }
>    }
>    private void removeJob() {
>        try {
>            scheduler.removeJob(JOB_NAME);
>        } catch (final NoSuchElementException e) {
>            LOG.info("No job to remove: " + JOB_NAME);
>        }
>    }
>
>
>
> I want only one thread to run   run() method every minute.
> And, if previous run() haven't finished yet the next minute, it should not
> run...
>
> I tried  synchronized:
> public synchronized void run() {
> ...
>
>
> But then it seems like there's deadlock...
>
>
> 1.  why are there 5 threads accessing run() ?
> 2. how can i limit the number of threads for Scheduler  (for this job only)?
> 3. how can I make run() method into critical section? (only one thread
> executes it.  while a thread is executing it, no other thread can execute
> it..)
>



-- 
Carsten Ziegeler
[email protected]

Reply via email to