/** * Adds the current thread to the watchdog, enforcing the time-out configured for the service and request type. * * @param serviceId * service identifier (e.g. "wms-ad"), must not be <code>null</code> * @param requestType * request (e.g. "GetMap"), must not be <code>null</code> */ public void watchCurrentThread( final String serviceId, final String requestType ) { final WatchedRequest request = watchedRequestFactory.create( serviceId, requestType ); if ( request != null ) { daemon.watch( request ); } }
/** * Removes the request associated with the current thread from the watchdog. */ public void unwatchCurrentThread() { daemon.unwatch(); }
private void unwatchTimeout() { if ( requestWatchdog != null ) { requestWatchdog.unwatchCurrentThread(); } }
private void initRequestWatchdog( final List<RequestTimeoutMilliseconds> timeoutConfigs ) { requestWatchdog = new RequestWatchdog( timeoutConfigs ); requestWatchdog.init(); }
WatchedRequest create( final String serviceId, final String request ) { final String key = getKey( serviceId, request ); final Long timeout = keyToMillis.get( key ); if ( timeout != null ) { long startTimeInMillis = System.currentTimeMillis(); long stopTimeInMillis = startTimeInMillis + timeout; return new WatchedRequest( Thread.currentThread(), stopTimeInMillis, startTimeInMillis, serviceId, request ); } return null; }
private void interruptTimedOutRequests() { final List<WatchedRequest> activeRequests = new ArrayList<WatchedRequest>( threadToRequest.values() ); LOG.debug( "Checking for timed-out requests. Number of active requests: " + activeRequests.size() ); final long currentTimeMillis = System.currentTimeMillis(); for ( final WatchedRequest request : activeRequests ) { if ( currentTimeMillis > request.getStopTimeInMillis() ) { LOG.info( "Request " + request + " timed-out. Interrupting request thread." ); request.getThread().interrupt(); } } }
/** * Adds a request to be watched for time-outs. * * @param request * request to watch, must not be <code>null</code> */ void watch( final WatchedRequest request ) { threadToRequest.put( request.getThread(), request ); }
/** * Creates a new {@link RequestWatchdog} for the given time-out configuration. * * @param timeoutConfigs * time-outs values per request type and service */ public RequestWatchdog( final List<RequestTimeoutMilliseconds> timeoutConfigs ) { daemonThread = new Thread( daemon, "RequestWatchdog" ); daemonThread.setDaemon( true ); watchedRequestFactory = new WatchedRequestFactory( timeoutConfigs ); }
@Override public void run() { LOG.debug( "Starting main loop" ); while ( true ) { interruptTimedOutRequests(); try { Thread.sleep( CHECK_INTERVAL_MILLIS ); } catch ( InterruptedException e ) { LOG.debug( "Interrupted. Exiting" ); return; } } }
private void destroyWorkspace() { LOG.info( "--------------------------------------------------------------------------------" ); LOG.info( "Destroying workspace" ); LOG.info( "--------------------------------------------------------------------------------" ); workspace.destroyAll(); if ( requestWatchdog != null ) { requestWatchdog.destroy(); } LOG.info( "" ); }
WatchedRequestFactory( final List<RequestTimeoutMilliseconds> timeoutConfigs ) { for ( RequestTimeoutMilliseconds timeoutConfig : timeoutConfigs ) { final String key = getKey( timeoutConfig.getServiceId(), timeoutConfig.getRequest() ); final long millis = timeoutConfig.getValue().longValue(); keyToMillis.put( key, millis ); } }
private void watchTimeout( final OWS ows, final String requestName ) { if ( requestWatchdog != null ) { final String serviceId = ows.getMetadata().getIdentifier().getId(); requestWatchdog.watchCurrentThread( serviceId, requestName ); } }