in uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/jmx/JmxAEProcessInitMonitor.java [81:226]
public void run() {
if (running) {
return; // the process is in Running state
}
try {
// create an ObjectName with UIMA JMX naming convention to
// enable
// finding deployed uima components.
ObjectName uimaServicePattern = new ObjectName("org.apache.uima:*");
// Fetch UIMA MBean names from JMX Server that match above
// name pattern
Set<ObjectInstance> mbeans = new HashSet<>(server.queryMBeans(uimaServicePattern, null));
List<IUimaPipelineAEComponent> componentsToDelete = new ArrayList<>();
boolean updateMonitor = false;
for (ObjectInstance instance : mbeans) {
String targetName = instance.getObjectName().getKeyProperty("name");
if (targetName.endsWith("FlowController") || targetName.trim().endsWith("DUCC.Job")) { // skip
// FC
continue;
}
// Only interested in AEs
if (instance.getClassName()
.equals("org.apache.uima.analysis_engine.impl.AnalysisEngineManagementImpl")) {
String[] aeObjectNameParts = instance.getObjectName().toString().split(",");
if (aeObjectNameParts.length == 3) {
// this is uima aggregate MBean. Skip it. We only
// care about this
// aggregate's pipeline components.
continue;
}
StringBuilder sb = new StringBuilder();
// compose component name from jmx ObjectName
for (String part : aeObjectNameParts) {
if (part.startsWith("org.apache.uima:type") || part.startsWith("s=")) {
continue; // skip service name part of the name
} else {
sb.append("/");
if (part.endsWith("Components")) {
part = part.substring(0, part.indexOf("Components")).trim();
}
sb.append(part.substring(part.indexOf("=") + 1));
}
}
// Fetch a proxy to the AE Management object which holds
// AE stats
AnalysisEngineManagement proxy = JMX.newMBeanProxy(server, instance.getObjectName(),
AnalysisEngineManagement.class);
IUimaPipelineAEComponent aeState = null;
if ((aeState = getUimaAeByName(sb.toString())) == null) {
// Not interested in AEs that are in a Ready State
if (AnalysisEngineManagement.State.valueOf(proxy.getState())
.equals(AnalysisEngineManagement.State.Ready)) {
continue;
}
aeState = new UimaPipelineAEComponent(sb.toString(), proxy.getThreadId(),
AnalysisEngineManagement.State.valueOf(proxy.getState()));
aeStateList.add(aeState);
((UimaPipelineAEComponent) aeState).startInitialization = System.currentTimeMillis();
aeState.setAeState(AnalysisEngineManagement.State.Initializing);
updateMonitor = true;
} else {
// continue publishing AE state while the AE is
// initializing
if (AnalysisEngineManagement.State.valueOf(proxy.getState())
.equals(AnalysisEngineManagement.State.Initializing)) {
updateMonitor = true;
aeState.setInitializationTime(System.currentTimeMillis()
- ((UimaPipelineAEComponent) aeState).startInitialization);
// publish state if the AE just finished
// initializing and is now in Ready state
} else if (aeState.getAeState().equals(AnalysisEngineManagement.State.Initializing)
&& AnalysisEngineManagement.State.valueOf(proxy.getState())
.equals(AnalysisEngineManagement.State.Ready)) {
aeState.setAeState(AnalysisEngineManagement.State.Ready);
updateMonitor = true;
synchronized (this) {
try {
wait(5);
} catch (InterruptedException ex) {
}
}
aeState.setInitializationTime(proxy.getInitializationTime());
// AE reached ready state we no longer need to
// publish its state
componentsToDelete.add(aeState);
}
}
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE,
"UimaAEJmxMonitor.run()---- AE Name:" + proxy.getName() + " AE State:"
+ proxy.getState() + " AE init time=" + aeState.getInitializationTime()
+ " Proxy Init time=" + proxy.getInitializationTime()
+ " Proxy Thread ID:" + proxy.getThreadId());
}
}
}
howManySeenSoFar = 1; // reset error counter
if (updateMonitor && !running) {
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE,
"UimaAEJmxMonitor.run() ---- Publishing UimaPipelineAEComponent List - size="
+ aeStateList.size());
}
try {
if (monitor != null) {
StringBuilder sb = new StringBuilder();
for (IUimaPipelineAEComponent ae : aeStateList) {
sb.append("[").append(ae.getAeName()).append(",").append(ae.getAeState()).append(",")
.append(ae.getInitializationTime()).append(",").append(ae.getAeThreadId())
.append("]");
}
Properties initState = new Properties();
initState.setProperty("SERVICE_UIMA_INIT_STATE", sb.toString());
monitor.onStateChange(initState);
// agent.notify(false, aeStateList);
}
} catch (Exception ex) {
throw ex;
} finally {
// remove components that reached Ready state
for (IUimaPipelineAEComponent aeState : componentsToDelete) {
aeStateList.remove(aeState);
}
}
}
} catch (UndeclaredThrowableException e) {
if (!(e.getCause() instanceof InstanceNotFoundException)) {
if (howManySeenSoFar > 3) { // allow up three errors of this
// kind
if (logger.isLoggable(Level.INFO)) {
logger.log(Level.INFO, "", e);
}
howManySeenSoFar = 1;
throw e;
}
howManySeenSoFar++;
} else {
// AE not fully initialized yet, ignore the exception
}
} catch (Throwable e) {
howManySeenSoFar = 1;
logger.log(Level.WARNING, "", e);
}
}