Pra*_*aya 7 php oracle queue doctrine zend-framework2
我有一个ZF2项目,具有以下配置.它使用的是Doctrine ORM和SlmQueue.由于SlmQueue不支持我们的命名约定和oracle数据库,因此我们定制了SlmQueueDoctrine.
我怀疑我的工作不是使用ClearObjectManagerStrategy,并且在执行单个作业之前不清除ObjectManager.
它在队列启动后不反映数据库修改.但是如果我杀死队列守护进程并重新开始,它会选择新的值.
如何在执行单个作业之前实现ClearObjectManagerStrategy并清除ObjectManager?
我试过很多没有运气的人.
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.*"
}
}
Run Code Online (Sandbox Code Playgroud)
配置/自动加载/ 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'
)
)
)
);
?>
Run Code Online (Sandbox Code Playgroud)
模块/报告/ src目录/报告/招聘/ 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');
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的意思是它不完全清楚,那么显然这不是一个错误,而是预期的行为。
\n\n您可以查看文档第7.5章。对于调用该clear方法时的行为:
\n\n\n当调用 EntityManager#clear() 时,当前由 EntityManager 实例管理的所有实体都会被分离。
\n
在您的评论中,您说“它不会刷新对象管理器和当前事务”。这不是您可以通过调用clear 来期望的操作。根据文档分离以下操作的结果:
\n\n\n\n应用于实体 X 的分离操作的语义如下:
\n\n\n
\n- 如果 X 是受管实体,则分离操作会导致其分离。如果从 X 到这些其他实体的关系使用cascade=DETACH 或cascade=ALL 映射,则分离操作会级联到X 引用的实体(请参阅\xe2\x80\x9cTransitive Persistence\xe2\x80\x9d)。先前引用 X 的实体将继续引用 X。
\n- 如果 X 是新的或分离的实体,则分离操作将忽略它。
\n- 如果 X 是已删除的实体,则分离操作将级联到 X 引用的实体,前提是从 X 到这些其他实体的关系使用cascade=DETACH 或cascade=ALL 进行映射(请参阅 \xe2\x80\x9cTransitive Persistence\xe2\x80 \x9d)。先前引用 X 的实体将继续引用 X。
\n