You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2021/01/20 14:36:21 UTC

[incubator-nlpcraft] 01/02: WIP.

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

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

commit ea0045f9a25d9c9e618e3bfb384eb1ffd8def98a
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Wed Jan 20 17:35:02 2021 +0300

    WIP.
---
 nlpcraft/src/main/resources/nlpcraft.conf          |   4 +
 .../common/extcfg/NCExternalConfigManager.scala    |   1 +
 .../org/apache/nlpcraft/common/util/NCUtils.scala  |   7 +-
 .../org/apache/nlpcraft/probe/NCProbeBoot.scala    |  14 +--
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  |   2 +-
 .../org/apache/nlpcraft/server/NCServer.scala      | 117 +++++++++++----------
 .../server/nlp/core/NCNlpServerManager.scala       |   3 +-
 .../nlp/core/opennlp/NCOpenNlpNerEnricher.scala    |   3 +-
 .../server/nlp/core/opennlp/NCOpenNlpParser.scala  |   3 +-
 .../nlp/enrichers/NCServerEnrichmentManager.scala  |   3 +-
 .../server/nlp/enrichers/date/NCDateEnricher.scala |   4 +-
 .../nlpcraft/server/probe/NCProbeManager.scala     |  17 ++-
 .../nlpcraft/server/query/NCQueryManager.scala     |   5 +-
 .../nlpcraft/server/rest/NCBasicRestApi.scala      |   4 +-
 .../server/sugsyn/NCSuggestSynonymManager.scala    |   6 +-
 15 files changed, 101 insertions(+), 92 deletions(-)

diff --git a/nlpcraft/src/main/resources/nlpcraft.conf b/nlpcraft/src/main/resources/nlpcraft.conf
index 1b1fa9d..b67ad76 100644
--- a/nlpcraft/src/main/resources/nlpcraft.conf
+++ b/nlpcraft/src/main/resources/nlpcraft.conf
@@ -207,6 +207,8 @@ nlpcraft {
 
         # 'ctxword' server endpoint URL.
         ctxword.url="http://localhost:5000"
+
+        # pools =
     }
 
     # Basic NLP toolkit to use on both server and probes. Possible values:
@@ -324,5 +326,7 @@ nlpcraft {
         # Maximum execution result size in bytes. Default value is 1M.
         # When exceeded the request will be automatically rejected.
         resultMaxSizeBytes = 1048576
+
+        # pools =
     }
 }
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 773bfe7..f34eb81 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
@@ -31,6 +31,7 @@ import org.apache.nlpcraft.common.{NCE, NCService, U}
 import resource.managed
 import scala.collection.JavaConverters._
 import scala.io.Source
+import scala.concurrent.ExecutionContext.Implicits.global
 
 /**
   * External configuration manager.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
index c6953b5..09cf8f7 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
@@ -57,7 +57,6 @@ import java.net.http.HttpRequest
 import java.net.http.HttpResponse
 import scala.collection.JavaConverters._
 import scala.collection._
-import scala.concurrent.ExecutionContext.Implicits.global
 import scala.concurrent.duration._
 import scala.concurrent.{Await, ExecutionContext, Future}
 import scala.io.{BufferedSource, Source}
@@ -931,7 +930,7 @@ object NCUtils extends LazyLogging {
     def asFuture[T](
         body: Unit ⇒ T,
         onFailure: Throwable ⇒ Unit = _ ⇒ Unit,
-        onSuccess: T ⇒ Unit = (_: T) ⇒ ())(implicit ec: ExecutionContext = global): Future[T] = {
+        onSuccess: T ⇒ Unit = (_: T) ⇒ ())(implicit ec: ExecutionContext): Future[T] = {
         val fut = Future {
             body(())
         }(ec)
@@ -1149,7 +1148,7 @@ object NCUtils extends LazyLogging {
       *
       * @param es Executor service.
       */
-    def shutdownPools(es: ExecutorService): Unit =
+    def shutdownPool(es: ExecutorService): Unit =
         if (es != null) {
             es.shutdown()
 
@@ -1815,7 +1814,7 @@ object NCUtils extends LazyLogging {
       * @param bodies
       * @param ec
       */
-    def executeParallel(bodies: (() ⇒ Any)*)(implicit ec: ExecutionContext = global): Unit = {
+    def executeParallel(bodies: (() ⇒ Any)*)(implicit ec: ExecutionContext): Unit = {
         bodies.map(body ⇒ {
             Future {
                 body()
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/NCProbeBoot.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/NCProbeBoot.scala
index f47eb2c..6ffbd36 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/NCProbeBoot.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/NCProbeBoot.scala
@@ -17,22 +17,20 @@
 
 package org.apache.nlpcraft.probe
 
-import java.io._
-import java.util.concurrent.CompletableFuture
-
 import com.typesafe.config.{Config, ConfigFactory, ConfigValueFactory}
 import com.typesafe.scalalogging.LazyLogging
 import io.opencensus.trace.Span
 import org.apache.commons.lang3.SystemUtils
 import org.apache.nlpcraft.common.ascii.NCAsciiTable
 import org.apache.nlpcraft.common.config.NCConfigurable
+import org.apache.nlpcraft.common.extcfg.NCExternalConfigManager
 import org.apache.nlpcraft.common.nlp.core.NCNlpCoreManager
 import org.apache.nlpcraft.common.nlp.dict.NCDictionaryManager
 import org.apache.nlpcraft.common.nlp.numeric.NCNumericManager
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
-import org.apache.nlpcraft.common.extcfg.NCExternalConfigManager
 import org.apache.nlpcraft.common.version.NCVersion
-import org.apache.nlpcraft.common.{NCE, NCException, NCService, U}
+import org.apache.nlpcraft.common.{NCE, NCException, NCService, U, _}
+import org.apache.nlpcraft.model.tools.cmdline.NCCliProbeBeacon
 import org.apache.nlpcraft.probe.mgrs.cmd.NCCommandManager
 import org.apache.nlpcraft.probe.mgrs.conn.NCConnectionManager
 import org.apache.nlpcraft.probe.mgrs.conversation.NCConversationManager
@@ -49,10 +47,11 @@ import org.apache.nlpcraft.probe.mgrs.nlp.enrichers.sort.NCSortEnricher
 import org.apache.nlpcraft.probe.mgrs.nlp.enrichers.stopword.NCStopWordEnricher
 import org.apache.nlpcraft.probe.mgrs.nlp.enrichers.suspicious.NCSuspiciousNounsEnricher
 import org.apache.nlpcraft.probe.mgrs.nlp.validate.NCValidateManager
-import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.model.tools.cmdline.NCCliProbeBeacon
+import org.apache.nlpcraft.probe.mgrs.pool.NCProbePoolManager
 import resource.managed
 
+import java.io._
+import java.util.concurrent.CompletableFuture
 import scala.collection.JavaConverters._
 import scala.collection.mutable
 import scala.compat.Platform.currentTime
@@ -494,6 +493,7 @@ private [probe] object NCProbeBoot extends LazyLogging with NCOpenCensusTrace {
                 "jarFolder" → cfg.jarsFolder
             )
 
+            startedMgrs += NCProbePoolManager.start(span)
             startedMgrs += NCExternalConfigManager.start(span)
             startedMgrs += NCNlpCoreManager.start(span)
             startedMgrs += NCNumericManager.start(span)
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 7502cf5..1cd6fa7 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
@@ -113,7 +113,7 @@ object NCProbeEnrichmentManager extends NCService with NCOpenCensusModelStats {
                 embeddedCbs.clear()
         }
 
-        U.shutdownPools(pool)
+        U.shutdownPool(pool)
         executor = null
         pool = null
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
index df113ce..dc0ec78 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
@@ -17,9 +17,6 @@
 
 package org.apache.nlpcraft.server
 
-import java.io.{File, FileInputStream, FileOutputStream, IOException, ObjectInputStream, ObjectOutputStream}
-import java.util.concurrent.CountDownLatch
-
 import com.typesafe.config.Config
 import com.typesafe.scalalogging.LazyLogging
 import org.apache.commons.lang3.SystemUtils
@@ -44,6 +41,7 @@ import org.apache.nlpcraft.server.nlp.enrichers.NCServerEnrichmentManager
 import org.apache.nlpcraft.server.nlp.preproc.NCPreProcessManager
 import org.apache.nlpcraft.server.nlp.spell.NCSpellCheckManager
 import org.apache.nlpcraft.server.nlp.wordnet.NCWordNetManager
+import org.apache.nlpcraft.server.pool.NCServerPoolManager
 import org.apache.nlpcraft.server.probe.NCProbeManager
 import org.apache.nlpcraft.server.proclog.NCProcessLogManager
 import org.apache.nlpcraft.server.query.NCQueryManager
@@ -54,45 +52,48 @@ import org.apache.nlpcraft.server.tx.NCTxManager
 import org.apache.nlpcraft.server.user.NCUserManager
 import resource.managed
 
+import java.io._
+import java.util.concurrent.CountDownLatch
 import scala.collection.mutable
 import scala.compat.Platform.currentTime
 import scala.util.control.Exception.{catching, ignoring}
 
 /**
-  * NLPCraft server app.
-  */
+ * NLPCraft server app.
+ */
 object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCensusTrace {
     private final val BEACON_PATH = ".nlpcraft/server_beacon"
 
     private val startedMgrs = mutable.Buffer.empty[NCService]
 
     /**
-      * Prints ASCII-logo.
-      */
+     * Prints ASCII-logo.
+     */
     private def asciiLogo() {
         val ver = NCVersion.getCurrent
 
         logger.info(
             U.NL +
-            U.asciiLogo() +
-            s"${U.NL}" +
-            s"Server${U.NL}" +
-            s"Version: ${bo(ver.version)}${U.NL}" +
-            s"${NCVersion.copyright}${U.NL}"
+                U.asciiLogo() +
+                s"${U.NL}" +
+                s"Server${U.NL}" +
+                s"Version: ${bo(ver.version)}${U.NL}" +
+                s"${NCVersion.copyright}${U.NL}"
         )
     }
 
     /**
-      * Starts all managers.
-      */
+     * Starts all managers.
+     */
     private def startManagers(): Unit = {
         val ver = NCVersion.getCurrent
 
         // Lifecycle manager has to be started outside of the tracing span.
         NCServerLifecycleManager.start()
         NCServerLifecycleManager.beforeStart()
-    
+
         startScopedSpan("startManagers", "relVer" → ver.version, "relDate" → ver.date) { span ⇒
+            startedMgrs += NCServerPoolManager.start(span)
             startedMgrs += NCExternalConfigManager.start(span)
             startedMgrs += NCWordNetManager.start(span)
             startedMgrs += NCDictionaryManager.start(span)
@@ -113,19 +114,19 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
             startedMgrs += NCFeedbackManager.start(span)
             startedMgrs += NCQueryManager.start(span)
             startedMgrs += NCRestManager.start(span)
-    
+
             // Lifecycle callback.
             NCServerLifecycleManager.afterStart()
         }
     }
-    
+
     /**
-      * Stops all managers.
-      */
+     * Stops all managers.
+     */
     private def stopManagers(): Unit = {
         // Lifecycle callback.
         NCServerLifecycleManager.beforeStop()
-    
+
         startScopedSpan("stopManagers") { span ⇒
             startedMgrs.reverse.foreach(p ⇒
                 try
@@ -135,38 +136,38 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
                 }
             )
         }
-        
+
         // Lifecycle callback.
         NCServerLifecycleManager.afterStop()
         NCServerLifecycleManager.stop()
     }
-    
+
     /**
-      * Acks server start.
-      */
+     * Acks server start.
+     */
     protected def ackStart() {
         val dur = s"[${U.format((currentTime - executionStart) / 1000.0, 2)}s]"
-        
+
         val tbl = NCAsciiTable()
-        
+
         tbl.margin(top = 1, bottom = 1)
-        
+
         tbl += s"Server started ${b(dur)}"
-        
+
         tbl.info(logger)
     }
 
     /**
-      *
-      * @return
-      */
+     *
+     * @return
+     */
     private def setSysProps(): Unit = {
         System.setProperty("java.net.preferIPv4Stack", "true")
     }
 
     /**
-      *
-      */
+     *
+     */
     private def start(): Unit = {
         NCAnsi.ackStatus()
 
@@ -177,25 +178,25 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
             args.find(_.startsWith("-config=")) match {
                 case Some(s) ⇒
                     val fileName = s.substring("-config=".length)
-                    
+
                     val f = new java.io.File(fileName)
 
                     if (!(f.exists && f.canRead && f.isFile))
                         throw new NCE(s"Specified server configuration file does not exist or cannot be read: $fileName")
 
                     Some(fileName)
-                    
+
                 case None ⇒
                     Some("nlpcraft.conf") // Default to 'nlpcraft.conf'.
             },
             None, // No defaults.
             (cfg: Config) ⇒ cfg.hasPath("nlpcraft.server")
         )
-        
+
         asciiLogo()
 
         val lifecycle = new CountDownLatch(1)
-    
+
         catching(classOf[Throwable]) either startManagers() match {
             case Left(e) ⇒ // Exception.
                 U.prettyError(logger, "Failed to start server:", e)
@@ -203,7 +204,7 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
                 stopManagers()
 
                 System.exit(1)
-        
+
             case _ ⇒ // Managers started OK.
                 // Store beacon file once all managers started OK.
                 storeBeacon()
@@ -235,7 +236,7 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
         /**
          *
          */
-        def save() = {
+        def save(): Unit = {
             final object Config extends NCConfigurable {
                 final private val pre = "nlpcraft.server"
 
@@ -243,21 +244,21 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
                 lazy val restHost = getString(s"$pre.rest.host")
                 lazy val restApi = getString(s"$pre.rest.apiImpl")
                 lazy val restPort = getInt(s"$pre.rest.port")
-                lazy val upLink =  getString(s"$pre.probe.links.upLink")
-                lazy val downLink =  getString(s"$pre.probe.links.downLink")
-                lazy val dbUrl =  getString(s"$pre.database.jdbc.url")
-                lazy val dbDriver =  getString(s"$pre.database.jdbc.driver")
-                lazy val dbPoolMin =  getInt(s"$pre.database.c3p0.pool.minSize")
-                lazy val dbPoolMax =  getInt(s"$pre.database.c3p0.pool.maxSize")
-                lazy val dbPoolInit =  getInt(s"$pre.database.c3p0.pool.initSize")
-                lazy val dbPoolInc =  getInt(s"$pre.database.c3p0.pool.acquireIncrement")
-                lazy val dbInit =  getBool(s"$pre.database.igniteDbInitialize")
-                lazy val tokProviders =  getString(s"$pre.tokenProviders")
-                lazy val acsToksScanMins =  getInt(s"$pre.user.timeoutScannerFreqMins")
-                lazy val acsToksExpireMins =  getInt(s"$pre.user.accessTokenExpireTimeoutMins")
-                lazy val nlpEngine =  getString("nlpcraft.nlpEngine")
-                lazy val extCfgUrl =  getString("nlpcraft.extConfig.extUrl")
-                lazy val extCfgCheckMd5 =  getBool("nlpcraft.extConfig.checkMd5")
+                lazy val upLink = getString(s"$pre.probe.links.upLink")
+                lazy val downLink = getString(s"$pre.probe.links.downLink")
+                lazy val dbUrl = getString(s"$pre.database.jdbc.url")
+                lazy val dbDriver = getString(s"$pre.database.jdbc.driver")
+                lazy val dbPoolMin = getInt(s"$pre.database.c3p0.pool.minSize")
+                lazy val dbPoolMax = getInt(s"$pre.database.c3p0.pool.maxSize")
+                lazy val dbPoolInit = getInt(s"$pre.database.c3p0.pool.initSize")
+                lazy val dbPoolInc = getInt(s"$pre.database.c3p0.pool.acquireIncrement")
+                lazy val dbInit = getBool(s"$pre.database.igniteDbInitialize")
+                lazy val tokProviders = getString(s"$pre.tokenProviders")
+                lazy val acsToksScanMins = getInt(s"$pre.user.timeoutScannerFreqMins")
+                lazy val acsToksExpireMins = getInt(s"$pre.user.accessTokenExpireTimeoutMins")
+                lazy val nlpEngine = getString("nlpcraft.nlpEngine")
+                lazy val extCfgUrl = getString("nlpcraft.extConfig.extUrl")
+                lazy val extCfgCheckMd5 = getBool("nlpcraft.extConfig.checkMd5")
                 lazy val restEndpoint = s"${Config.restHost}:${Config.restPort}/api/v1"
             }
 
@@ -327,7 +328,9 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
 
         if (path.exists())
             catching(classOf[IOException]) either {
-                managed(new ObjectInputStream(new FileInputStream(path))) acquireAndGet { _.readObject() }
+                managed(new ObjectInputStream(new FileInputStream(path))) acquireAndGet {
+                    _.readObject()
+                }
             } match {
                 case Left(e) ⇒
                     logger.trace(s"Failed to read existing server beacon: ${path.getAbsolutePath}", e)
@@ -350,7 +353,7 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
                     }
             }
         else
-            // No existing beacon file detected.
+        // No existing beacon file detected.
             save()
     }
 
@@ -358,7 +361,7 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
     new Thread() {
         override def run(): Unit = U.gaScreenView("server")
     }
-    .start()
+        .start()
 
     NCIgniteRunner.runWith(
         args.find(_.startsWith("-igniteConfig=")) match {
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 fb12deb..0e496c8 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
@@ -21,13 +21,14 @@ import io.opencensus.trace.Span
 import org.apache.nlpcraft.common.config.NCConfigurable
 import org.apache.nlpcraft.common.nlp.core.NCNlpCoreManager
 import org.apache.nlpcraft.common.{NCService, _}
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 
 import scala.collection.Seq
 
 /**
   * Server NLP manager.
   */
-object NCNlpServerManager extends NCService {
+object NCNlpServerManager extends NCService with NCServerPoolContext {
     @volatile private var parser: NCNlpParser = _
     @volatile private var ners: Map[String, NCNlpNerEnricher] = _
 
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 f2dc816..d2e923f 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
@@ -28,6 +28,7 @@ import org.apache.nlpcraft.common.{NCService, U}
 import org.apache.nlpcraft.server.ignite.NCIgniteHelpers._
 import org.apache.nlpcraft.server.ignite.NCIgniteInstance
 import org.apache.nlpcraft.server.nlp.core.NCNlpNerEnricher
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 import resource.managed
 
 import scala.util.control.Exception.catching
@@ -35,7 +36,7 @@ import scala.util.control.Exception.catching
 /**
   * OpenNLP NER enricher.
   */
-object NCOpenNlpNerEnricher extends NCService with NCNlpNerEnricher with NCIgniteInstance {
+object NCOpenNlpNerEnricher extends NCService with NCNlpNerEnricher with NCIgniteInstance with NCServerPoolContext {
     @volatile private var nerFinders: Map[NameFinderME, String] = _
     @volatile private var cache: IgniteCache[String, Array[String]] = _
 
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 62b8374..a219115 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
@@ -29,6 +29,7 @@ import org.apache.nlpcraft.common.{NCService, U}
 import org.apache.nlpcraft.server.ignite.NCIgniteHelpers._
 import org.apache.nlpcraft.server.ignite.NCIgniteInstance
 import org.apache.nlpcraft.server.nlp.core.{NCNlpParser, NCNlpWord}
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 import resource.managed
 
 import scala.util.control.Exception.catching
@@ -36,7 +37,7 @@ import scala.util.control.Exception.catching
 /**
   * OpenNLP parser implementation.
   */
-object NCOpenNlpParser extends NCService with NCNlpParser with NCIgniteInstance {
+object NCOpenNlpParser extends NCService with NCNlpParser with NCIgniteInstance with NCServerPoolContext{
     @volatile private var tagger: POSTagger = _
     @volatile private var lemmatizer: DictionaryLemmatizer = _
     @volatile private var cache: IgniteCache[String, Array[String]] = _
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 86b7bee..f7b6cd8 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
@@ -34,6 +34,7 @@ import org.apache.nlpcraft.server.nlp.enrichers.numeric.NCNumericEnricher
 import org.apache.nlpcraft.server.nlp.enrichers.quote.NCQuoteEnricher
 import org.apache.nlpcraft.server.nlp.enrichers.stopword.NCStopWordEnricher
 import org.apache.nlpcraft.server.nlp.preproc.NCPreProcessManager
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 
 import scala.collection.Seq
 import scala.util.control.Exception.catching
@@ -41,7 +42,7 @@ import scala.util.control.Exception.catching
 /**
   * Server enrichment pipeline manager.
   */
-object NCServerEnrichmentManager extends NCService with NCIgniteInstance {
+object NCServerEnrichmentManager extends NCService with NCIgniteInstance with NCServerPoolContext {
     private object Config extends NCConfigurable {
         def isBuiltInEnrichers: Boolean = getStringList("nlpcraft.server.tokenProviders").contains("nlpcraft")
     }
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 44b8a49..7c9f32a 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
@@ -19,7 +19,6 @@ package org.apache.nlpcraft.server.nlp.enrichers.date
 
 import java.util
 import java.util.{Calendar ⇒ C}
-
 import io.opencensus.trace.Span
 import org.apache.nlpcraft.common.config.NCConfigurable
 import org.apache.nlpcraft.common.nlp.{NCNlpSentence ⇒ Sentence}
@@ -29,6 +28,7 @@ import org.apache.nlpcraft.common.{NCService, _}
 import org.apache.nlpcraft.server.nlp.enrichers.NCServerEnricher
 import org.apache.nlpcraft.server.nlp.enrichers.date.NCDateConstants._
 import org.apache.nlpcraft.server.nlp.enrichers.date.NCDateFormatType._
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 
 import scala.collection.JavaConverters._
 import scala.collection.immutable.Iterable
@@ -38,7 +38,7 @@ import scala.collection.mutable.{LinkedHashMap ⇒ LHM}
 /**
   * Date enricher.
   */
-object NCDateEnricher extends NCServerEnricher {
+object NCDateEnricher extends NCServerEnricher with NCServerPoolContext {
     private object Config extends NCConfigurable {
         def style: NCDateFormatType = getObject("nlpcraft.server.datesFormatStyle", NCDateFormatType.withName)
     }
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 8e210ac..c439148 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
@@ -17,13 +17,6 @@
 
 package org.apache.nlpcraft.server.probe
 
-import java.io._
-import java.net.{InetSocketAddress, ServerSocket, Socket, SocketTimeoutException}
-import java.security.Key
-import java.util
-import java.util.Collections
-import java.util.concurrent.ConcurrentHashMap
-
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import io.opencensus.trace.Span
@@ -36,6 +29,7 @@ import org.apache.nlpcraft.common.socket.NCSocket
 import org.apache.nlpcraft.common.version.NCVersion
 import org.apache.nlpcraft.common.{NCService, _}
 import org.apache.nlpcraft.probe.mgrs.NCProbeMessage
+import org.apache.nlpcraft.probe.mgrs.pool.NCProbePoolContext
 import org.apache.nlpcraft.server.company.NCCompanyManager
 import org.apache.nlpcraft.server.mdo.{NCCompanyMdo, NCProbeMdo, NCProbeModelMdo, NCUserMdo}
 import org.apache.nlpcraft.server.nlp.enrichers.NCServerEnrichmentManager
@@ -43,16 +37,21 @@ import org.apache.nlpcraft.server.proclog.NCProcessLogManager
 import org.apache.nlpcraft.server.query.NCQueryManager
 import org.apache.nlpcraft.server.sql.NCSql
 
+import java.io._
+import java.net.{InetSocketAddress, ServerSocket, Socket, SocketTimeoutException}
+import java.security.Key
+import java.util
+import java.util.Collections
+import java.util.concurrent.ConcurrentHashMap
 import scala.collection.JavaConverters._
 import scala.collection.{Map, mutable}
-import scala.concurrent.ExecutionContext.Implicits.global
 import scala.concurrent.{Future, Promise}
 import scala.util.{Failure, Success}
 
 /**
   * Probe manager.
   */
-object NCProbeManager extends NCService {
+object NCProbeManager extends NCService with NCProbePoolContext {
     private final val GSON = new Gson()
     private final val TYPE_MODEL_INFO_RESP = new TypeToken[util.HashMap[String, AnyRef]]() {}.getType
 
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 9ed0bb8..5faa00a 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
@@ -18,7 +18,6 @@
 package org.apache.nlpcraft.server.query
 
 import java.util.concurrent.ConcurrentHashMap
-
 import io.opencensus.trace.Span
 import org.apache.ignite.IgniteCache
 import org.apache.ignite.events.{CacheEvent, EventType}
@@ -31,12 +30,12 @@ import org.apache.nlpcraft.server.ignite.NCIgniteHelpers._
 import org.apache.nlpcraft.server.ignite.NCIgniteInstance
 import org.apache.nlpcraft.server.mdo.NCQueryStateMdo
 import org.apache.nlpcraft.server.nlp.enrichers.NCServerEnrichmentManager
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 import org.apache.nlpcraft.server.probe.NCProbeManager
 import org.apache.nlpcraft.server.proclog.NCProcessLogManager
 import org.apache.nlpcraft.server.tx.NCTxManager
 import org.apache.nlpcraft.server.user.NCUserManager
 
-import scala.concurrent.ExecutionContext.Implicits.global
 import scala.concurrent.{Future, Promise}
 import scala.util.{Failure, Success}
 import scala.util.control.Exception._
@@ -44,7 +43,7 @@ import scala.util.control.Exception._
 /**
   * Query state machine.
   */
-object NCQueryManager extends NCService with NCIgniteInstance with NCOpenCensusServerStats {
+object NCQueryManager extends NCService with NCIgniteInstance with NCOpenCensusServerStats with NCServerPoolContext {
     @volatile private var cache: IgniteCache[String/*Server request ID*/, NCQueryStateMdo] = _
     
     // Promises cannot be used in cache.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
index bc42891..1c78df6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
@@ -36,6 +36,7 @@ import org.apache.nlpcraft.server.company.NCCompanyManager
 import org.apache.nlpcraft.server.feedback.NCFeedbackManager
 import org.apache.nlpcraft.server.mdo.{NCQueryStateMdo, NCUserMdo}
 import org.apache.nlpcraft.server.opencensus.NCOpenCensusServerStats
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 import org.apache.nlpcraft.server.probe.NCProbeManager
 import org.apache.nlpcraft.server.query.NCQueryManager
 import org.apache.nlpcraft.server.sugsyn.NCSuggestSynonymManager
@@ -44,13 +45,12 @@ import spray.json.DefaultJsonProtocol._
 import spray.json.{JsObject, JsValue, RootJsonFormat}
 
 import scala.collection.JavaConverters._
-import scala.concurrent.ExecutionContext.Implicits.global
 import scala.concurrent.Future
 
 /**
   * REST API default implementation.
   */
-class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace with NCOpenCensusServerStats {
+class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace with NCOpenCensusServerStats with NCServerPoolContext {
     protected final val GSON = new Gson()
     protected final val URL_VALIDATOR = new UrlValidator(Array("http", "https"), UrlValidator.ALLOW_LOCAL_URLS)
 
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 fc17201..3a1c22e 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
@@ -35,16 +35,16 @@ import scala.util.{Failure, Success}
 import java.util
 import java.util.concurrent.atomic.{AtomicInteger, AtomicReference}
 import java.util.concurrent._
-
 import org.apache.http.client.methods.HttpPost
 import org.apache.http.entity.StringEntity
 import org.apache.http.impl.client.HttpClients
 import org.apache.nlpcraft.common.makro.NCMacroParser
+import org.apache.nlpcraft.server.pool.NCServerPoolContext
 
 /**
  * Synonym suggestion manager.
  */
-object NCSuggestSynonymManager extends NCService {
+object NCSuggestSynonymManager extends NCService with NCServerPoolContext {
     // For context word server requests.
     private final val MAX_LIMIT: Int = 10000
     private final val BATCH_SIZE = 20
@@ -133,7 +133,7 @@ object NCSuggestSynonymManager extends NCService {
     override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { _ ⇒
         ackStopping()
 
-        U.shutdownPools(pool)
+        U.shutdownPool(pool)
         pool = null
         executor = null