2015-12-01 7 views
7

Ich habe ein ZF2-Projekt mit folgenden Konfigurationen. Es verwendet Doctrine ORM und SlmQueue. Da SlmQueue unsere Namenskonventionen und die Oracle-Datenbank nicht unterstützt, haben wir SlmQueueDoctrine angepasst.ZF2, Oracle, SlmQueueDoctrine, ClearObjectManagerStrategy funktioniert nicht

Ich vermute, dass mein Auftrag nicht ClearObjectManagerStrategy verwendet und den ObjectManager vor der Ausführung einzelner Jobs nicht löscht.

Es werden keine DB-Änderungen nach dem Start der Warteschlange angezeigt. Aber es wählt neue Werte aus, wenn ich den Warteschlangendämon abbringe und neu starte.

Wie implementiere ich ClearObjectManagerStrategy und den ObjectManager vor der Ausführung einzelner Jobs?

Ich habe versucht, viele ohne ein Glück näher gekommen.

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' 
      ) 
     ) 
    ) 
); 
?> 

Modul/Bericht/src/Report/Job/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

Was bedeutet * "Objektverwalter löschen funktioniert nicht" *? Erhalten Sie einen Fehler? Was ist der Fehler? Ist 'ObjectManager' nicht gesetzt?Wo injizierst du deinen 'ObjectManager'? Ich sehe keinen Konstruktor ... – Wilt

+0

Implementieren von ObjectManagerAwareInterface und mit Hilfe von ProvidesObjectManager können Sie den ObjectManager ab Werk injizieren –

+0

Die kommentierten Zeilen mit "Objektverwalter funktioniert nicht" bedeutet, dass Objektmanager und aktuelle Transaktion –

Antwort

3

Wenn du meinst, dass es nicht ganz klar ist dann scheinbar this is not a bug, aber erwartetes Verhalten.

können Sie überprüfen the documentation chapter 7.5. für das Verhalten auf den Aufruf der clear Methode:

Wenn EntityManager # clear() aufgerufen wird, werden alle Einheiten, die derzeit von der EntityManager-Instanz ablösen verwaltet werden.

In your comment sagte Sie "es nicht bündig Objektmanager des und aktuelle Transaktion". Dies ist keine Aktion, die Sie vom Aufrufen von clear erwarten können. Lösen Sie führt zu den folgenden Aktionen entsprechend der Dokumentation:

Die Semantik der DETACH-Operation angewendet wird, auf eine Einheit X sind wie folgt:

  • Wenn X eine verwaltete Einheit ist, die Trennvorgang Ursachen es wird losgelöst. Die Detach-Operation wird an Entitäten kaskadiert, auf die mit X verwiesen wird, wenn die Beziehungen von X zu diesen anderen Entitäten mit cascade = DETACH oder cascade = ALL verknüpft sind (siehe "Transitive Persistence"). Entitäten, die zuvor auf X verwiesen haben, verweisen weiterhin auf X.
  • Wenn X eine neue oder gelöschte Entität ist, wird sie von der DETACH-Operation ignoriert.
  • Wenn X eine entfernte Entität ist, wird die DETACH-Operation in die mit X referenzierten Entitäten kaskadiert, wenn die Beziehungen von X zu diesen anderen Entitäten mit cascade = DETACH oder cascade = ALL verknüpft sind (siehe "Transitive Persistence"). Entitäten, die zuvor X referenziert haben, verweisen weiterhin auf X.
+0

My expected nicht gelöscht werden Verhalten ist vor der Ausführung einzelner Jobs der ObjectManager. So werde ich aktualisierte Ergebnisse von meiner Tabelle erhalten, bevor ich einen Job ausführe. –