in uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/configuration/jp/JmxAEProcessInitMonitor.java [72:236]
public void run() {
if ( running ) {
return; // the process is in Running state
}
try {
// create an ObjectName with UIMA As JMS naming convention to
// enable
// finding deployed uima components.
ObjectName uimaServicePattern = new ObjectName(
"org.apache.uima:*");
// "org.apache.uima:type=ee.jms.services,*");
// Fetch UIMA AS MBean names from JMX Server that match above
// name pattern
Set<ObjectInstance> mbeans = new HashSet<ObjectInstance>(
server.queryMBeans(uimaServicePattern, null));
List<IUimaPipelineAEComponent> componentsToDelete = new ArrayList<IUimaPipelineAEComponent>();
boolean updateAgent = 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;
}
StringBuffer sb = new StringBuffer();
// int partCount = 0;
// compose component name from jmx ObjectName
for (String part : aeObjectNameParts) {
// partCount++;
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(aeStateList,
// sb.toString())) == 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);
updateAgent = true;
} else {
// continue publishing AE state while the AE is
// initializing
if (AnalysisEngineManagement.State
.valueOf(proxy.getState())
.equals(AnalysisEngineManagement.State.Initializing)) {
updateAgent = 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);
updateAgent = 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 ( agent != null && agent.logger != null ) {
agent.logger.debug(
"UimaAEJmxMonitor.run()",
null,
"---- 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 (updateAgent && !running ) {
if ( agent != null && agent.logger != null ) {
agent.logger.debug("UimaAEJmxMonitor.run()", null,
"---- Publishing UimaPipelineAEComponent List - size="
+ aeStateList.size());
}
try {
if ( agent != null ) {
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 ( agent != null && agent.logger != null ) {
agent.logger.info("UimaAEJmxMonitor.run()", null, e);
}
howManySeenSoFar = 1;
throw e;
}
howManySeenSoFar++;
} else {
// AE not fully initialized yet, ignore the exception
}
} catch (Throwable e) {
howManySeenSoFar = 1;
agent.logger.info("UimaAEJmxMonitor.run()", null, e);
}
}