diff options
author | Endi S. Dewata <edewata@redhat.com> | 2013-10-07 11:48:54 -0400 |
---|---|---|
committer | Endi S. Dewata <edewata@redhat.com> | 2013-10-25 17:17:39 -0400 |
commit | 2119f1b218e9d68b13496e7042785d9c68753966 (patch) | |
tree | b8c7cf5692723340d8d56e5d8c401acdee059ca5 /base/common/src/com/netscape/cmscore/connector/Resender.java | |
parent | 7ca5adf1bd5bc4f9a7c5f2035426b9158007bb28 (diff) | |
download | pki-2119f1b218e9d68b13496e7042785d9c68753966.tar.gz pki-2119f1b218e9d68b13496e7042785d9c68753966.tar.xz pki-2119f1b218e9d68b13496e7042785d9c68753966.zip |
Reorganized server packages.
The tomcat, cms, and cmscore packages have been moved from base/common
into separate folders in base/server so that they can be built separately.
Diffstat (limited to 'base/common/src/com/netscape/cmscore/connector/Resender.java')
-rw-r--r-- | base/common/src/com/netscape/cmscore/connector/Resender.java | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/base/common/src/com/netscape/cmscore/connector/Resender.java b/base/common/src/com/netscape/cmscore/connector/Resender.java deleted file mode 100644 index a949b993e..000000000 --- a/base/common/src/com/netscape/cmscore/connector/Resender.java +++ /dev/null @@ -1,260 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2007 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- -package com.netscape.cmscore.connector; - -import java.io.IOException; -import java.util.Enumeration; -import java.util.Vector; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.authority.IAuthority; -import com.netscape.certsrv.base.EBaseException; -import com.netscape.certsrv.connector.IRemoteAuthority; -import com.netscape.certsrv.connector.IResender; -import com.netscape.certsrv.logging.ILogger; -import com.netscape.certsrv.request.IRequest; -import com.netscape.certsrv.request.IRequestList; -import com.netscape.certsrv.request.IRequestQueue; -import com.netscape.certsrv.request.RequestId; -import com.netscape.certsrv.request.RequestStatus; -import com.netscape.cmscore.util.Debug; -import com.netscape.cmsutil.http.JssSSLSocketFactory; - -/** - * Resend requests at intervals to the server to check if it's been completed. - * Default interval is 5 minutes. - */ -public class Resender implements IResender { - public static final int MINUTE = 60; - - protected IAuthority mAuthority = null; - IRequestQueue mQueue = null; - protected IRemoteAuthority mDest = null; - ScheduledExecutorService executorService; - - /* Vector of Request Id *Strings* */ - protected Vector<String> mRequestIds = new Vector<String>(); - - protected HttpConnection mConn = null; - - protected String mNickName = null; - protected boolean connected = false; - - // default interval. - // XXX todo add another interval for requests unsent because server - // was down (versus being serviced in request queue) - protected int mInterval = 1 * MINUTE; - - public Resender(IAuthority authority, String nickName, IRemoteAuthority dest) { - mAuthority = authority; - mQueue = mAuthority.getRequestQueue(); - mDest = dest; - mNickName = nickName; - } - - public Resender( - IAuthority authority, String nickName, - IRemoteAuthority dest, int interval) { - mAuthority = authority; - mQueue = mAuthority.getRequestQueue(); - mDest = dest; - mNickName = nickName; - if (interval > 0) - mInterval = interval; // interval specified in seconds. - } - - // must be done after a subsystem 'start' so queue is initialized. - private void initRequests() { - mQueue = mAuthority.getRequestQueue(); - // get all requests in mAuthority that are still pending. - IRequestList list = - mQueue.listRequestsByStatus(RequestStatus.SVC_PENDING); - - while (list != null && list.hasMoreElements()) { - RequestId rid = list.nextRequestId(); - CMS.debug("added request Id " + rid + " in init to resend queue."); - // note these are added as strings - mRequestIds.addElement(rid.toString()); - } - } - - public void addRequest(IRequest r) { - synchronized (mRequestIds) { - // note the request ids are added as strings. - mRequestIds.addElement(r.getRequestId().toString()); - } - CMS.debug("added " + r.getRequestId() + " to resend queue"); - } - - public void start(final String name) { - CMS.debug("Starting resender thread with interval " + mInterval); - - // schedule task to run immediately and repeat after specified interval - executorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { - public Thread newThread(Runnable r) { - return new Thread(r, name); - } - }); - executorService.scheduleWithFixedDelay(this, 0, mInterval, TimeUnit.SECONDS); - - } - - public void run() { - if (! CMS.isInRunningState()) - return; - - if (! connected) { - CMS.debug("Connecting ..."); - mConn = new HttpConnection(mDest, new JssSSLSocketFactory(mNickName)); - initRequests(); - connected = true; - } - resend(); - } - - public void stop() { - // shutdown executorService without interrupting running task - if (executorService != null) executorService.shutdown(); - } - - private void resend() { - // clone a seperate list so mRequestIds can be modified - @SuppressWarnings("unchecked") - Vector<String> rids = (Vector<String>) mRequestIds.clone(); - Vector<RequestId> completedRids = new Vector<RequestId>(); - - // resend each request to CA to ping for status. - Enumeration<String> enum1 = rids.elements(); - - while (enum1.hasMoreElements()) { - // request ids are added as strings. - String ridString = enum1.nextElement(); - RequestId rid = new RequestId(ridString); - IRequest r = null; - - CMS.debug( - "resend processing request id " + rid); - - try { - r = mQueue.findRequest(rid); - } catch (EBaseException e) { - // XXX bad case. should we remove the rid now ? - mAuthority.log(ILogger.LL_WARN, - CMS.getLogMessage("CMSCORE_CONNECTOR_REQUEST_NOT_FOUND", rid.toString())); - continue; - } - try { - if (r.getRequestStatus() != RequestStatus.SVC_PENDING) { - // request not pending anymore - aborted or cancelled. - completedRids.addElement(rid); - CMS.debug( - "request id " + rid + " no longer service pending"); - } else { - boolean completed = send(r); - - if (completed) { - completedRids.addElement(rid); - mAuthority.log(ILogger.LL_INFO, - CMS.getLogMessage("CMSCORE_CONNECTOR_REQUEST_COMPLETED", rid.toString())); - } - } - } catch (IOException e) { - mAuthority.log(ILogger.LL_WARN, - CMS.getLogMessage("CMSCORE_CONNECTOR_REQUEST_ERROR", rid.toString(), e.toString())); - } catch (EBaseException e) { - // if connection is down, don't send the remaining request - // as it will sure fail. - mAuthority.log(ILogger.LL_WARN, CMS.getLogMessage("CMSCORE_CONNECTOR_DOWN")); - if (e.toString().indexOf("connection not available") >= 0) - break; - } - } - - // remove completed ones from list so they won't be resent. - Enumeration<RequestId> en = completedRids.elements(); - - synchronized (mRequestIds) { - while (en.hasMoreElements()) { - RequestId id = en.nextElement(); - - CMS.debug( - "Connector: Removed request " + id + " from re-send queue"); - mRequestIds.removeElement(id.toString()); - CMS.debug( - "Connector: mRequestIds now has " + - mRequestIds.size() + " elements."); - } - } - } - - // this is almost the same as connector's send. - private boolean send(IRequest r) - throws IOException, EBaseException { - - try { - HttpPKIMessage tomsg = new HttpPKIMessage(); - HttpPKIMessage replymsg = null; - - tomsg.fromRequest(r); - replymsg = (HttpPKIMessage) mConn.send(tomsg); - if (replymsg == null) - return false; - CMS.debug( - r.getRequestId() + " resent to CA"); - - RequestStatus replyStatus = - RequestStatus.fromString(replymsg.reqStatus); - int index = replymsg.reqId.lastIndexOf(':'); - RequestId replyRequestId = - new RequestId(replymsg.reqId.substring(index + 1)); - - if (Debug.ON) - Debug.trace("reply request id " + replyRequestId + - " for request " + r.getRequestId()); - - if (replyStatus != RequestStatus.COMPLETE) { - CMS.debug("resend " + - r.getRequestId() + " still not completed."); - return false; - } - - // request was completed. copy relevant contents. - replymsg.toRequest(r); - if (Debug.ON) - Debug.trace("resend request id was completed " + r.getRequestId()); - mQueue.markAsServiced(r); - mQueue.releaseRequest(r); - CMS.debug( - "resend released request " + r.getRequestId()); - return true; - } catch (EBaseException e) { - // same as not having sent it, so still want to resend. - mAuthority.log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_CONNECTOR_RESEND_ERROR", r.getRequestId().toString(), e.toString())); - if (e.toString().indexOf("Connection refused by peer") > 0) - throw new EBaseException("connection not available"); - } - return false; - - } - -} |