}
protected void notifyOnTimout(CAS aCAS, String anEndpoint, int aTimeoutKind, String casReferenceId) {
ProcessTrace pt = new ProcessTrace_impl();
UimaASProcessStatusImpl status = new UimaASProcessStatusImpl(pt, casReferenceId);
switch (aTimeoutKind) {
case (MetadataTimeout):
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(),
"notifyOnTimout", JmsConstants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAJMS_meta_timeout_INFO", new Object[] { anEndpoint });
}
status.addEventStatus("GetMeta", "Failed", new UimaASMetaRequestTimeout());
notifyListeners(null, status, AsynchAEMessage.GetMeta);
abort = true;
getMetaSemaphore.release();
break;
case (PingTimeout):
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(),
"notifyOnTimout", JmsConstants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAJMS_meta_timeout_INFO", new Object[] { anEndpoint });
}
status.addEventStatus("Ping", "Failed", new UimaASPingTimeout());
notifyListeners(null, status, AsynchAEMessage.Ping);
// The main thread could be stuck waiting for a CAS. Grab any CAS in the
// client cache and release it so that we can shutdown.
if (!clientCache.isEmpty()) {
ClientRequest anyCasRequest = clientCache.elements().nextElement();
if (anyCasRequest.getCAS() != null) {
anyCasRequest.getCAS().release();
}
}
abort = true;
break;
case (CpCTimeout):
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(),
"notifyOnTimout", JmsConstants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAJMS_cpc_timeout_INFO", new Object[] { anEndpoint });
}
status.addEventStatus("CpC", "Failed", new UimaASCollectionProcessCompleteTimeout());
// release the semaphore acquired in collectionProcessingComplete()
cpcReplySemaphore.release();
notifyListeners(null, status, AsynchAEMessage.CollectionProcessComplete);
break;
case (ProcessTimeout):
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(),
"notifyOnTimout", JmsConstants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAJMS_process_timeout_INFO", new Object[] { anEndpoint });
}
ClientRequest cachedRequest = (ClientRequest) clientCache.get(casReferenceId);
if (cachedRequest == null) {
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
// if missing for any reason ...
UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(),
"handleProcessReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAJMS_received_expired_msg_INFO",
new Object[] { anEndpoint, casReferenceId });
}
return;
}
// Store the total latency for this CAS. The departure time is set right before the CAS
// is sent to a service.
cachedRequest.setTimeWaitingForReply(System.nanoTime()
- cachedRequest.getCASDepartureTime());
// mark timeout exception
cachedRequest.setTimeoutException();
if (cachedRequest.isSynchronousInvocation()) {
// Signal a thread that we received a reply, if in the map
if (threadMonitorMap.containsKey(cachedRequest.getThreadId())) {
ThreadMonitor threadMonitor = (ThreadMonitor) threadMonitorMap.get(cachedRequest
.getThreadId());
// Unblock the sending thread so that it can complete processing with an error
if (threadMonitor != null) {
threadMonitor.getMonitor().release();
cachedRequest.setReceivedProcessCasReply(); // should not be needed
}
}
} else {
// notify the application listener with the error
if ( serviceDelegate.isPingTimeout()) {
exc = new UimaASProcessCasTimeout(new UimaASPingTimeout());
serviceDelegate.resetPingTimeout();
} else {
exc = new UimaASProcessCasTimeout();
}
status.addEventStatus("Process", "Failed", exc);
notifyListeners(aCAS, status, AsynchAEMessage.Process);
}
cachedRequest.removeEntry(casReferenceId);
serviceDelegate.removeCasFromOutstandingList(casReferenceId);
// Check if all replies have been received