This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 84b86099bbd3f04b68260f671df24d5ba584cf3e
Author: Aaron Radzinski <[email protected]>
AuthorDate: Sun Sep 27 15:30:56 2020 -0700

    WIP.
---
 .../nlp/core/stanford/NCStanfordCoreManager.scala  |  8 ++-
 .../nlp/core/stanford/NCStanfordNerEnricher.scala  |  8 ++-
 .../nlp/core/stanford/NCStanfordParser.scala       |  8 ++-
 nlpcraft/pom.xml                                   |  4 +-
 .../org/apache/nlpcraft/common/NCService.scala     | 79 ++++++++++++++++++----
 .../common/extcfg/NCExternalConfigManager.scala    |  7 +-
 .../common/nlp/core/NCNlpCoreManager.scala         |  8 ++-
 .../nlp/core/opennlp/NCOpenNlpTokenizer.scala      |  8 ++-
 .../common/nlp/dict/NCDictionaryManager.scala      |  7 +-
 .../common/nlp/numeric/NCNumericManager.scala      | 14 +++-
 .../nlpcraft/probe/mgrs/cmd/NCCommandManager.scala |  6 +-
 .../probe/mgrs/conn/NCConnectionManager.scala      | 26 ++-----
 .../mgrs/conversation/NCConversationManager.scala  | 37 +++++-----
 .../probe/mgrs/deploy/NCDeployManager.scala        |  8 ++-
 .../mgrs/dialogflow/NCDialogFlowManager.scala      | 37 +++++-----
 .../probe/mgrs/lifecycle/NCLifecycleManager.scala  |  7 +-
 .../nlpcraft/probe/mgrs/model/NCModelManager.scala |  8 ++-
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  |  8 ++-
 .../dictionary/NCDictionaryEnricher.scala          |  7 +-
 .../mgrs/nlp/enrichers/limit/NCLimitEnricher.scala |  8 ++-
 .../mgrs/nlp/enrichers/model/NCModelEnricher.scala |  6 +-
 .../enrichers/relation/NCRelationEnricher.scala    |  7 +-
 .../mgrs/nlp/enrichers/sort/NCSortEnricher.scala   |  8 ++-
 .../enrichers/stopword/NCStopWordEnricher.scala    |  8 ++-
 .../suspicious/NCSuspiciousNounsEnricher.scala     |  6 +-
 .../mgrs/nlp/validate/NCValidateManager.scala      |  7 +-
 .../nlpcraft/server/company/NCCompanyManager.scala |  7 +-
 .../server/feedback/NCFeedbackManager.scala        |  7 +-
 .../apache/nlpcraft/server/geo/NCGeoManager.scala  |  8 ++-
 .../lifecycle/NCServerLifecycleManager.scala       |  7 +-
 .../server/nlp/core/NCNlpServerManager.scala       |  8 ++-
 .../nlp/core/google/NCGoogleNerEnricher.scala      |  8 ++-
 .../nlp/core/opennlp/NCOpenNlpNerEnricher.scala    |  8 ++-
 .../server/nlp/core/opennlp/NCOpenNlpParser.scala  |  8 ++-
 .../server/nlp/core/spacy/NCSpaCyNerEnricher.scala |  7 +-
 .../nlp/enrichers/NCServerEnrichmentManager.scala  |  8 ++-
 .../nlp/enrichers/basenlp/NCBaseNlpEnricher.scala  |  7 +-
 .../coordinate/NCCoordinatesEnricher.scala         |  8 ++-
 .../server/nlp/enrichers/date/NCDateEnricher.scala |  7 +-
 .../server/nlp/enrichers/geo/NCGeoEnricher.scala   |  8 ++-
 .../nlp/enrichers/numeric/NCNumericEnricher.scala  |  6 +-
 .../nlp/enrichers/quote/NCQuoteEnricher.scala      |  6 +-
 .../enrichers/stopword/NCStopWordEnricher.scala    |  7 +-
 .../server/nlp/preproc/NCPreProcessManager.scala   |  6 +-
 .../server/nlp/spell/NCSpellCheckManager.scala     |  8 ++-
 .../server/nlp/wordnet/NCWordNetManager.scala      |  7 +-
 .../nlpcraft/server/probe/NCProbeManager.scala     | 14 ++--
 .../server/proclog/NCProcessLogManager.scala       |  7 +-
 .../nlpcraft/server/query/NCQueryManager.scala     |  7 +-
 .../nlpcraft/server/rest/NCRestManager.scala       |  8 ++-
 .../apache/nlpcraft/server/sql/NCSqlManager.scala  |  7 +-
 .../server/sugsyn/NCSuggestSynonymManager.scala    |  8 ++-
 .../apache/nlpcraft/server/tx/NCTxManager.scala    |  8 ++-
 .../nlpcraft/server/user/NCUserManager.scala       |  8 ++-
 54 files changed, 381 insertions(+), 177 deletions(-)

diff --git 
a/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
 
b/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
index f5b81a9..efd69e7 100644
--- 
a/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
+++ 
b/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
@@ -41,6 +41,8 @@ object NCStanfordCoreManager extends NCService with 
NCIgniteInstance {
      * @return
      */
     override def start(parent: Span = null): NCService = {
+        ackStarting()
+
         val p = new Properties()
 
         p.setProperty("customAnnotatorClass.nctokenize", 
classOf[NCStanfordAnnotator].getName)
@@ -53,7 +55,7 @@ object NCStanfordCoreManager extends NCService with 
NCIgniteInstance {
             cache = ignite.cache[String, CoreDocument]("stanford-cache")
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -61,9 +63,11 @@ object NCStanfordCoreManager extends NCService with 
NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = {
+        ackStopping()
+
         cache = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordNerEnricher.scala
 
b/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordNerEnricher.scala
index 53719cd..1da87b5 100644
--- 
a/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordNerEnricher.scala
+++ 
b/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordNerEnricher.scala
@@ -36,11 +36,13 @@ object NCStanfordNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgni
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         // Should be started even if another NLP engine configured.
         if (!NCStanfordCoreManager.isStarted)
             NCStanfordCoreManager.start(span)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -48,10 +50,12 @@ object NCStanfordNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgni
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { span ⇒
+        ackStopping()
+
         if (NCStanfordCoreManager.isStarted)
             NCStanfordCoreManager.stop(span)
     
-        ackStop()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordParser.scala
 
b/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordParser.scala
index 646eefc..c7bc898 100644
--- 
a/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordParser.scala
+++ 
b/nlpcraft-stanford/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordParser.scala
@@ -39,11 +39,13 @@ object NCStanfordParser extends NCService with NCNlpParser 
with NCIgniteInstance
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         // Should be started even if another NLP engine configured.
         if (!NCStanfordCoreManager.isStarted)
             NCStanfordCoreManager.start(span)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -51,10 +53,12 @@ object NCStanfordParser extends NCService with NCNlpParser 
with NCIgniteInstance
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { span ⇒
+        ackStopping()
+
         if (NCStanfordCoreManager.isStarted)
             NCStanfordCoreManager.stop(span)
 
-        ackStop()
+        ackStopped()
     }
 
     override def parse(normTxt: String, parent: Span = null): Seq[NCNlpWord] =
diff --git a/nlpcraft/pom.xml b/nlpcraft/pom.xml
index 7789d59..350e7f8 100644
--- a/nlpcraft/pom.xml
+++ b/nlpcraft/pom.xml
@@ -283,8 +283,8 @@
                         <configuration>
                             <!--
                                 Depending on the console config and how maven 
is run this will produce the output with ANSI colors.
-                                To strip out ANSI escape sequences from the 
log file, run the following:
-                                $ cat server-xxxxx.log | sed -r 
"s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g"
+                                To strip out ANSI escape sequences from the 
log file, see the following:
+                                
https://stackoverflow.com/questions/17998978/removing-colors-from-output
                             -->
                             <name>server</name>
                             
<healthcheckUrl>http://localhost:8081/api/v1/health</healthcheckUrl>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
index 2e1be93..66422a6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
@@ -29,16 +29,18 @@ import scala.compat.Platform._
   * extend this class are typically called 'managers'.
   */
 abstract class NCService extends LazyLogging with NCOpenCensusTrace {
-    private val startMs = currentTime
+    @volatile private var timeStampMs = -1L
 
     @volatile private var started = false
+    @volatile private var starting = false
+    @volatile private var stopping = false
     
     private final val clsName = U.cleanClassName(getClass)
     
-    /**
-      * Checks if this service is started.
-      */
-    def isStarted: Boolean = started
+    def isStarted: Boolean = started && !stopping && !starting
+    def isStopped: Boolean = !started && !stopping && !starting
+    def isStarting: Boolean = starting
+    def isStopping: Boolean = stopping
 
     /**
       * Starts this service.
@@ -48,7 +50,7 @@ abstract class NCService extends LazyLogging with 
NCOpenCensusTrace {
     @throws[NCE]
     def start(parent: Span = null): NCService =
         // Make sure this is not called by subclass.
-        throw new AssertionError(s"NCService#start() should not be called 
directly in '${U.cleanClassName(getClass)}' service.")
+        throw new AssertionError(s"NCService#start() should not be called 
directly in '$name' service.")
 
     /**
       * Stops this service.
@@ -58,7 +60,7 @@ abstract class NCService extends LazyLogging with 
NCOpenCensusTrace {
     @throws[NCE]
     def stop(parent: Span = null): Unit =
         // Make sure this is not called by subclass.
-        throw new AssertionError(s"NCService#stop() should not be called 
directly in '${U.cleanClassName(getClass)}' service.")
+        throw new AssertionError(s"NCService#stop() should not be called 
directly in '$name' service.")
 
     /**
      * Gets name of this service (as its class name).
@@ -68,21 +70,62 @@ abstract class NCService extends LazyLogging with 
NCOpenCensusTrace {
     def name: String = clsName
 
     /**
+     * Acks the beginning of this service startup.
+     *
+     * @return This instance.
+     */
+    protected def ackStarting(): NCService = {
+        starting = true
+        timeStampMs = currentTime
+
+        logger.trace("$name staring...")
+
+        addTags(currentSpan(),
+            "state" → "starting"
+        )
+
+        this
+    }
+
+    /**
+     * Acks the beginning of this service shutdown.
+     *
+     * @return This instance.
+     */
+    protected def ackStopping(): NCService = {
+        stopping = true
+        timeStampMs = currentTime
+
+        logger.trace("$name stopping...")
+
+        addTags(currentSpan(),
+            "state" → "stopping"
+        )
+
+        this
+    }
+
+    /**
      * Acks started service. Should be called at the end of the `start()` 
method.
      */
-    protected def ackStart(): NCService = {
+    protected def ackStarted(): NCService = {
         assert(!started, s"Service '$name' is already started.")
+        assert(timeStampMs != -1, "Method 'NCService#ackStarting()' wasn't 
called.")
 
+        starting = false
         started = true
 
-        val dur = s"$ansiBlueFg[${currentTime - startMs}ms]$ansiReset"
-
         addTags(
             currentSpan(),
-            "startDurationMs" → (currentTime - startMs), "state" → started
+            "startDurationMs" → (currentTime - timeStampMs),
+            "state" → "started"
         )
 
-        logger.info(s"$clsName started $dur")
+        val dur = s"$ansiBlueFg[${currentTime - timeStampMs}ms]$ansiReset"
+
+        logger.info(s"$name started $dur")
+
+        timeStampMs = -1L
 
         this
     }
@@ -90,13 +133,19 @@ abstract class NCService extends LazyLogging with 
NCOpenCensusTrace {
     /**
      * Acks stopped service. Should be called at the end of the `stop()` 
method.
      */
-    protected def ackStop(): Unit = {
+    protected def ackStopped(): Unit = {
+        assert(timeStampMs != -1, "Method 'NCService#ackStopping()' wasn't 
called.")
+
+        stopping = false
         started = false
 
         addTags(currentSpan(),
-            "state" → started
+            "stopDurationMs" → (currentTime - timeStampMs),
+            "state" → "stopped"
         )
 
-        logger.info(s"$clsName stopped.")
+        logger.info(s"$name stopped.")
+
+        timeStampMs = -1L
     }
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
index 126cca3..cbe292a 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
@@ -145,6 +145,8 @@ object NCExternalConfigManager extends NCService {
       * @param parent Optional parent span.
       */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
+        ackStarting()
+
         require(NCExternalConfigType.values.forall(FILES.contains))
 
         val m = new ConcurrentHashMap[NCResourceType, File]
@@ -164,7 +166,7 @@ object NCExternalConfigManager extends NCService {
             )
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -173,7 +175,8 @@ object NCExternalConfigManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
index e9033c3..2bb5710 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
@@ -45,6 +45,8 @@ object NCNlpCoreManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         // NOTE: DO NOT confuse this with token providers.
         if (!SUPPORTED_NLP_ENGINES.contains(Config.engine))
             throw new NCE(s"Unsupported NLP engine: ${Config.engine}")
@@ -65,7 +67,7 @@ object NCNlpCoreManager extends NCService {
 
         tokenizer.start()
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -73,10 +75,12 @@ object NCNlpCoreManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) 
{span ⇒
+        ackStopping()
+
         if (tokenizer != null)
             tokenizer.stop(span)
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/opennlp/NCOpenNlpTokenizer.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/opennlp/NCOpenNlpTokenizer.scala
index 7b29938..7efbf1e 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/opennlp/NCOpenNlpTokenizer.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/core/opennlp/NCOpenNlpTokenizer.scala
@@ -40,11 +40,13 @@ object NCOpenNlpTokenizer extends NCNlpTokenizer {
      * @return
      */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
+        ackStarting()
+
         tokenizer = managed(NCExternalConfigManager.getStream(OPENNLP, 
RESOURCE)) acquireAndGet { in ⇒
             new TokenizerME(new TokenizerModel(in))
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -52,9 +54,11 @@ object NCOpenNlpTokenizer extends NCNlpTokenizer {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("start", parent) { 
_ ⇒
+        ackStopping()
+
         tokenizer = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
index edd5a5c..e2e16e5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
@@ -44,6 +44,8 @@ object NCDictionaryManager extends NCService {
     @volatile private var dicts: Map[NCDictionaryType, Set[String]] = _
     
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent, "dicts" → dictFiles.values.mkString(",")) { _ ⇒
+        ackStarting()
+
         dicts = dictFiles.map(p ⇒ {
             val wordType = p._1
             val path = p._2
@@ -70,7 +72,7 @@ object NCDictionaryManager extends NCService {
         // Read summary dictionary.
         full = dicts.flatMap(_._2).toSet
         
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -78,7 +80,8 @@ object NCDictionaryManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/numeric/NCNumericManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/numeric/NCNumericManager.scala
index 3abfba1..be9bed3 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/numeric/NCNumericManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/numeric/NCNumericManager.scala
@@ -123,10 +123,18 @@ object NCNumericManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
-    
+
+    /**
+     *
+     * @param parent Optional parent span.
+     * @return
+     */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         genNums = mapResource("numeric/numeric.txt", "utf-8", logger, {
             _.filter(s ⇒ !s.isEmpty && !s.trim.startsWith("#")).
             map(_.split("=")).
@@ -266,7 +274,7 @@ object NCNumericManager extends NCService {
         unitsStem = hs.map(p ⇒ p.stem → NCNumericUnit(p.name, 
p.unitType)).toMap
         maxSynWords = (unitsOrigs ++ unitsStem).keySet.map(_.split(" 
").length).max
         
-        ackStart()
+        ackStarted()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
index 0e9c333..956caf9 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
@@ -45,7 +45,8 @@ object NCCommandManager extends NCService {
      * @param parent Optional parent span.
      */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
-        ackStart()
+        ackStarting()
+        ackStarted()
     }
 
     /**
@@ -54,7 +55,8 @@ object NCCommandManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
index 22a23f9..8121f88 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
@@ -50,10 +50,7 @@ object NCConnectionManager extends NCService {
 
     // Internal probe GUID.
     @volatile private var probeGuid: String = _
-    
-    // Internal semaphores.
-    private val stopSem = new AtomicInteger(1)
-    
+
     private final val sysProps: Properties = System.getProperties
     private final val localHost: InetAddress = InetAddress.getLocalHost
     @volatile private var hwAddrs: String = _
@@ -76,16 +73,6 @@ object NCConnectionManager extends NCService {
     }
 
     /**
-      *
-      */
-    protected def isStopping: Boolean = stopSem.intValue() == 0
-    
-    /**
-      *
-      */
-    protected def setStopping(): Unit = stopSem.set(0)
-    
-    /**
       * Schedules message for sending to the server.
       *
       * @param msg Message to send to server.
@@ -279,9 +266,10 @@ object NCConnectionManager extends NCService {
         require(NCCommandManager.isStarted)
         require(NCModelManager.isStarted)
 
+        ackStarting()
+
         probeGuid = U.genGuid()
         dnLinkQueue = mutable.Queue.empty[Serializable]
-        stopSem.set(1)
 
         val ctrlLatch = new CountDownLatch(1)
      
@@ -456,17 +444,17 @@ object NCConnectionManager extends NCService {
         // Only return when probe successfully connected to the server.
         ctrlLatch.await()
      
-        ackStart()
+        ackStarted()
     }
     
     /**
       *
       */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        setStopping()
-    
+        ackStopping()
+
         U.stopThread(ctrlThread)
         
-        ackStop()
+        ackStopped()
     }
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
index 45812ed..4dbd854 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
@@ -40,25 +40,26 @@ object NCConversationManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
-        gc =
-            U.mkThread("conversation-manager-gc") { t ⇒
-                while (!t.isInterrupted)
-                    try
-                        convs.synchronized {
-                            val sleepTime = clearForTimeout() - 
System.currentTimeMillis()
-
-                            if (sleepTime > 0)
-                                convs.wait(sleepTime)
-                        }
-                    catch {
-                        case _: InterruptedException ⇒ // No-op.
-                        case e: Throwable ⇒ logger.error(s"Unexpected error 
for: ${t.getName}", e)
+        ackStarting()
+
+        gc = U.mkThread("conversation-manager-gc") { t ⇒
+            while (!t.isInterrupted)
+                try
+                    convs.synchronized {
+                        val sleepTime = clearForTimeout() - 
System.currentTimeMillis()
+
+                        if (sleepTime > 0)
+                            convs.wait(sleepTime)
                     }
-            }
+                catch {
+                    case _: InterruptedException ⇒ // No-op.
+                    case e: Throwable ⇒ U.prettyError(logger, s"Unexpected 
error for thread: ${t.getName}", e)
+                }
+        }
 
         gc.start()
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -66,15 +67,15 @@ object NCConversationManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         U.stopThread(gc)
 
         gc = null
 
         convs.clear()
 
-        logger.info("Conversation manager GC stopped.")
-
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
index 226343f..d9330ac 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
@@ -606,6 +606,8 @@ object NCDeployManager extends NCService with 
DecorateAsScala {
      */
     @throws[NCE]
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         data = ArrayBuffer.empty[NCProbeModel]
 
         mdlFactory = new NCBasicModelFactory
@@ -645,7 +647,7 @@ object NCDeployManager extends NCService with 
DecorateAsScala {
         if (U.containsDups(ids))
             throw new NCE(s"Duplicate model IDs detected: ${ids.mkString(", 
")}")
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -655,13 +657,15 @@ object NCDeployManager extends NCService with 
DecorateAsScala {
      */
     @throws[NCE]
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         if (mdlFactory != null)
             mdlFactory.terminate()
 
         if (data != null)
             data.clear()
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
index 1c4f9d4..1705ffb 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
@@ -40,25 +40,26 @@ object NCDialogFlowManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
-        gc =
-            U.mkThread("dialog-flow-manager-gc") { t ⇒
-                while (!t.isInterrupted)
-                    try
-                        flow.synchronized {
-                            val sleepTime = clearForTimeout() - 
System.currentTimeMillis()
-
-                            if (sleepTime > 0)
-                                flow.wait(sleepTime)
-                        }
-                    catch {
-                        case _: InterruptedException ⇒ // No-op.
-                        case e: Throwable ⇒ logger.error(s"Unexpected error 
for: ${t.getName}", e)
+        ackStarting()
+
+        gc = U.mkThread("dialog-flow-manager-gc") { t ⇒
+            while (!t.isInterrupted)
+                try
+                    flow.synchronized {
+                        val sleepTime = clearForTimeout() - 
System.currentTimeMillis()
+
+                        if (sleepTime > 0)
+                            flow.wait(sleepTime)
                     }
-            }
+                catch {
+                    case _: InterruptedException ⇒ // No-op.
+                    case e: Throwable ⇒ U.prettyError(logger, s"Unexpected 
error for thread: ${t.getName}", e)
+                }
+        }
 
         gc.start()
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -66,15 +67,15 @@ object NCDialogFlowManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         U.stopThread(gc)
 
         gc = null
 
         flow.clear()
 
-        logger.info("Dialog flow manager GC stopped.")
-
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
index 2829718..0746615 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
@@ -40,9 +40,11 @@ object NCLifecycleManager extends NCService {
      */
     @throws[NCE]
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         beans = Config.lifecycle.map(U.mkObject(_).asInstanceOf[NCLifecycle])
     
-        ackStart()
+        ackStarted()
     }
 
 
@@ -52,7 +54,8 @@ object NCLifecycleManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("start", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
index 86bfa47..eb0c7d6 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
@@ -46,6 +46,8 @@ object NCModelManager extends NCService with DecorateAsScala {
      */
     @throws[NCE]
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         val tbl = NCAsciiTable("Model", "Intents")
 
         mux.synchronized {
@@ -88,19 +90,21 @@ object NCModelManager extends NCService with 
DecorateAsScala {
             "deployedModels" → data.values.map(_.model.getId).mkString(",")
         )
 
-        ackStart()
+        ackStarted()
     }
 
     /**
      * Stops this component.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         mux.synchronized {
             if (data != null)
                 data.values.foreach(m ⇒ discardModel(m.model))
         }
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
index 304c026..e52e92c 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
@@ -92,12 +92,14 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         embeddedCbs = mutable.HashSet.empty[EMBEDDED_CB]
 
         pool = U.mkThreadPool("probe-enrichment")
         executor = ExecutionContext.fromExecutor(pool)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -105,6 +107,8 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         mux.synchronized {
             if (embeddedCbs != null)
                 embeddedCbs.clear()
@@ -114,7 +118,7 @@ object NCProbeEnrichmentManager extends NCService with 
NCOpenCensusModelStats {
         executor = null
         pool = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/dictionary/NCDictionaryEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/dictionary/NCDictionaryEnricher.scala
index 12fe98e..2be0859 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/dictionary/NCDictionaryEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/dictionary/NCDictionaryEnricher.scala
@@ -43,11 +43,13 @@ object NCDictionaryEnricher extends NCProbeEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         swearWords = U.readTextResource(s"badfilter/swear_words.txt", "UTF-8", 
logger).
             map(NCNlpCoreManager.stem).
             toSet
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -55,7 +57,8 @@ object NCDictionaryEnricher extends NCProbeEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     @throws[NCE]
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/limit/NCLimitEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/limit/NCLimitEnricher.scala
index 37f040b..2c1f713 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/limit/NCLimitEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/limit/NCLimitEnricher.scala
@@ -149,6 +149,8 @@ object NCLimitEnricher extends NCProbeEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         // Note that single words only supported now in code.
         fuzzyNums = stemmatizeWords(Map(
             "few" → 3,
@@ -204,7 +206,7 @@ object NCLimitEnricher extends NCProbeEnricher {
 
         techWords = (sortWords.keys ++ topWords ++ postWords ++ 
fuzzyNums.keySet).toSet
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -212,6 +214,8 @@ object NCLimitEnricher extends NCProbeEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         fuzzyNums = null
         sortWords = null
         topWords = null
@@ -220,7 +224,7 @@ object NCLimitEnricher extends NCProbeEnricher {
         limits = null
         techWords = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
index a01f229..03594d1 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
@@ -106,7 +106,8 @@ object NCModelEnricher extends NCProbeEnricher with 
DecorateAsScala {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
-        ackStart()
+        ackStarting()
+        ackStarted()
     }
 
     /**
@@ -114,7 +115,8 @@ object NCModelEnricher extends NCProbeEnricher with 
DecorateAsScala {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/relation/NCRelationEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/relation/NCRelationEnricher.scala
index 03d0922..ff4475c 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/relation/NCRelationEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/relation/NCRelationEnricher.scala
@@ -68,6 +68,8 @@ object NCRelationEnricher extends NCProbeEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         val macros = NCMacroParser()
 
         FUNCS = {
@@ -113,7 +115,7 @@ object NCRelationEnricher extends NCProbeEnricher {
 
         ALL_FUNC_STEMS = FUNCS.flatMap(_.allStems).toSet
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -121,7 +123,8 @@ object NCRelationEnricher extends NCProbeEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
index 2b2e11d..f549dd5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
@@ -513,6 +513,8 @@ object NCSortEnricher extends NCProbeEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         // Single words.
         sort = SORT_WORDS.map(NCNlpCoreManager.stem)
 
@@ -534,7 +536,7 @@ object NCSortEnricher extends NCProbeEnricher {
 
         validate()
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -542,12 +544,14 @@ object NCSortEnricher extends NCProbeEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         sort = null
         by = null
         order = null
         stemAnd = null
         maskWords = null
 
-        ackStop()
+        ackStopped()
     }
 }
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/stopword/NCStopWordEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/stopword/NCStopWordEnricher.scala
index 0daf975..255d91b 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/stopword/NCStopWordEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/stopword/NCStopWordEnricher.scala
@@ -54,6 +54,8 @@ object NCStopWordEnricher extends NCProbeEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         // NOTE: stemmatization is done already by generator.
         geoPreWords = U.readTextResource(s"context/geo_pre_words.txt", 
"UTF-8", logger).
             map(_.split(" ").toSeq).sortBy(-_.size)
@@ -79,7 +81,7 @@ object NCStopWordEnricher extends NCProbeEnricher {
             "must be"
         ).map(NCNlpCoreManager.stem)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -87,11 +89,13 @@ object NCStopWordEnricher extends NCProbeEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         geoPreWords = null
         geoKindStops = null
         numPrefixStops = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/suspicious/NCSuspiciousNounsEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/suspicious/NCSuspiciousNounsEnricher.scala
index 7f1ae3f..fa9a3a2 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/suspicious/NCSuspiciousNounsEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/suspicious/NCSuspiciousNounsEnricher.scala
@@ -37,7 +37,8 @@ object NCSuspiciousNounsEnricher extends NCProbeEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
-        ackStart()
+        ackStarting()
+        ackStarted()
     }
 
     /**
@@ -45,7 +46,8 @@ object NCSuspiciousNounsEnricher extends NCProbeEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     @throws[NCE]
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
index f0893e8..86465f8 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
@@ -37,12 +37,14 @@ object NCValidateManager extends NCService with LazyLogging 
{
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         langFinder = new OptimaizeLangDetector()
         
         // Initialize language finder.
         langFinder.loadModels()
         
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -50,7 +52,8 @@ object NCValidateManager extends NCService with LazyLogging {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/company/NCCompanyManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/company/NCCompanyManager.scala
index ff5aaa8..8274de4 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/company/NCCompanyManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/company/NCCompanyManager.scala
@@ -60,7 +60,8 @@ object NCCompanyManager extends NCService with 
NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("start", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
@@ -69,6 +70,8 @@ object NCCompanyManager extends NCService with 
NCIgniteInstance {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         catching(wrapIE) {
             compSeq = NCSql.mkSeq(ignite, "compSeq", "nc_company", "id")
         }
@@ -110,7 +113,7 @@ object NCCompanyManager extends NCService with 
NCIgniteInstance {
                 }
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/feedback/NCFeedbackManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/feedback/NCFeedbackManager.scala
index a3996e0..ab32649 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/feedback/NCFeedbackManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/feedback/NCFeedbackManager.scala
@@ -37,7 +37,8 @@ object NCFeedbackManager extends NCService with 
NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("start", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
@@ -46,11 +47,13 @@ object NCFeedbackManager extends NCService with 
NCIgniteInstance {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         catching(wrapIE) {
             seq = NCSql.mkSeq(ignite, "feedbackSeq", "feedback", "id")
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala
index 2b55cc7..4328a37 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala
@@ -87,9 +87,11 @@ object NCGeoManager extends NCService {
      */
     @throws[NCE]
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         model = readAndConstructModel(true)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -97,9 +99,11 @@ object NCGeoManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         model = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
index 6e08e7e..9edc199 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
@@ -51,6 +51,8 @@ object NCServerLifecycleManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         if (Config.objects.isEmpty)
             logger.info("No lifecycle components configured.")
         else {
@@ -61,7 +63,7 @@ object NCServerLifecycleManager extends NCService {
             tbl.info(logger, Some(s"Configured lifecycle components:"))
         }
      
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -69,7 +71,8 @@ object NCServerLifecycleManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
index 2b51180..2552434 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
@@ -66,6 +66,8 @@ object NCNlpServerManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         addTags(span,
             "stanfordNer" → isStanfordNer,
             "googleNer" → isGoogleNer,
@@ -117,7 +119,7 @@ object NCNlpServerManager extends NCService {
     
         logger.info(s"Enabled built-in NERs: 
${Config.tokenProviders.mkString(", ")}")
     
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -125,13 +127,15 @@ object NCNlpServerManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         if (ners != null)
             ners.values.foreach(_.stop())
 
         if (parser != null && parser.isStarted)
             parser.stop()
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/google/NCGoogleNerEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/google/NCGoogleNerEnricher.scala
index a95033e..894cc45 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/google/NCGoogleNerEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/google/NCGoogleNerEnricher.scala
@@ -38,6 +38,8 @@ object NCGoogleNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgnite
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         try {
             srv = LanguageServiceClient.create()
 
@@ -58,7 +60,7 @@ object NCGoogleNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgnite
                 )
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -66,10 +68,12 @@ object NCGoogleNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgnite
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         if (srv != null)
             srv.close()
         
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpNerEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpNerEnricher.scala
index f0b14a3..f2dc816 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpNerEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpNerEnricher.scala
@@ -45,6 +45,8 @@ object NCOpenNlpNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgnit
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         require(NCOpenNlpTokenizer.isStarted)
 
         val m = collection.mutable.HashMap.empty[NameFinderME, String]
@@ -76,7 +78,7 @@ object NCOpenNlpNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgnit
             cache = ignite.cache[String, Array[String]]("opennlp-cache")
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -84,9 +86,11 @@ object NCOpenNlpNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgnit
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         cache = null
     
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpParser.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpParser.scala
index fc9b624..62b8374 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpParser.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/opennlp/NCOpenNlpParser.scala
@@ -49,6 +49,8 @@ object NCOpenNlpParser extends NCService with NCNlpParser 
with NCIgniteInstance
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
         require(NCOpenNlpTokenizer.isStarted)
 
+        ackStarting()
+
         U.executeParallel(
             () ⇒ {
                 tagger =
@@ -68,7 +70,7 @@ object NCOpenNlpParser extends NCService with NCNlpParser 
with NCIgniteInstance
             cache = ignite.cache[String, Array[String]]("opennlp-cache")
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -76,9 +78,11 @@ object NCOpenNlpParser extends NCService with NCNlpParser 
with NCIgniteInstance
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         cache = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
index bb4a181..70060b6 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
@@ -75,6 +75,8 @@ object NCSpaCyNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgniteI
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         url = Config.proxyUrl
 
         if (url.last == '/')
@@ -101,7 +103,7 @@ object NCSpaCyNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgniteI
 
         logger.info(s"spaCy proxy connected: $url")
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -109,7 +111,8 @@ object NCSpaCyNerEnricher extends NCService with 
NCNlpNerEnricher with NCIgniteI
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
index 4d3d6b4..94e8468 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
@@ -255,6 +255,8 @@ object NCServerEnrichmentManager extends NCService with 
NCIgniteInstance {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         catching(wrapIE) {
             cache = ignite.cache[String, Holder]("sentence-cache")
         }
@@ -276,7 +278,7 @@ object NCServerEnrichmentManager extends NCService with 
NCIgniteInstance {
         ners = NCNlpServerManager.getNers
         supportedProviders = ners.keySet ++ (if (Config.isBuiltInEnrichers) 
Set("nlpcraft") else Set.empty)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -284,6 +286,8 @@ object NCServerEnrichmentManager extends NCService with 
NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { span ⇒
+        ackStopping()
+
         if (Config.isBuiltInEnrichers) {
             NCCoordinatesEnricher.stop(span)
             NCGeoEnricher.stop(span)
@@ -297,7 +301,7 @@ object NCServerEnrichmentManager extends NCService with 
NCIgniteInstance {
         
         cache = null
         
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/basenlp/NCBaseNlpEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/basenlp/NCBaseNlpEnricher.scala
index d27531d..cc64123 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/basenlp/NCBaseNlpEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/basenlp/NCBaseNlpEnricher.scala
@@ -78,9 +78,11 @@ object NCBaseNlpEnricher extends NCServerEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         parser = NCNlpServerManager.getParser
         
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -88,7 +90,8 @@ object NCBaseNlpEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/coordinate/NCCoordinatesEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/coordinate/NCCoordinatesEnricher.scala
index e48f30a..2543757 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/coordinate/NCCoordinatesEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/coordinate/NCCoordinatesEnricher.scala
@@ -57,10 +57,12 @@ object NCCoordinatesEnricher extends NCServerEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         latStems = Seq("lat", "latitude").map(NCNlpCoreManager.stem)
         lonStems = Seq("lon", "longitude").map(NCNlpCoreManager.stem)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -68,10 +70,12 @@ object NCCoordinatesEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         latStems = null
         lonStems = null
 
-        ackStop()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
index 0fc3125..eb002a5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
@@ -117,7 +117,8 @@ object NCDateEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
@@ -126,6 +127,8 @@ object NCDateEnricher extends NCServerEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         def read(res: String): LHM_SS = {
             startScopedSpan("read", span, "res" → res) { _ ⇒
                 val m: LHM_SS = new LHM_SS()
@@ -160,7 +163,7 @@ object NCDateEnricher extends NCServerEnricher {
 
         cacheParts = p1 ++ p2
 
-        ackStart()
+        ackStarted()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/geo/NCGeoEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/geo/NCGeoEnricher.scala
index 9c9dc9c..37bf87f 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/geo/NCGeoEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/geo/NCGeoEnricher.scala
@@ -81,12 +81,14 @@ object NCGeoEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         commons = null
         topUsa = null
         topWorld = null
         locations = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
@@ -95,6 +97,8 @@ object NCGeoEnricher extends NCServerEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         locations = NCGeoManager.getModel.synonyms
 
         // GEO names matched with common english words and user defined 
exception GEO names.
@@ -126,7 +130,7 @@ object NCGeoEnricher extends NCServerEnricher {
         topUsa = readCities(US_TOP_PATH).map(city ⇒ glue(city.name, 
city.region)).toSet
         topWorld = readCities(WORLD_TOP_PATH).map(city ⇒ glue(city.name, 
city.region)).toSet
 
-        ackStart()
+        ackStarted()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/numeric/NCNumericEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/numeric/NCNumericEnricher.scala
index 25a4fb8..a884c32 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/numeric/NCNumericEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/numeric/NCNumericEnricher.scala
@@ -179,7 +179,8 @@ object NCNumericEnricher extends NCServerEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
-        ackStart()
+        ackStarting()
+        ackStarted()
     }
 
     /**
@@ -187,7 +188,8 @@ object NCNumericEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     private def mkMap(seq: Seq[String], c: T): Map[String, P] =
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/quote/NCQuoteEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/quote/NCQuoteEnricher.scala
index c6a6dad..d323785 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/quote/NCQuoteEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/quote/NCQuoteEnricher.scala
@@ -36,7 +36,8 @@ object NCQuoteEnricher extends NCServerEnricher {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
-        ackStart()
+        ackStarting()
+        ackStarted()
     }
 
     /**
@@ -44,7 +45,8 @@ object NCQuoteEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
index 6d174e9..d8a1353 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
@@ -653,6 +653,8 @@ object NCStopWordEnricher extends NCServerEnricher {
      */
     @throws[NCE]
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         percents = Set(
             "%",
             "pct",
@@ -680,7 +682,7 @@ object NCStopWordEnricher extends NCServerEnricher {
         stopWords = m(false)
         exceptions = m(true)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -688,6 +690,7 @@ object NCStopWordEnricher extends NCServerEnricher {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 }
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/preproc/NCPreProcessManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/preproc/NCPreProcessManager.scala
index b898f87..1076f3d 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/preproc/NCPreProcessManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/preproc/NCPreProcessManager.scala
@@ -88,7 +88,8 @@ object NCPreProcessManager extends NCService {
      * @return
      */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
-        ackStart()
+        ackStarting()
+        ackStarted()
     }
 
     /**
@@ -96,7 +97,8 @@ object NCPreProcessManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/spell/NCSpellCheckManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/spell/NCSpellCheckManager.scala
index 437f568..8ad7b73 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/spell/NCSpellCheckManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/spell/NCSpellCheckManager.scala
@@ -50,6 +50,8 @@ object NCSpellCheckManager extends NCService {
      * @return
      */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
+        ackStarting()
+
         dict = U.extractYamlString(
             NCExternalConfigManager.getContent(SPELL, RESOURCE),
             RESOURCE,
@@ -59,7 +61,7 @@ object NCSpellCheckManager extends NCService {
 
         logger.debug(s"Spell checker dictionary loaded: ${dict.size} entries")
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -67,9 +69,11 @@ object NCSpellCheckManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
+        ackStopping()
+
         dict = null
 
-        ackStop()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/wordnet/NCWordNetManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/wordnet/NCWordNetManager.scala
index 3cefbc3..bc25652 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/wordnet/NCWordNetManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/wordnet/NCWordNetManager.scala
@@ -73,10 +73,12 @@ object NCWordNetManager extends NCService {
      */
     @throws[NCE]
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         dic =  Dictionary.getDefaultResourceInstance
         morph = dic.getMorphologicalProcessor
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -84,7 +86,8 @@ object NCWordNetManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
index f939248..0e007b2 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
@@ -159,8 +159,6 @@ object NCProbeManager extends NCService {
     // All probes pending complete handshake keyed by probe key.
     @volatile private var pending: mutable.Map[ProbeKey, ProbeHolder] = _
 
-    @volatile private var isStopping: AtomicBoolean = _
-
     @volatile private var modelsInfo: ConcurrentHashMap[String, 
Promise[java.util.Map[String, AnyRef]]] = _
 
     /**
@@ -169,6 +167,8 @@ object NCProbeManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         probes = mutable.HashMap.empty[ProbeKey, ProbeHolder]
         mdls = mutable.HashMap.empty[String, NCProbeModelMdo]
         pending = mutable.HashMap.empty[ProbeKey, ProbeHolder]
@@ -180,8 +180,6 @@ object NCProbeManager extends NCService {
             "uplink" → s"$upHost:$upPort",
             "downlink" → s"$dnHost:$dnPort"
         )
-    
-        isStopping = new AtomicBoolean(false)
 
         modelsInfo = new ConcurrentHashMap[String, 
Promise[java.util.Map[String, AnyRef]]]()
 
@@ -206,7 +204,7 @@ object NCProbeManager extends NCService {
         
         pingSrv.start()
         
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -214,7 +212,7 @@ object NCProbeManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        isStopping = new AtomicBoolean(true)
+        ackStopping()
 
         U.stopThread(pingSrv)
         U.stopThread(dnSrv)
@@ -222,7 +220,7 @@ object NCProbeManager extends NCService {
 
         modelsInfo = null
      
-        ackStop()
+        ackStopped()
     }
 
     /**
@@ -402,7 +400,7 @@ object NCProbeManager extends NCService {
                     }
                     catch {
                         case e: Exception ⇒
-                            if (!isStopping.get) {
+                            if (!isStopping) {
                                 // Release socket asap.
                                 U.close(srv)
                                 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/proclog/NCProcessLogManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/proclog/NCProcessLogManager.scala
index 067b890..f7958b9 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/proclog/NCProcessLogManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/proclog/NCProcessLogManager.scala
@@ -42,13 +42,15 @@ object NCProcessLogManager extends NCService with 
NCIgniteInstance {
      * @return
      */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
+        ackStarting()
+
         catching(wrapIE) {
             logSeq = NCSql.mkSeq(ignite, "logSeq", "proc_log", "id")
 
             logLock = ignite.semaphore("logSemaphore", 1, true, true)
         }
      
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -56,7 +58,8 @@ object NCProcessLogManager extends NCService with 
NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
index 213b541..cbb2415 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
@@ -59,6 +59,8 @@ object NCQueryManager extends NCService with NCIgniteInstance 
with NCOpenCensusS
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         asyncAsks = new ConcurrentHashMap[String/*Server request ID*/, 
Promise[NCQueryStateMdo]]()
 
         catching(wrapIE) {
@@ -91,7 +93,7 @@ object NCQueryManager extends NCService with NCIgniteInstance 
with NCOpenCensusS
         
         require(cache != null)
         
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -99,7 +101,8 @@ object NCQueryManager extends NCService with 
NCIgniteInstance with NCOpenCensusS
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
index 6fc2a3e..7ad716b 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
@@ -73,6 +73,8 @@ object NCRestManager extends NCService {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         val url = s"${Config.host}:${Config.port}"
         val api: NCRestApi = U.mkObject(Config.apiImpl)
         
@@ -88,7 +90,7 @@ object NCRestManager extends NCService {
             case Failure(_) ⇒ logger.info(s"REST server failed to start on 
'$url'.")
         }
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -96,9 +98,11 @@ object NCRestManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         if (bindFut != null)
             bindFut.flatMap(_.unbind()).onComplete(_ ⇒ SYSTEM.terminate())
 
-        ackStop()
+        ackStopped()
     }
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
index dea9c5d..f8ea0f2 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
@@ -59,6 +59,8 @@ object NCSqlManager extends NCService with NCIgniteInstance {
      */
     @throws[NCE]
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { span ⇒
+        ackStarting()
+
         addTags(span, "isIgniteDb" → NCSql.isIgniteDb)
 
         if (NCSql.isIgniteDb)
@@ -68,7 +70,7 @@ object NCSqlManager extends NCService with NCIgniteInstance {
             usersPropsSeq = NCSql.mkSeq(ignite, "usersPropsSeq", 
"nc_user_property", "id")
         }
      
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -76,7 +78,8 @@ object NCSqlManager extends NCService with NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
-        ackStop()
+        ackStopping()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
index 930e3ac..f17892a 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
@@ -118,10 +118,12 @@ object NCSuggestSynonymManager extends NCService {
      * @return
      */
     override def start(parent: Span): NCService = startScopedSpan("start", 
parent) { _ ⇒
+        ackStarting()
+
         pool = Executors.newCachedThreadPool()
         executor = ExecutionContext.fromExecutor(pool)
 
-        ackStart()
+        ackStarted()
     }
 
     /**
@@ -129,11 +131,13 @@ object NCSuggestSynonymManager extends NCService {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
+        ackStopping()
+
         U.shutdownPools(pool)
         pool = null
         executor = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala
index 0ce81f5..3daf0fe 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala
@@ -51,11 +51,13 @@ object NCTxManager extends NCService with NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span = null): Unit = startScopedSpan("stop", 
parent) { _ ⇒
+        ackStopping()
+
         // Close all still attached JDBC connections on stop.
         if (cons != null)
             cons.values.foreach(U.close)
         
-        ackStop()
+        ackStopped()
     }
 
     /**
@@ -64,11 +66,13 @@ object NCTxManager extends NCService with NCIgniteInstance {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { _ ⇒
+        ackStarting()
+
         cons = mutable.HashMap.empty[IgniteUuid, Connection]
 
         itx = ignite.transactions()
 
-        ackStart()
+        ackStarted()
     }
 
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
index c984e36..b0ea704 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
@@ -99,6 +99,8 @@ object NCUserManager extends NCService with NCIgniteInstance {
      * @param parent Optional parent span.
      */
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { 
_ ⇒
+        ackStopping()
+
         if (scanner != null)
             scanner.cancel()
 
@@ -107,7 +109,7 @@ object NCUserManager extends NCService with 
NCIgniteInstance {
         tokenSigninCache = null
         idSigninCache = null
 
-        ackStop()
+        ackStopped()
     }
 
     /**
@@ -116,6 +118,8 @@ object NCUserManager extends NCService with 
NCIgniteInstance {
      * @return
      */
     override def start(parent: Span = null): NCService = 
startScopedSpan("start", parent) { span ⇒
+        ackStarting()
+
         addTags(
             span,
             "pwdPoolBlowup" → Config.pwdPoolBlowup,
@@ -179,7 +183,7 @@ object NCUserManager extends NCService with 
NCIgniteInstance {
         logger.info(s"Access tokens will be scanned for timeout every 
${Config.timeoutScannerFreqMins}m.")
         logger.info(s"Access tokens inactive for >= 
${Config.accessTokenExpireTimeoutMins}m will be invalidated.")
 
-        ackStart()
+        ackStarted()
     }
 
     /**

Reply via email to