public void run()

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);
    }
  }