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');
}
}
}
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
Implementieren von ObjectManagerAwareInterface und mit Hilfe von ProvidesObjectManager können Sie den ObjectManager ab Werk injizieren –
Die kommentierten Zeilen mit "Objektverwalter funktioniert nicht" bedeutet, dass Objektmanager und aktuelle Transaktion –