summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEndi Sukma Dewata <edewata@redhat.com>2012-02-27 14:58:24 -0600
committerEndi Sukma Dewata <edewata@redhat.com>2012-03-12 09:39:31 -0500
commit34f141c1144dac37248cf404835248413218627e (patch)
tree19b5b599f1eed47d020ec542c19bafdd84b1d57f
parent87585b101172461d2ad175515154a3f4dbdcd089 (diff)
downloadpki-34f141c1144dac37248cf404835248413218627e.tar.gz
pki-34f141c1144dac37248cf404835248413218627e.tar.xz
pki-34f141c1144dac37248cf404835248413218627e.zip
Refactored JobsScheduler.
The JobsScheduler has been modified to stop all jobs on shutdown. This is done by setting a flag in each job instead of stopping the job thread abruptly. Long running jobs should check this flag periodically and then exit gracefully. None of the existing jobs need to do this since they do not run very long. Other threads that run background services have been converted into daemons such that they will terminate automatically when the JVM exits. Ticket #73
-rw-r--r--pki/base/common/src/com/netscape/certsrv/jobs/IJob.java12
-rw-r--r--pki/base/common/src/com/netscape/cms/jobs/AJobBase.java22
-rw-r--r--pki/base/common/src/com/netscape/cms/jobs/PublishCertsJob.java9
-rw-r--r--pki/base/common/src/com/netscape/cms/jobs/RenewalNotificationJob.java2
-rw-r--r--pki/base/common/src/com/netscape/cms/jobs/RequestInQueueJob.java2
-rw-r--r--pki/base/common/src/com/netscape/cms/jobs/UnpublishExpiredJob.java2
-rw-r--r--pki/base/common/src/com/netscape/cmscore/apps/CMSEngine.java2
-rw-r--r--pki/base/common/src/com/netscape/cmscore/dbs/CertificateRepository.java7
-rw-r--r--pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java48
9 files changed, 51 insertions, 55 deletions
diff --git a/pki/base/common/src/com/netscape/certsrv/jobs/IJob.java b/pki/base/common/src/com/netscape/certsrv/jobs/IJob.java
index 3683b1f09..5584d68ff 100644
--- a/pki/base/common/src/com/netscape/certsrv/jobs/IJob.java
+++ b/pki/base/common/src/com/netscape/certsrv/jobs/IJob.java
@@ -91,4 +91,16 @@ public interface IJob {
* @return configuration store
*/
public IConfigStore getConfigStore();
+
+ /**
+ * Request the job to stop gracefully. The job may not stop immediately.
+ */
+ public void stop();
+
+ /**
+ * Check whether the job has been asked to stop. Long running jobs should call
+ * this method occasionally inside the run() method and exit gracefully if it
+ * returns true.
+ */
+ public boolean isStopped();
}
diff --git a/pki/base/common/src/com/netscape/cms/jobs/AJobBase.java b/pki/base/common/src/com/netscape/cms/jobs/AJobBase.java
index 4a70147de..0da5d2028 100644
--- a/pki/base/common/src/com/netscape/cms/jobs/AJobBase.java
+++ b/pki/base/common/src/com/netscape/cms/jobs/AJobBase.java
@@ -74,6 +74,8 @@ public abstract class AJobBase implements IJob, Runnable {
protected Hashtable<String, Object> mContentParams = new Hashtable<String, Object>();
protected Hashtable<String, Object> mItemParams = new Hashtable<String, Object>();
+ boolean stopped;
+
public AJobBase() {
}
@@ -209,17 +211,17 @@ public abstract class AJobBase implements IJob, Runnable {
protected void buildItemParams(X509CertImpl cert) {
mItemParams.put(IEmailFormProcessor.TOKEN_SERIAL_NUM,
- (Object) cert.getSerialNumber().toString());
+ cert.getSerialNumber().toString());
mItemParams.put(IEmailFormProcessor.TOKEN_HEX_SERIAL_NUM,
- (Object) cert.getSerialNumber().toString(16));
+ cert.getSerialNumber().toString(16));
mItemParams.put(IEmailFormProcessor.TOKEN_ISSUER_DN,
- (Object) cert.getIssuerDN().toString());
+ cert.getIssuerDN().toString());
mItemParams.put(IEmailFormProcessor.TOKEN_SUBJECT_DN,
- (Object) cert.getSubjectDN().toString());
+ cert.getSubjectDN().toString());
mItemParams.put(IEmailFormProcessor.TOKEN_NOT_AFTER,
- (Object) cert.getNotAfter().toString());
+ cert.getNotAfter().toString());
mItemParams.put(IEmailFormProcessor.TOKEN_NOT_BEFORE,
- (Object) cert.getNotBefore().toString());
+ cert.getNotBefore().toString());
// ... and more
}
@@ -288,4 +290,12 @@ public abstract class AJobBase implements IJob, Runnable {
mLogger.log(ILogger.EV_SYSTEM, null, ILogger.S_OTHER,
level, mId + ": " + msg, multiline);
}
+
+ public void stop() {
+ stopped = true;
+ }
+
+ public boolean isStopped() {
+ return stopped;
+ }
}
diff --git a/pki/base/common/src/com/netscape/cms/jobs/PublishCertsJob.java b/pki/base/common/src/com/netscape/cms/jobs/PublishCertsJob.java
index 903f83691..2289d7255 100644
--- a/pki/base/common/src/com/netscape/cms/jobs/PublishCertsJob.java
+++ b/pki/base/common/src/com/netscape/cms/jobs/PublishCertsJob.java
@@ -17,7 +17,6 @@
// --- END COPYRIGHT BLOCK ---
package com.netscape.cms.jobs;
-import java.security.cert.X509Certificate;
import java.text.DateFormat;
import java.util.Date;
import java.util.Enumeration;
@@ -135,7 +134,7 @@ public class PublishCertsJob extends AJobBase
}
mReqQ = mCa.getRequestQueue();
- mRepository = (ICertificateRepository) mCa.getCertificateRepository();
+ mRepository = mCa.getCertificateRepository();
mPublisherProcessor = mCa.getPublisherProcessor();
// read from the configuration file
@@ -299,7 +298,7 @@ public class PublishCertsJob extends AJobBase
try {
if ((mPublisherProcessor != null) &&
mPublisherProcessor.enabled()) {
- mPublisherProcessor.publishCert((X509Certificate) cert, req);
+ mPublisherProcessor.publishCert(cert, req);
if (mSummary == true)
buildItemParams(IEmailFormProcessor.TOKEN_STATUS,
STATUS_SUCCESS);
@@ -322,7 +321,7 @@ public class PublishCertsJob extends AJobBase
try {
if ((mPublisherProcessor != null) &&
mPublisherProcessor.enabled()) {
- mPublisherProcessor.publishCert((X509Certificate) cert, null);
+ mPublisherProcessor.publishCert(cert, null);
if (mSummary == true)
buildItemParams(IEmailFormProcessor.TOKEN_STATUS,
@@ -396,6 +395,6 @@ public class PublishCertsJob extends AJobBase
* @return String array of configuration parameter names.
*/
public String[] getConfigParams() {
- return (mConfigParams);
+ return mConfigParams;
}
}
diff --git a/pki/base/common/src/com/netscape/cms/jobs/RenewalNotificationJob.java b/pki/base/common/src/com/netscape/cms/jobs/RenewalNotificationJob.java
index 621d987fe..5a14c6278 100644
--- a/pki/base/common/src/com/netscape/cms/jobs/RenewalNotificationJob.java
+++ b/pki/base/common/src/com/netscape/cms/jobs/RenewalNotificationJob.java
@@ -275,7 +275,7 @@ public class RenewalNotificationJob
return;
}
- mCertDB = (ICertificateRepository) mCA.getCertificateRepository();
+ mCertDB = mCA.getCertificateRepository();
mCron = mConfig.getString(IJobCron.PROP_CRON);
if (mCron == null) {
diff --git a/pki/base/common/src/com/netscape/cms/jobs/RequestInQueueJob.java b/pki/base/common/src/com/netscape/cms/jobs/RequestInQueueJob.java
index adddc9755..775845ca7 100644
--- a/pki/base/common/src/com/netscape/cms/jobs/RequestInQueueJob.java
+++ b/pki/base/common/src/com/netscape/cms/jobs/RequestInQueueJob.java
@@ -213,6 +213,6 @@ public class RequestInQueueJob extends AJobBase
* @return String array of configuration parameter names.
*/
public String[] getConfigParams() {
- return (mConfigParams);
+ return mConfigParams;
}
}
diff --git a/pki/base/common/src/com/netscape/cms/jobs/UnpublishExpiredJob.java b/pki/base/common/src/com/netscape/cms/jobs/UnpublishExpiredJob.java
index c61d953eb..63cae7f30 100644
--- a/pki/base/common/src/com/netscape/cms/jobs/UnpublishExpiredJob.java
+++ b/pki/base/common/src/com/netscape/cms/jobs/UnpublishExpiredJob.java
@@ -135,7 +135,7 @@ public class UnpublishExpiredJob extends AJobBase
}
mReqQ = mCa.getRequestQueue();
- mRepository = (ICertificateRepository) mCa.getCertificateRepository();
+ mRepository = mCa.getCertificateRepository();
mPublisherProcessor = mCa.getPublisherProcessor();
// read from the configuration file
diff --git a/pki/base/common/src/com/netscape/cmscore/apps/CMSEngine.java b/pki/base/common/src/com/netscape/cmscore/apps/CMSEngine.java
index 6ca1b6e7e..e1981132d 100644
--- a/pki/base/common/src/com/netscape/cmscore/apps/CMSEngine.java
+++ b/pki/base/common/src/com/netscape/cmscore/apps/CMSEngine.java
@@ -1621,8 +1621,6 @@ public class CMSEngine implements ICMSEngine {
shutdownSubsystems(mFinalSubsystems);
shutdownSubsystems(mDynSubsystems);
shutdownSubsystems(mStaticSubsystems);
-
- System.exit(0);
}
/**
diff --git a/pki/base/common/src/com/netscape/cmscore/dbs/CertificateRepository.java b/pki/base/common/src/com/netscape/cmscore/dbs/CertificateRepository.java
index 0d004d335..c563a3a45 100644
--- a/pki/base/common/src/com/netscape/cmscore/dbs/CertificateRepository.java
+++ b/pki/base/common/src/com/netscape/cmscore/dbs/CertificateRepository.java
@@ -245,6 +245,7 @@ public class CertificateRepository extends Repository
}
if (mResults != null) {
mRetrieveModificationsThread.setResults(mResults);
+ mRetrieveModificationsThread.setDaemon(true);
mRetrieveModificationsThread.start();
}
}
@@ -254,6 +255,7 @@ public class CertificateRepository extends Repository
CMS.debug("In setCertStatusUpdateInterval about to create CertStatusUpdateThread ");
mCertStatusUpdateThread = new CertStatusUpdateThread(this, requestRepo, "CertStatusUpdateThread");
mCertStatusUpdateThread.setInterval(interval);
+ mCertStatusUpdateThread.setDaemon(true);
mCertStatusUpdateThread.start();
} else {
CMS.debug("In setCertStatusUpdateInterval it thinks the thread is up already ");
@@ -1903,11 +1905,6 @@ public class CertificateRepository extends Repository
}
public void shutdown() {
- //if (mCertStatusUpdateThread != null)
- // mCertStatusUpdateThread.destroy();
-
- //if (mRetrieveModificationsThread != null)
- // mRetrieveModificationsThread.destroy();
}
}
diff --git a/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java b/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java
index 79225a13f..b35f8c340 100644
--- a/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java
+++ b/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java
@@ -118,7 +118,7 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
// register all job plugins
while (mImpls.hasMoreElements()) {
- String id = (String) mImpls.nextElement();
+ String id = mImpls.nextElement();
String pluginPath = c.getString(id + "." + PROP_CLASS);
JobPlugin plugin = new JobPlugin(id, pluginPath);
@@ -131,10 +131,9 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
Enumeration<String> jobs = c.getSubStoreNames();
while (jobs.hasMoreElements()) {
- String jobName = (String) jobs.nextElement();
+ String jobName = jobs.nextElement();
String implName = c.getString(jobName + "." + PROP_PLUGIN);
- JobPlugin plugin =
- (JobPlugin) mJobPlugins.get(implName);
+ JobPlugin plugin = mJobPlugins.get(implName);
if (plugin == null) {
log(ILogger.LL_FAILURE,
@@ -145,10 +144,8 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
String classPath = plugin.getClassPath();
// instantiate and init the job
- IJob job = null;
-
try {
- job = (IJob)
+ IJob job = (IJob)
Class.forName(classPath).newInstance();
IConfigStore jconfig = c.getSubStore(jobName);
@@ -205,7 +202,7 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
// get time now
Calendar cal = Calendar.getInstance();
long rightNow = cal.getTime().getTime();
- long duration = 0;
+ long duration;
long second = cal.get(Calendar.SECOND);
if (second != 1) { // scheduler needs adjustment
@@ -238,6 +235,7 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
System.out.println(e);
}
}
+
// if (duration == 0), it's time
// woke up...
@@ -262,10 +260,8 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
*/
wokeupTime = cal.getTime().getTime();
- IJob job = null;
-
- for (Enumeration<IJob> e = mJobs.elements(); e.hasMoreElements();) {
- job = e.nextElement();
+ for (Enumeration<IJob> e = mJobs.elements(); e.hasMoreElements(); ) {
+ IJob job = e.nextElement();
// is it enabled?
IConfigStore cs = job.getConfigStore();
@@ -285,7 +281,7 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
// log(ILogger.LL_INFO, "show time for: "+job.getId());
// if previous thread still alive, skip
- Thread jthread = (Thread) mJobThreads.get(job.getId());
+ Thread jthread = mJobThreads.get(job.getId());
if ((jthread == null) || (!jthread.isAlive())) {
Thread jobThread = new Thread((Runnable) job, job.getId());
@@ -381,7 +377,7 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
* @return name of the Jobs Scheduler subsystem
*/
public String getId() {
- return (mId);
+ return mId;
}
/**
@@ -419,24 +415,9 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
* <P>
*/
public void shutdown() {
- mJobPlugins.clear();
- mJobPlugins = null;
- mJobs.clear();
- mJobs = null;
-
- Enumeration<String> enums = mJobThreads.keys();
- while (enums.hasMoreElements()) {
- String id = (String) enums.nextElement();
- Thread currthread = (Thread) mJobThreads.get(id);
- //if (currthread != null)
- // currthread.destroy();
+ for (IJob job : mJobs.values()) {
+ job.stop();
}
-
- mJobThreads.clear();
- mJobThreads = null;
-
- //if (mScheduleThread != null)
- // mScheduleThread.destroy();
}
/**
@@ -462,7 +443,7 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
Debug.trace("in getCofigParams()");
// is this a registered implname?
- JobPlugin plugin = (JobPlugin) mJobPlugins.get(implName);
+ JobPlugin plugin = mJobPlugins.get(implName);
if (plugin == null) {
log(ILogger.LL_FAILURE,
@@ -477,13 +458,12 @@ public class JobsScheduler implements Runnable, IJobsScheduler {
// auth manager instantces to avoid instantiation just for this.
// a temporary instance
- IJob jobInst = null;
String className = plugin.getClassPath();
if (Debug.ON)
Debug.trace("className = " + className);
try {
- jobInst = (IJob)
+ IJob jobInst = (IJob)
Class.forName(className).newInstance();
if (Debug.ON)
Debug.trace("class instantiated");