예제 #1
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @return PromiseInterface
  */
 public function handle($ex, $params = [])
 {
     foreach ($this->requires as $require) {
         if (!isset($params[$require])) {
             return Promise::doReject(new IllegalCallException('Missing parameter [' . $require . '] for [' . get_class($this) . '].'));
         }
     }
     return Promise::doResolve([$ex, $params])->spread(function ($ex, $params) {
         return $this->handler($ex, $params);
     });
 }
예제 #2
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @return mixed
  */
 protected function handler($ex, $params = [])
 {
     $manager = $this->runtime->manager();
     $alias = $params['origin'];
     if ($manager->existsThread($alias)) {
         return $manager->createThread($alias, null, Runtime::CREATE_FORCE);
     } else {
         if ($manager->existsProcess($alias)) {
             return $manager->createProcess($alias, null, Runtime::CREATE_FORCE);
         }
     }
     return Promise::doReject(new RejectionException("Runtime [{$alias}] does not exists."));
 }
예제 #3
0
 /**
  * @param int $flags
  * @return PromiseInterface
  */
 public function flushProcesses($flags = Runtime::DESTROY_KEEP)
 {
     return Promise::doReject(new RejectionException('Processes storage cannot be flushed.'));
 }
예제 #4
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @param int $try
  * @return PromiseInterface
  */
 public function handle($ex, $params = [], &$try = 0)
 {
     $classBaseEx = get_class($ex);
     $classes = array_merge([$classBaseEx], class_parents($ex));
     $indexMin = -1;
     $chosen = null;
     foreach ($classes as $class) {
         $indexCurrent = array_search($class, array_keys($this->rules), true);
         if ($indexCurrent !== false && ($indexMin === -1 || $indexCurrent < $indexMin)) {
             $indexMin = $indexCurrent;
             $chosen = $class;
         }
     }
     if ($chosen === null) {
         return Promise::doReject(new ExecutionException("SolverInterface [{$classBaseEx}] is not registered."));
     }
     $try++;
     $params = array_merge($this->params, $params);
     $valueOrPromise = $this->getHandler($chosen)->handle($ex, $params);
     return Promise::doResolve($valueOrPromise);
 }
예제 #5
0
 /**
  * @param string $command
  * @param mixed[] $params
  * @return PromiseInterface
  */
 private function executeCommand($command, $params = [])
 {
     try {
         return $this->commander->execute($command, $params);
     } catch (Error $ex) {
         return Promise::doReject($ex);
     } catch (Exception $ex) {
         return Promise::doReject($ex);
     }
 }
예제 #6
0
 /**
  * @param string $alias
  * @return PromiseInterface
  */
 public function stopRuntime($alias)
 {
     if ($this->existsThread($alias)) {
         return $this->threadManager->stopThread($alias);
     } else {
         if ($this->existsProcess($alias)) {
             return $this->processManager->stopProcess($alias);
         }
     }
     return Promise::doReject(new ResourceUndefinedException("Runtime with alias [{$alias}] does not exist."));
 }
예제 #7
0
 /**
  * @return PromiseInterface
  */
 public function stop()
 {
     $state = $this->getState();
     if ($state === Runtime::STATE_CREATED || $state === Runtime::STATE_DESTROYED) {
         return Promise::doReject(new RejectionException("It is not possible to stop runtime from state [{$state}]."));
     }
     if ($state !== Runtime::STATE_STOPPED) {
         $this->setState(Runtime::STATE_STOPPED);
         $emitter = $this->eventEmitter();
         $emitter->emit('beforeStop');
         $emitter->emit('stop');
         $emitter->emit('afterStop');
     }
     return Promise::doResolve('Runtime has been stopped.');
 }
예제 #8
0
 /**
  * @param $aliases
  * @return PromiseInterface
  */
 public function stopThreads($aliases)
 {
     return Promise::doReject(new RejectionException("Threads could not be stopped."));
 }
예제 #9
0
 /**
  * @param $aliases
  * @return PromiseInterface
  */
 public function stopProcesses($aliases)
 {
     return Promise::doReject(new RejectionException("Processes could not be stopped."));
 }
예제 #10
0
 /**
  * @param string $alias
  * @param int $flags
  * @return PromiseInterface
  */
 public function destroyProcess($alias, $flags = Runtime::DESTROY_FORCE_SOFT)
 {
     if (!isset($this->processes[$alias])) {
         return Promise::doResolve("Process [{$alias}] was not needed to be destroyed, because it had not existed.");
     }
     $pid = $this->processes[$alias]['pid'];
     $manager = $this;
     if ($flags === Runtime::DESTROY_KEEP) {
         return Promise::doReject(new ResourceDefinedException("Process [{$alias}] could not be destroyed with force level=DESTROY_KEEP."));
     } else {
         if ($flags === Runtime::DESTROY_FORCE_SOFT) {
             $req = new Request($this->channel, $alias, new RuntimeCommand('container:destroy'));
             return $req->call()->then(function ($value) use($manager, $alias) {
                 usleep(1000.0);
                 $manager->freeProcess($alias);
                 return $value;
             });
         } else {
             if ($flags === Runtime::DESTROY_FORCE) {
                 $manager = $this;
                 return $manager->destroyProcess($alias, Runtime::DESTROY_FORCE_SOFT)->then(null, function () use($manager, $alias) {
                     return $manager->destroyProcess($alias, Runtime::DESTROY_FORCE_HARD);
                 });
             }
         }
     }
     if (!$this->system->existsPid($pid)) {
         return Promise::doResolve()->then(function () use($manager, $alias) {
             $manager->freeProcess($alias);
         })->then(function () use($pid) {
             return "Process with pid [{$pid}] was not needed to be destroyed, because it had not existed.";
         });
     } else {
         if (!$this->system->kill($pid)) {
             return Promise::doReject(new ResourceDefinedException("Process with pid [{$pid}] could not be killed forcefully."));
         }
     }
     return Promise::doResolve()->then(function () use($manager, $alias) {
         $manager->freeProcess($alias);
     })->then(function () {
         return "Process has been destroyed!";
     });
 }