Fehler bei Artikel-Update über API

hi, ich habe ein Import-Plugin welches Artikeldaten über ein CSV einliest und dann über die lokale API an Shopware übergibt. Im Grunde funktioniert alles bestens. Wenn ich aber versuche größere Datenmengen mehrmals hintereinander einzuspielen bekomme ich bei vorhanden Artikeln (update) sehr oft folgenden Fehler geworfen: [2014-12-18 04:01:00] plugin.DEBUG: Article-Update on Import: exception 'Shopware\Components\Api\Exception\OrmException' with message 'The EntityManager is closed.' in /data/wwwcust/wa1-11/html/engine/Shopware/Components/Api/Resource/Resource.php:266 Stack trace: #0 /data/wwwcust/wa1-11/html/engine/Shopware/Components/Api/Resource/Article.php(621): Shopware\Components\Api\Resource\Resource-\>flush() #1 /data/wwwcust/wa1-11/html/engine/Shopware/Plugins/Local/Backend/MeinPlugin/Components/Articles.php(424): Shopware\Components\Api\Resource\Article-\>update(1402, Array) #2 /data/wwwcust/wa1-11/html/engine/Shopware/Plugins/Local/Backend/MeinPlugin/Controllers/Backend/HqsImport.php(44): Shopware\_Plugins\_Backend\_MeinPlugin\_Components\_Articles-\>importArticlesFromCSV() #3 /data/wwwcust/wa1-11/html/engine/Library/Enlight/Controller/Action.php(159): Shopware\_Controllers\_Backend\_HqsImport-\>indexAction() #4 /data/wwwcust/wa1-11/html/engine/Library/Enlight/Controller/Dispatcher/Default.php(528): Enlight\_Controller\_Action-\>dispatch('indexAction') #5 /data/wwwcust/wa1-11/html/engine/Library/Enlight/Controller/Front.php(228): Enlight\_Controller\_Dispatcher\_Default-\>dispatch(Object(Enlight\_Controller\_Request\_RequestHttp), Object(Enlight\_Controller\_Response\_ResponseHttp)) #6 /data/wwwcust/wa1-11/html/engine/Shopware/Kernel.php(141): Enlight\_Controller\_Front-\>dispatch() #7 /data/wwwcust/wa1-11/html/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php(472): Shopware\Kernel-\>handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #8 /data/wwwcust/wa1-11/html/engine/Shopware/Components/HttpCache/AppCache.php(256): Symfony\Component\HttpKernel\HttpCache\HttpCache-\>forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL) #9 /data/wwwcust/wa1-11/html/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php(243): Shopware\Components\HttpCache\AppCache-\>forward(Object(Symfony\Component\HttpFoundation\Request), true) #10 /data/wwwcust/wa1-11/html/engine/Shopware/Components/HttpCache/AppCache.php(102): Symfony\Component\HttpKernel\HttpCache\HttpCache-\>pass(Object(Symfony\Component\HttpFoundation\Request), true) #11 /data/wwwcust/wa1-11/html/shopware.php(109): Shopware\Components\HttpCache\AppCache-\>handle(Object(Symfony\Component\HttpFoundation\Request)) #12 {main} [] {"uid":"a540b6d"} Warum “The EntityManager closed is” bleibt mir ein Rätsel. Es passiert nicht bei jedem Artikel aber nur bei Artikeln die schon vorhanden sind. Mein API-Call sieht folgendermaßen aus: try { $getArticle = $this-\>articleResource-\>getOneByNumber($articleParams['mainDetail']['number']); $insertedId = $getArticle['id']; } catch (\Exception $e) { $this-\>\_\_log( "getIdFromNumber on Import: " . $articleParams['mainDetail']['number'] . ' =\> ' . $e ); } if ($insertedId) { try { $inserted = $this-\>articleResource-\>update($insertedId, $articleParams); $this-\>\_\_log( "Article-Update on Import: " . $articleParams['mainDetail']['number'] . ' =\> ' . $i . '/' . $total ); } catch (\Exception $e) { $this-\>\_\_log("Article-Update on Import: " . $e); } } else { try { $inserted = $this-\>articleResource-\>create($articleParams); $this-\>\_\_log( "Article-Import on Import: " . $articleParams['mainDetail']['number'] . ' =\> ' . $i . '/' . $total ); $insertedId = $inserted-\>getId(); } catch (\Exception $e) { $this-\>\_\_log("Article-Import Import: " . $e); continue; } } Ich habe versucht hier so viel wie möglich abzufangen aber irgendwann steigt er halt immer aus. Die Artikel Daten sind korrekt. Beim initialen Import wird alles korrekt angelegt und auch bei kleineren Datenmengen ist das Update kein Problem. Welchen Grund kann es für die Exception geben? Wie könnte ich das noch besser Debuggen? Vielen Dank,

In der Regel wird der entitiy manager geschlossen, sobald eine db exception geworfen wird. Wenn man anschließend zb ein flush() ausführt, dann erhält man die entity manager closed exception. Hier müsstest du dir mal die log Dateien anschauen, was da schief läuft. Du kannst übrigens prüfen, ob der entity manager noch offen ist und entsprechend reagieren: ( Shopware()->Models()->isOpen() == true ) Viele Grüße

Hi, es ist genau wie Aquatuning sagt. Idealerweise verwendest du die batch-Methode, wenn du mehrere Artikel importieren möchtest, dann kümmert sich Shopware um die Entscheidung, ob es ein Update ist oder ein Create und resettet den EntityManager, falls es auf der Connection Probleme gab. Viele Grüße, Daniel

[quote=„Aquatuning GmbH“]In der Regel wird der entitiy manager geschlossen, sobald eine db exception geworfen wird. Wenn man anschließend zb ein flush() ausführt, dann erhält man die entity manager closed exception. Hier müsstest du dir mal die log Dateien anschauen, was da schief läuft. Du kannst übrigens prüfen, ob der entity manager noch offen ist und entsprechend reagieren: ( Shopware()->Models()->isOpen() == true ) Viele Grüße[/quote] hallo und danke für die Antwort. Leider wird in die Logs nicht mehr geschrieben. Ich fange die Exception ja ab und da wird nur die Meldung von oben geworfen. Ich kann also nicht erkennen warum die Exception geworfen wird. Wenn der Entity Manager geschlossen ist, reicht es dann wenn ich einfach ein erneutes update bzw. create ausführe? Vielen Dank.

[quote=„Daniel Nögel“]Idealerweise verwendest du die batch-Methode, wenn du mehrere Artikel importieren möchtest, dann kümmert sich Shopware um die Entscheidung, ob es ein Update ist oder ein Create und resettet den EntityManager, falls es auf der Connection Probleme gab. [/quote] Vielen Dank, die batch-Methode nutze ich zum Beispiel bei Varianten, da funktioniert es auch wunderbar. Die normalen Artikeln könnten bei mir sehr viele sein (2000-8000) und da befürchte ich einen Timeout. Deswegen gehe ich die Artikel in einer Schleife durch, breche diese dann vor der max_execution_time ab und rufe meinen Importer dann mit dem nächsten chunk wieder auf. das funktioniert soweit gut nur wird mir nach dem 2. oder 3. Import dann halt bei vielen Artikeln (ca. 1000 von 2000) die oben genannte Exception geworfen.

Hallo! Eine Frage habe ich bei dem Thema - seit wann steht denn die Batch-Methode in der lokalen API Nutzung zur Verfügung? Ich dachte, dass funktioniert nur in der REST-Variante (keine ID angeben). Wenn das geht, bin ich natürlich SEHR interessiert, wie das funktionieren kann! Schöne Grüße, Niklas

1 Like

Klasse, das habe ich wirklich übersehen! Interessant wäre, wieviel schneller der Batch-Modus im Vergleich zu einzelnen Updates und Creates ist. Das werde ich mal testen, war vom Tempo eigentlich bei uns mit der Anbindung sehr zufrieden, aber schneller ist ja immer besser :slight_smile: Vielen Dank! Niklas