2015-12-01 11 views
7

मेरे पास निम्न कॉन्फ़िगरेशन के साथ एक ZF2 प्रोजेक्ट है। यह सिद्धांत ओआरएम और एसएलएमक्यूयू का उपयोग कर रहा है। चूंकि SlmQueue हमारे नामकरण सम्मेलनों और ऑरैक डेटाबेस का समर्थन नहीं कर रहा है, इसलिए हमने SlmQueueDoctrine को अनुकूलित किया है।जेडएफ 2, ओरेकल, एसएलएमक्यूयूडॉक्ट्राइन, ClearObjectManagerStrategy काम नहीं कर रहा है

मुझे संदेह है कि मेरा काम ClearObjectManagerStrategy का उपयोग नहीं कर रहा है और व्यक्तिगत नौकरियों के निष्पादन से पहले ऑब्जेक्टमेनर को साफ़ नहीं करता है।

यह कतार शुरू होने के बाद डीबी संशोधनों को प्रतिबिंबित नहीं करता है। लेकिन अगर मैं कतार डिमन को मारता हूं और फिर से शुरू करता हूं तो यह नए मान उठाता है।

मैं व्यक्तिगत नौकरियों के निष्पादन से पहले ClearObjectManagerStrategy को कैसे कार्यान्वित कर सकता हूं और ऑब्जेक्टमेनगर को साफ़ कर सकता हूं?

मैंने भाग्य के बिना कई लोगों से संपर्क करने की कोशिश की है।

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

मॉड्यूल/रिपोर्ट/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'); 
     } 
    } 
} 
+0

* "स्पष्ट ऑब्जेक्ट प्रबंधक काम नहीं करता" * क्या मतलब है? क्या आपको कोई त्रुटि मिलती है? त्रुटि क्या है? क्या 'ऑब्जेक्ट प्रबंधक' सेट नहीं है?आप अपने 'ऑब्जेक्ट प्रबंधक' कहां से इंजेक्ट करते हैं? मुझे एक कन्स्ट्रक्टर नहीं दिख रहा है ... – Wilt

+0

ऑब्जेक्टमैनेजरएवेयर इंटेरफेस को कार्यान्वित करना और ProvidesObjectManager का उपयोग करके, आप फैक्टरी –

+0

से ऑब्जेक्टमेनगर को इंजेक्ट कर सकते हैं। "स्पष्ट ऑब्जेक्ट मैनेजर काम नहीं करता" के साथ टिप्पणी की गई पंक्ति का मतलब है कि यह ऑब्जेक्ट मैनेजर और वर्तमान लेनदेन को फ्लश नहीं करता है –

उत्तर

3

यदि आपका मतलब है कि यह स्पष्ट रूप से स्पष्ट नहीं है तो स्पष्ट रूप से this is not a bug, लेकिन अपेक्षित व्यवहार।

आप देख सकते हैं व्यवहार के लिए the documentation chapter 7.5.clear विधि बुला पर:

जब स्पष्ट EntityManager #() उत्पन्न होता है, सभी संस्थाओं है कि वर्तमान में EntityManager उदाहरण द्वारा प्रबंधित किया जाता अलग हो जाते हैं।

your comment में आप ने कहा "फ्लश वस्तु प्रबंधक की और वर्तमान लेन-देन नहीं करता है"। यह एक ऐसी क्रिया नहीं है जिसे आप साफ़ करने से उम्मीद कर सकते हैं। दस्तावेज़ के अनुसार निम्न क्रियाओं में परिणाम अलग करें:

अलग आपरेशन, एक इकाई एक्स के लिए लागू के शब्दों

इस प्रकार हैं:

  • हैं एक्स एक प्रबंधित इकाई, अलग आपरेशन कारणों है यह अलग हो गया। एक्सचेंज ऑपरेशन एक्स द्वारा संदर्भित इकाइयों को कैस्केड किया जाता है, यदि एक्स से इन अन्य इकाइयों के रिश्तों को कैस्केड = डेट या कैस्केड = ऑल के साथ मैप किया जाता है (देखें "ट्रांजिटिव पर्सिस्टेंस")। पूर्व में संदर्भित इकाइयां एक्स को संदर्भित करती रहेंगी।
  • यदि एक्स एक नई या अलग इकाई है, तो इसे अलग-अलग ऑपरेशन द्वारा अनदेखा किया जाता है।
  • यदि एक्स एक हटाई गई इकाई है, तो एक्स को संदर्भित इकाइयों के लिए अलग-अलग इकाइयों को अलग किया जाता है, यदि एक्स से इन अन्य इकाइयों के रिश्तों को कैस्केड = डेटा या कैस्केड = ऑल के साथ मैप किया जाता है (देखें "ट्रांजिटिव पर्सिस्टेंस")। पूर्व में संदर्भित इकाइयां एक्स को संदर्भित करती रहेंगी।
+0

मेरी अपेक्षा है अलग-अलग नौकरियों के निष्पादन से पहले ऑब्जेक्ट मैनेजर स्पष्ट है। इसलिए नौकरी चलाने से पहले मुझे अपनी टेबल से अद्यतन परिणाम मिलेंगे। –

संबंधित मुद्दे