/**
  * Method to run a domain job whose workload is a serialized JobRequestInterface
  *
  * @param \GearmanJob $job Object with job parameters
  *
  * @throws \Ice\Domain\Jobs\UnsupportedJobException
  * @throws \Exception re-throw uncaught exceptions
  * @return boolean
  *
  * @Gearman\Job(
  *     iterations = 1,
  *     name = "addDomainJob",
  *     description = "Data should be an json-encoded object containing at least a 'name' property. That domain job wll be executed"
  * )
  */
 public function addDomainJob($job)
 {
     $jobRequest = $this->requestSerializer->deserializeJobRequest($job->workload());
     if ($this->logger) {
         $this->logger->notice("Job received", [$job->workload()]);
     }
     if (!$this->director->hasWorkerProviderFor($jobRequest->getName())) {
         if ($this->logger) {
             $this->logger->critical("No worker available for job of name: " . $jobRequest->getName(), [$job->workload()]);
         }
         throw new UnsupportedJobException("No worker available for job of name: " . $jobRequest->getName());
     }
     $worker = $this->director->getWorkerProviderFor($jobRequest->getName())->getWorkerFor($jobRequest->getName());
     try {
         if ($this->eventDispatcher) {
             $this->eventDispatcher->dispatch('ice.job.pre_execute');
         }
         $worker->execute($jobRequest);
         if ($this->logger) {
             $this->logger->notice("Job complete", [$job->workload()]);
         }
     } catch (\Exception $e) {
         if ($this->logger) {
             $this->logger->critical("Uncaught exception when processing job", array('workload' => $job->workload(), 'message' => $e->getMessage(), 'stack_trace' => $e->getTrace(), 'exception' => $e));
         }
         //Re-throw the exception anyway, so that gearman knows the job has failed.
         throw $e;
     }
     return true;
 }
 function let(WorkerDirectorInterface $workerDirector, JobRequestSerializerInterface $requestSerializer, JobRequestInterface $deserializedJobRequest, WorkerProviderInterface $fooFactory, WorkerInterface $fooWorker, LoggerInterface $logger, EventDispatcherInterface $dispatcher)
 {
     $workerDirector->getWorkerProviderFor('fooName')->willReturn($fooFactory);
     $fooFactory->getWorkerFor('fooName')->willReturn($fooWorker);
     $deserializedJobRequest->getName()->willReturn('fooName');
     $requestSerializer->deserializeJobRequest(Argument::any())->willReturn($deserializedJobRequest);
     $this->beConstructedWith($workerDirector, $requestSerializer);
     //Allow 'good' log calls to be made even if we don't explicitly stub them in the specs
     $logger->debug(Argument::any(), Argument::any())->willReturn(null);
     $logger->info(Argument::any(), Argument::any())->willReturn(null);
     $logger->notice(Argument::any(), Argument::any())->willReturn(null);
 }