<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Howto on wt-modules</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/howto-use/</link><description>Recent content in Howto on wt-modules</description><generator>Hugo</generator><language>de</language><atom:link href="https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/howto-use/index.xml" rel="self" type="application/rss+xml"/><item><title>Service API</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/howto-use/service-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/howto-use/service-api/</guid><description>&lt;p&gt;Benachbarte Module fragen den Status des Moduls über eine stabile, schreibgeschützte Schnittstelle (&lt;code&gt;CronjobService&lt;/code&gt;) ab, anstatt auf dessen interne Dienste zurückzugreifen. Überprüfen Sie zunächst die Verfügbarkeit –&#10;das Modul ist möglicherweise nicht installiert, und die Klasse kann nur automatisch geladen werden, wenn die Datei&#10;&lt;a href="https://github.com/bschwede/wt-cronjob/tree/main/module.php" target="_blank" rel="noopener"&gt;&lt;code&gt;module.php&lt;/code&gt;&lt;/a&gt;&#10; geladen wurde:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#91d7e3;font-weight:bold"&gt;&amp;lt;?&lt;/span&gt;php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c6a0f6"&gt;use&lt;/span&gt; Schwendinger\Webtrees\Module\Cronjob\Services\CronjobService;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c6a0f6"&gt;if&lt;/span&gt; (class_exists(CronjobService&lt;span style="color:#91d7e3;font-weight:bold"&gt;::&lt;/span&gt;&lt;span style="color:#8aadf4"&gt;class&lt;/span&gt;) &lt;span style="color:#91d7e3;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; CronjobService&lt;span style="color:#91d7e3;font-weight:bold"&gt;::&lt;/span&gt;&lt;span style="color:#8aadf4"&gt;isFunctional&lt;/span&gt;()) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f4dbd6"&gt;$status&lt;/span&gt; &lt;span style="color:#91d7e3;font-weight:bold"&gt;=&lt;/span&gt; CronjobService&lt;span style="color:#91d7e3;font-weight:bold"&gt;::&lt;/span&gt;&lt;span style="color:#8aadf4"&gt;jobStatus&lt;/span&gt;(&lt;span style="color:#a6da95"&gt;&amp;#39;mymodule:backup&amp;#39;&lt;/span&gt;); &lt;span style="color:#6e738d;font-style:italic"&gt;// null = unknown job&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f4dbd6"&gt;$age&lt;/span&gt; &lt;span style="color:#91d7e3;font-weight:bold"&gt;=&lt;/span&gt; CronjobService&lt;span style="color:#91d7e3;font-weight:bold"&gt;::&lt;/span&gt;&lt;span style="color:#8aadf4"&gt;lastTickAge&lt;/span&gt;(); &lt;span style="color:#6e738d;font-style:italic"&gt;// seconds since last tick&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f4dbd6"&gt;$listened&lt;/span&gt; &lt;span style="color:#91d7e3;font-weight:bold"&gt;=&lt;/span&gt; CronjobService&lt;span style="color:#91d7e3;font-weight:bold"&gt;::&lt;/span&gt;&lt;span style="color:#8aadf4"&gt;listenedEvents&lt;/span&gt;(); &lt;span style="color:#6e738d;font-style:italic"&gt;// event name =&amp;gt; job names&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Frage&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Methode(n)&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ist der Dienst funktionsfähig?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;isFunctional()&lt;/code&gt;, &lt;code&gt;problems()&lt;/code&gt; (Codes: &lt;code&gt;module_disabled&lt;/code&gt;, &lt;code&gt;not_migrated&lt;/code&gt;, &lt;code&gt;cron_library_missing&lt;/code&gt;, &lt;code&gt;tick_stale&lt;/code&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Welche Funktionen sind aktiviert?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;features()&lt;/code&gt; (&lt;code&gt;watch&lt;/code&gt;, &lt;code&gt;pseudo_events&lt;/code&gt;, &lt;code&gt;route_events&lt;/code&gt;), &lt;code&gt;watchStatus()&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wann wurde der letzte Tick ausgeführt?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;lastTick()&lt;/code&gt; / &lt;code&gt;lastTickAge()&lt;/code&gt; – beide Trigger-Typen (Marker-Datei &lt;code&gt;data/cronjob/tick.last&lt;/code&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ist ein Job aktiviert / wann wurde er zuletzt ausgeführt?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;isJobEnabled($name)&lt;/code&gt;, &lt;code&gt;jobStatus($name)&lt;/code&gt;, &lt;code&gt;lastRun($name)&lt;/code&gt; – Jobnamen sind mit einem Namespace versehen (&lt;code&gt;&amp;lt;Modul&amp;gt;:&amp;lt;Name&amp;gt;&lt;/code&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Auf welche Ereignisse wird gewartet?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;listenedEvents()&lt;/code&gt;, &lt;code&gt;listenersFor($event)&lt;/code&gt;; Kataloge: &lt;code&gt;eventCatalog()&lt;/code&gt;, &lt;code&gt;pseudoEvents()&lt;/code&gt;, &lt;code&gt;routeEvents()&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Aktionen (die einzigen beiden)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;runJobNow($name)&lt;/code&gt; (wird beim nächsten Tick in die Warteschlange gestellt), &lt;code&gt;pushEvent($name, $payload)&lt;/code&gt; (Ereigniswarteschlange)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Vertrag: Schreibgeschützte Methoden lösen niemals einen Fehler aus, wenn das Schema fehlt (sichere Standardwerte),&#10;Beschreibungen sind Quelltext-Strings (werden niemals vorab übersetzt), und &lt;code&gt;lastRun()&lt;/code&gt; schließt bewusst&#10;die Job-Ausgabe aus, da diese personenbezogene Daten enthalten kann.&lt;/p&gt;</description></item><item><title>Selbst-Registrierung</title><link>https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/howto-use/self-registration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/howto-use/self-registration/</guid><description>&lt;p&gt;Andere Module können ihre &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/cli-scripts/"&gt;geplanten Jobs&lt;/a&gt; &lt;em&gt;anbieten&lt;/em&gt;, damit sie in der Admin-UI erscheinen, ohne dass jemand die Registry manuell editiert. Dazu können zwei Wege beschritten werden (ein Modul kann beide verwenden) - beide werden automatisch bei jedem &lt;a href="https://bschwede.codeberg.page/wt-modules/de/docs/cronjob/tick/"&gt;Tick&lt;/a&gt; entdeckt, wobei dies nur für &lt;strong&gt;aktivierte&lt;/strong&gt; Module gilt:&lt;/p&gt;&#10;&lt;h2 id="marker-methode"&gt;Marker-Methode&lt;a class="td-heading-self-link" href="#marker-methode" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;getCronJobs(): array&lt;/code&gt; in der Modul-&lt;a href="https://github.com/bschwede/wt-cronjob/tree/main/module.php" target="_blank" rel="noopener"&gt;&lt;code&gt;module.php&lt;/code&gt;&lt;/a&gt;&#10;-Klasse, die dasselbe Format zurückgibt. Entsprechend: &lt;code&gt;getModuleEvents(): array&lt;/code&gt;, &lt;code&gt;getModuleCommands(): array&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="manifest-datei-empfohlen"&gt;Manifest-Datei (empfohlen)&lt;a class="td-heading-self-link" href="#manifest-datei-empfohlen" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Bereitstellung einer Datei im Modulverzeichnis (&lt;code&gt;modules_v4/&amp;lt;module&amp;gt;/cron-jobs.php&lt;/code&gt;), die ein Array von Job-Spezifikationen zurückgibt:&lt;/p&gt;</description></item></channel></rss>