summaryrefslogtreecommitdiffstats
path: root/pki/base/common/src/com/netscape/certsrv/request
diff options
context:
space:
mode:
Diffstat (limited to 'pki/base/common/src/com/netscape/certsrv/request')
-rw-r--r--pki/base/common/src/com/netscape/certsrv/request/ARequestNotifier.java89
-rw-r--r--pki/base/common/src/com/netscape/certsrv/request/IRequestNotifier.java3
-rw-r--r--pki/base/common/src/com/netscape/certsrv/request/IRequestQueue.java4
3 files changed, 91 insertions, 5 deletions
diff --git a/pki/base/common/src/com/netscape/certsrv/request/ARequestNotifier.java b/pki/base/common/src/com/netscape/certsrv/request/ARequestNotifier.java
index bad0a99eb..956a30e26 100644
--- a/pki/base/common/src/com/netscape/certsrv/request/ARequestNotifier.java
+++ b/pki/base/common/src/com/netscape/certsrv/request/ARequestNotifier.java
@@ -19,6 +19,7 @@ package com.netscape.certsrv.request;
import java.util.*;
+import java.math.*;
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.apps.*;
@@ -46,6 +47,9 @@ public class ARequestNotifier implements IRequestNotifier {
private int mPublishingQueuePriority = 0;
private int mMaxPublishingQueuePageSize = 1;
private IRequestQueue mRequestQueue = null;
+ private String mPublishingStatus = null;
+ private int mSavePublishingStatus = 0;
+ private int mSavePublishingCounter = 0;
public ARequestNotifier() {
@@ -60,7 +64,8 @@ public class ARequestNotifier implements IRequestNotifier {
public void setPublishingQueue (boolean isPublishingQueueEnabled,
int publishingQueuePriorityLevel,
int maxNumberOfPublishingThreads,
- int publishingQueuePageSize) {
+ int publishingQueuePageSize,
+ int savePublishingStatus) {
CMS.debug("setPublishingQueue: Publishing Queue Enabled: " + isPublishingQueueEnabled+
" Priority Level: " + publishingQueuePriorityLevel+
" Maximum Number of Threads: " + maxNumberOfPublishingThreads+
@@ -68,6 +73,7 @@ public class ARequestNotifier implements IRequestNotifier {
mIsPublishingQueueEnabled = isPublishingQueueEnabled;
mMaxThreads = maxNumberOfPublishingThreads;
mMaxRequests = publishingQueuePageSize;
+ mSavePublishingStatus = savePublishingStatus;
// Publishing Queue Priority Levels: 2 - maximum, 1 - higher, 0 - normal, -1 - lower, -2 - minimum
if (publishingQueuePriorityLevel > 1) {
@@ -81,6 +87,20 @@ public class ARequestNotifier implements IRequestNotifier {
} else {
mPublishingQueuePriority = Thread.currentThread().getPriority();
}
+
+ if (mCA != null && mRequestQueue == null) mRequestQueue = mCA.getRequestQueue();
+ if (mIsPublishingQueueEnabled && mSavePublishingStatus > 0 && mRequestQueue != null) {
+ mPublishingStatus = mRequestQueue.getPublishingStatus();
+ BigInteger status = new BigInteger("-2");
+ try {
+ status = new BigInteger(mPublishingStatus);
+ if (status.compareTo(BigInteger.ZERO) > -1) {
+ recoverPublishingQueue(mPublishingStatus);
+ }
+ } catch (Exception e) {
+ }
+ }
+
}
/**
@@ -152,6 +172,28 @@ public class ARequestNotifier implements IRequestNotifier {
return mListeners.elements();
}
+
+ private Object publishingCounterMonitor = new Object();
+
+ private void updatePublishingStatus(String id) {
+ if (mRequestQueue != null) {
+ synchronized (publishingCounterMonitor) {
+ if (mSavePublishingCounter == 0) {
+ CMS.debug("updatePublishingStatus requestId: "+id);
+ mRequestQueue.setPublishingStatus(id);
+ }
+ mSavePublishingCounter++;
+ CMS.debug("updatePublishingStatus mSavePublishingCounter: "+mSavePublishingCounter+
+ " mSavePublishingStatus: "+mSavePublishingStatus);
+ if (mSavePublishingCounter >= mSavePublishingStatus) {
+ mSavePublishingCounter = 0;
+ }
+ }
+ } else {
+ CMS.debug("updatePublishingStatus mRequestQueue == null");
+ }
+ }
+
/**
* Gets request from publishing queue.
*
@@ -163,10 +205,12 @@ public class ARequestNotifier implements IRequestNotifier {
CMS.debug("getRequest mRequests=" + mRequests.size() + " mSearchForRequests=" + mSearchForRequests);
if (mSearchForRequests && mRequests.size() == 1) {
+ id = (String)mRequests.elementAt(0);
if (mCA != null && mRequestQueue == null) mRequestQueue = mCA.getRequestQueue();
- if (mRequestQueue != null) {
+ if (id != null && mRequestQueue != null) {
+ CMS.debug("getRequest request id=" + id);
IRequestVirtualList list = mRequestQueue.getPagedRequestsByFilter(
- new RequestId((String)mRequests.elementAt(0)),
+ new RequestId(id),
"(requeststate=complete)", mMaxRequests, "requestId");
int s = list.getSize() - list.getCurrentIndex();
CMS.debug("getRequest list size: "+s);
@@ -191,7 +235,7 @@ public class ARequestNotifier implements IRequestNotifier {
requestType.equals(IRequest.UNREVOCATION_REQUEST))) {
continue;
}
- if (i == 0 && ((String)mRequests.elementAt(0)).equals(r.getRequestId().toString())) {
+ if (i == 0 && id.equals(r.getRequestId().toString())) {
if (s == 1) {
break;
} else {
@@ -221,6 +265,7 @@ public class ARequestNotifier implements IRequestNotifier {
r = mRequestQueue.findRequest(new RequestId(id));
mRequests.remove(0);
CMS.debug("getRequest request "+ id + ((r != null)?" found":" not found"));
+ updatePublishingStatus(id);
} catch (EBaseException e) {
CMS.debug("getRequest EBaseException " + e.toString());
}
@@ -263,6 +308,9 @@ public class ARequestNotifier implements IRequestNotifier {
public void removeNotifierThread(Thread notifierThread) {
if (mNotifierThreads.size() > 0) {
mNotifierThreads.remove(notifierThread);
+ if (mNotifierThreads.size() == 0) {
+ mRequestQueue.setPublishingStatus("-1");
+ }
}
CMS.debug("Number of publishing threads: " + mNotifierThreads.size());
}
@@ -395,6 +443,38 @@ public class ARequestNotifier implements IRequestNotifier {
}
}
}
+
+
+ /**
+ * Recovers publishing queue.
+ *
+ * @param id request request
+ */
+ public void recoverPublishingQueue(String id) {
+ CMS.debug("recoverPublishingQueue mRequests.size()="+mRequests.size()+"("+mMaxRequests+")"+
+ " requests by adding request "+id);
+ if (mRequests.size() == 0) {
+ mRequests.addElement(id);
+ CMS.debug("recoverPublishingQueue extended buffer to "+mRequests.size()+"("+mMaxRequests+")"+
+ " requests by adding request "+id);
+ if (morePublishingThreads()) {
+ mSearchForRequests = true;
+ try {
+ Thread notifierThread = new Thread(new RunListeners((IRequestNotifier)this));
+ if (notifierThread != null) {
+ mNotifierThreads.addElement(notifierThread);
+ CMS.debug("Number of publishing threads: " + mNotifierThreads.size());
+ if (mPublishingQueuePriority > 0) {
+ notifierThread.setPriority(mPublishingQueuePriority);
+ }
+ notifierThread.start();
+ }
+ } catch (Throwable e) {
+ CMS.debug("recoverPublishingQueue exception: " + e.toString());
+ }
+ }
+ }
+ }
}
@@ -438,6 +518,7 @@ class RunListeners implements Runnable {
do {
if (mRequestNotifier != null) mRequest = (IRequest)mRequestNotifier.getRequest();
if (mListeners != null && mRequest != null) {
+ CMS.debug("RunListeners: mRequest = " + mRequest.getRequestId().toString());
while (mListeners.hasMoreElements()) {
IRequestListener l = (IRequestListener) mListeners.nextElement();
CMS.debug("RunListeners: IRequestListener = " + l.getClass().getName());
diff --git a/pki/base/common/src/com/netscape/certsrv/request/IRequestNotifier.java b/pki/base/common/src/com/netscape/certsrv/request/IRequestNotifier.java
index b6af76584..91cb7544a 100644
--- a/pki/base/common/src/com/netscape/certsrv/request/IRequestNotifier.java
+++ b/pki/base/common/src/com/netscape/certsrv/request/IRequestNotifier.java
@@ -126,6 +126,7 @@ public interface IRequestNotifier extends INotify {
public void setPublishingQueue (boolean isPublishingQueueEnabled,
int publishingQueuePriorityLevel,
int maxNumberOfPublishingThreads,
- int publishingQueuePageSize);
+ int publishingQueuePageSize,
+ int savePublishingStatus);
}
diff --git a/pki/base/common/src/com/netscape/certsrv/request/IRequestQueue.java b/pki/base/common/src/com/netscape/certsrv/request/IRequestQueue.java
index 5467b6018..9b2edf9b4 100644
--- a/pki/base/common/src/com/netscape/certsrv/request/IRequestQueue.java
+++ b/pki/base/common/src/com/netscape/certsrv/request/IRequestQueue.java
@@ -407,4 +407,8 @@ public interface IRequestQueue {
* @return request repository
*/
public IRepository getRequestRepository();
+
+ public String getPublishingStatus();
+
+ public void setPublishingStatus(String status);
}