Cron / ScheduledTask funktioniert nicht

Hallo!

Im Gitter Channel konnte mir leider nicht geholfen werden, daher hier mein nächster Versuch.

Und zwar bekomme ich die ScheduledTasks nicht an laufen (in einer prod. EA2 Umgebung).
Das Beispiel unter https://github.com/shopware/swag-docs-scheduled-task-plugin bzw. https://docs.shopware.com/en/shopware-platform-dev-en/how-to/scheduled-tasks funktioniert bei mir auch nicht.

Ich starte die Tasks über …

./bin/console scheduled-task:run

in Kombination mit

./bin/console messenger:consume

Der Scheduled Task verbleibt als queued:


Wenn ich ein Plugin analog dazu baue, verhält es sich identisch.
Was muss ich tun? Die Crons sind ziemlich wichtig …

Schöne Grüße,
Niklas

Hallo Niklas, 

wie hast du die MessageQueue konfiguriert? Ich vermute das die Messages nicht mehr ausgelesen werden können.

Wenn du den scheduled-task:run command ausführst sollten Messeges in die Queue gelegt werden die dann über messenger:consume abgearbeitet werden.

Kannst du den bin/console messenger:consume command mall mit der -vv Flag starten, der sollte die Messeges die abgearbeitet werden dann in der Konsole loggen.

Viele Grüße 
Jonas

Hi Jonas,

ich glaube das Problem bisher war, dass der messenger:consume irgendwann abraucht (MySQL server has gone away).
Das scheint sich mit dem --time-limit flag zu lösen, damit er nicht wegfliegt.

Ich habe mein Problem jetzt gelöst, indem ich scheduled-task:run und messenger:consume hintereinander per custom storefront controller durchlaufen lassen.
Im Prinzip wie der eine Test-Case von euch. So habe ich jetzt “quasi” die gleiche Funktionalität wie früher über backend/cron

Schöne Grüße,
Niklas

Kurze Offtopic Frage - eventuell hast du das schon gelöst @TeichDatensysteme‍ . Da der contructor nicht überschrieben werden kann in der vererbten ScheduledTask Klasse, kann ich nicht über DI die Plugin Config übergeben. Wie bekomme ich den Task konfigurierbar im Backend? Oder hab ich die Cronjob/Scheduled Task Option übersehen im Backend?

 

 

@Misengo‍ Bisher gibt es da nichts im Backend zu, wie ich das sehe.
Zum Cron: Also, bisher kenne ich nur das, wie es im Beispiel auch gelöst wird.

  • …Task erbt von ScheduledTask

  • …TaskHandler erbt vom ScheduledTaskHandler und hat den …Task als getHandlesMessages drin

  • dein eig. Task Handler kann im Constructor reinbekommen was Du willst, du kannst (und sollst) den parent Constructor aufrufen, z.B.
     

      /**
       * StockTaskHandler constructor.
       *
       * @param EntityRepositoryInterface $scheduledTaskRepository
       * @param SystemConfigService $systemConfigService
       * @param StockService $stockService
       */
    
      public function __construct(
          EntityRepositoryInterface $scheduledTaskRepository,
          SystemConfigService $systemConfigService,
          StockService $stockService)
      {
    
          parent::__construct($scheduledTaskRepository);
    
          $this->systemConfigService = $systemConfigService;
          $this->stockService = $stockService;
    
      }
    

 

  • …Task in die services.xml mit dem tag name 

  • …TaskHandler in die services.xml mit deinen Abhängigkeiten und dem tag:

Danach sollte der laufen. 

@TeichDatensysteme schrieb:

@Misengo‍ Bisher gibt es da nichts im Backend zu, wie ich das sehe.
Zum Cron: Also, bisher kenne ich nur das, wie es im Beispiel auch gelöst wird.

  • …Task erbt von ScheduledTask
  • …TaskHandler erbt vom ScheduledTaskHandler und hat den …Task als getHandlesMessages drin
  • dein eig. Task Handler kann im Constructor reinbekommen was Du willst, du kannst (und sollst) den parent Constructor aufrufen, z.B.
     

/**

  • StockTaskHandler constructor.
  • @param EntityRepositoryInterface $scheduledTaskRepository
  • @param SystemConfigService $systemConfigService
  • @param StockService $stockService
    */

public function __construct(
EntityRepositoryInterface $scheduledTaskRepository,
SystemConfigService $systemConfigService,
StockService $stockService)
{

parent::__construct($scheduledTaskRepository);

$this->systemConfigService = $systemConfigService;
$this->stockService = $stockService;

}

 

  • …Task in die services.xml mit dem tag name 

  • …TaskHandler in die services.xml mit deinen Abhängigkeiten und dem tag:

Danach sollte der laufen. 

Ja, das ist klar. Aber es geht nicht um den Handler , sondern um den Task, welcher am Ende ja angibt wann das Ding laufen soll über die getDefaultInterval()

Habe die Lösung gefinden -> https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/erd/shopware-core-framework-scheduledtask

In dieser Tabelle stehen alle Tasks mit dem Intervall. Wird vermutlich später einfach ein Backend-Modul geben, welches über die API darauf zugreift und dieses Updated.

Naja, Du hast ja ua. danach gefragt: „Da der contructor nicht überschrieben werden kann in der vererbten ScheduledTask Klasse, kann ich nicht über DI die Plugin Config übergeben.“ Darauf habe ich geantwortet :wink: Auch der Hinweis, dass im Backend aktuell noch keine Crob Übersicht ist - die Einsicht gibt es aktuell über die DB Tabelle - korrekt.