2015-12-01 41 views
7

Mam projekt ZF2 z następującymi konfiguracjami. Używa Docrine ORM i SlmQueue. Ponieważ SlmQueue nie obsługuje naszych konwencji nazewnictwa i bazy danych Oracle, dostosowaliśmy SlmQueueDoctrine.ZF2, Oracle, SlmQueueDoctrine, ClearObjectManagerStrategy nie działa

Podejrzewam, że moja praca nie używa ClearObjectManagerStrategy i nie usuwa ObjectManager przed wykonaniem poszczególnych zadań.

Nie odzwierciedla modyfikacji bazy danych po uruchomieniu kolejki. Ale wybiera nowe wartości, jeśli zabiję demon kolejki i zacznę od nowa.

Jak zaimplementować ClearObjectManagerStrategy i wyczyścić obiekt ObjectManager przed wykonaniem poszczególnych zadań?

Próbowałem wielu podszedł bez powodzenia.

composer.json

{ 
    "repositories": [ 
     { 
      "url": "https://github.com/pradeep-sanjaya/doctrine-extensions.git", 
      "type": "git" 
     } 
    ], 
    "require": { 
     "php": ">=5.3.3", 
     "zendframework/zendframework": "2.3.3", 
     "doctrine/doctrine-orm-module": "0.7.*", 
     "pradeep-sanjaya/doctrine-extensions": "dev-master", 
     "spoonx/sxmail": "1.4.*", 
     "slm/locale": "dev-master", 
     "imagine/Imagine": "0.6.*", 
     "tecnick.com/tcpdf": "dev-master", 
     "slm/queue": "0.4.*", 
     "slm/queue-doctrine": "0.4.*" 
    } 
} 

config/autoload/slm_queue.local.php

<?php 
return array(
    'slm_queue' => array(
     'queue_manager' => array(
      'factories' => array(
       'doctrineQueue' => 'SlmQueueDoctrine\Factory\DoctrineQueueFactory' 
      ), 
     ), 
     'job_manager' => array(
      'factories' => array(
       'Report\Job\Rank' => 'Report\Job\RankFactory', 
      ), 
      'shared' => array(
       'Report\Job\Rank' => false 
      ), 
     ), 
     'queues' => array(
      'doctrineQueue' => array(
       'table_name' => 'IOQUEUE' 
      ) 
     ) 
    ) 
); 
?> 

moduł/raport/src/raport/Praca/Rank.php

<?php 
namespace Report\Job; 

use DoctrineModule\Persistence\ObjectManagerAwareInterface; 
use DoctrineModule\Persistence\ProvidesObjectManager as ProvidesObjectManagerTrait; 
use SlmQueue\Job\AbstractJob; 

use Application\Entity\Report; 

use Application\Log\LoggerAwareInterface; 
use Application\Log\LoggerAwareTrait; 

use Application\Service\ReportService; 

class Rank extends AbstractJob implements ObjectManagerAwareInterface, LoggerAwareInterface 
{ 
    use LoggerAwareTrait; 
    use ProvidesObjectManagerTrait; 

    /** 
    * @var ReportService 
    */ 
    protected $reportService; 

    /** 
    * @var array 
    */ 
    protected $reportId = array(); 

    public function setReportService(ReportService $reportService) 
    { 
     $this->reportService = $reportService; 
    } 

    /** 
    * Execute the job 
    * 
    * @return void 
    */ 
    public function execute() 
    { 
     //clear object manager does not work 
     //$om = $this->getObjectManager(); 
     //$om->clear(); 

     $content = $this->getContent(); 
     $this->setReportId($content['reportId']); 

     if (!empty($this->reportId)) { 
      try { 
       if (is_array($this->reportId)) { 
        foreach ($this->reportId as $reportId) { 
         $this->updateRank($reportId); 
        } 
        unset($reportId); 
       } else { 
        $this->updateRank($this->reportId); 
       } 
      } catch (\Exception $exception) { 
       echo "Exception message is {$exception->getMessage()} \n"; 
      } 
     } 
    } 

    private function updateRank($reportId) 
    { 
     /* @var $report Report */ 
     $report = $this->reportService->getReport($reportId); 
     $this->logInfo(print_r($report, true)); // this always return older db values, the values before it start queue deamon 

     if (!$report instanceof Report) { 
      return; 
     } 

     if (empty($rankData)) { 
      return; 
     } 

     //more codes, application related logics 

     $this->reportService->updateReportEntity($report); 
    } 

    private function setReportId($reportId) 
    { 
     if (is_numeric($reportId)) { 
      $this->reportId = array($reportId); 
     } elseif (is_array($reportId)) { 
      $this->reportId = $reportId; 
     } else { 
      throw new \Exception('Expects reportId as int or array'); 
     } 
    } 
} 
+0

Co oznacza "* Menedżer czystych obiektów nie działa" * znaczy? Czy otrzymujesz błąd? Jaki jest błąd? Czy nie ustawiono "ObjectManager"?Gdzie wstrzykniesz swój "ObjectManager"? Nie widzę konstruktora ... – Wilt

+0

Implementacja ObjectManagerAwareInterface i użycie ProvidesObjectManager, można wstrzykiwać obiekt ObjectManager z fabryki –

+0

Skomentowane wiersze z "clear object manager does not work" oznaczają, że nie opróżnia on menedżera obiektu i bieżącej transakcji. –

Odpowiedz

3

Jeśli masz na myśli to, że nie jest w pełni jasne, to pozornie this is not a bug, ale oczekiwane zachowanie.

Można sprawdzić the documentation chapter 7.5. dla zachowania na wywołanie metody clear:

Kiedy EntityManager # clear() jest wywoływana, wszystkie podmioty, które są obecnie zarządzane przez instancję EntityManager odkleiła.

W your comment mówiłeś „nie robi równo kierownik obiektu i obecna transakcja”. Nie jest to działanie, którego można się spodziewać po wywołaniu zgłoszenia. Odłączyć wyniki w następujących działań zgodnie z dokumentacją:

semantyki operacji odłączania, stosowanej do podmiotu X są następujące:

  • Jeśli X jest zarządzany podmiot, przyczyny działania Zdejmij to się odłącza. Operacja odłączania jest kaskadowana do jednostek, do których odwołuje się X, jeśli relacje od X do tych innych elementów są mapowane kaskadowo = DETACH lub cascade = ALL (patrz "Transitive Persistence"). Elementy, które poprzednio wskazywały X, będą nadal odwoływać się do X.
  • Jeśli X jest nowym lub odłączonym bytem, ​​jest ignorowane przez operację odłączenia.
  • Jeśli X jest usuniętą jednostką, operacja odłączania jest kaskadowana do elementów przywoływanych przez X, jeśli relacje od X do tych innych obiektów są mapowane kaskadowo = DETACH lub cascade = ALL (patrz "Transitive Persistence"). Elementy, które poprzednio wskazywały X, będą nadal odwoływały się do X.
+0

Moje oczekiwania zachowanie jest jasne ObjectManager przed wykonaniem poszczególnych zadań. Więc otrzymam zaktualizowane wyniki z mojego stolika przed rozpoczęciem pracy. –