Releases: sos-berlin/js7
v2.0.0-alpha.20210722.2
- FIX:
Order.scheduledfor
wirkt nun auch, wenn die erste Anweisung nichtExecute
ist, alsoPostNotice
,ExpectNotice
,Lock
,Fail
,Fork
oderPrompt
. - Das neue Kommando
DeleteNotice
löscht eine Notiz.
DiePostNotice
-Anweisung kann jederzeit eine Notiz mit derselben NoticeId erneut erzeugen.
v2.0.0-alpha.20210722
- Falls schon Boards benutzt worden sind: Das Journal hat sich geändert. Bitte löscht alle state-Verzeichnisse.
- Umbenennungen für Boards:
ExpectNotice
ersetzt die AnweisungReadNotice
Board.postOrderToNoticeId
ersetzt.toNotice
Board.expectOrderToNoticeId
ersetzt.readingOrderToNoticeId
- FIX: Board wird vom Cluster repliziert.
- FIX: Als gelöscht markierte FileWatchs werden vom Cluster repliziert.
- Board kann gelöscht werden.
JBoard
für die Java-Schnittstelle- Workflows verlangen, dass die referenzierten Boards bekannt sind.
- Boards können gelöscht werden.
- CancelOrders ist überarbeitet.
- SIGKILL nach SIGTERM funktionierte gelegentlich nicht.
- CancelOrder während des Prozessstarts funktioniert besser.
v2.0.0-alpha.20210720
- Java-Schnittstelle für Board erweitert um
- JBoard
- JControllerState.pathToBoard
- sigkillDelay = 0.s führt unmittelbar zu SIGKILL, ohne vorheriges SIGTERM.
- WorkflowJob.timeout misst die Zeit ab kurz nach dem Start.
v2.0.0-alpha.20210716
- Board and Notice für Mitteilungen zwischen Aufträgen
- Ausdrücke Reguläre Ausdrücke zur String-Ersetzung
- HTTP-Schnittstelle verträgt beliebig große JSON-Objekte
- Job mit Timeout
Board and Notice
JS7 kennt jetzt benannte schwarze Bretter, an denen Notizen haften.
- Ein Auftrag kann für einen anderen Auftrag (oder sich selbst) eine Notiz hinterlassen.
- Eine Notiz hat eine
NoticeId
, die für das jeweilige schwarze Brett gilt. - Ein Auftrag kann eine Notiz an ein schwarzes Brett heften
- und dabei mit einer Termin versehen, ab dem JS7 die Notiz entfernen kann.
- Ein Auftrag kann auf eine Notiz mit einer bestimmten
NoticeId
warten.
Board
Ein Board
ist ein UnsignedSimpleItem
(nicht signiert, nicht versioniert) und hat die Parameter
path: BoardPath
toNotice: Expression
- Ausdruck, der für die Anweisung
PostNotice
eineNoticeId
liefert.
- Ausdruck, der für die Anweisung
endOfLife: Expression
Ausdruck, der für die AnweisungPostNotice
den Zeitpunkt liefert, bis wann die Notiz gelten soll, ausgedrückt als Anzahl Millisekunden seit 1970-01-01, 0 Uhr, UTC. Dann wird JS7 die Notiz löschen.readingOrderToNoticeId
- Ausdruck, der für die Anweisung
ReadNotice
eineNoticeId
liefert.
- Ausdruck, der für die Anweisung
Die Ausdrücke haben Zugriff auf den Auftrag ($js7OrderId
, Auftragsvariablen) und die Uhr ($epochMilli
).
JSON-Beispiel, das die NoticeId aus dem Tagesplantag einer OrderId "#yyyy-mm-dd#..." errechnet:
{
"TYPE": "Board",
"path": "MY-BOARD",
"toNotice": "replaceAll($js7OrderId, '^#([0-9]{4}-[0-9]{2}-[0-9]{2})#.*$', '$1')",
"endOfLife": "$epochMillis + 24 * 3600 * 1000",
"readingOrderToNoticeId": "replaceAll($js7OrderId, '^#([0-9]{4}-[0-9]{2}-[0-9]{2})#.*$', '$1')"
}
Anweisung PostNotice
Platziert eine Notiz auf dem genannten schwarzen Brett. Eine vielleicht vorhandene Notiz (mit derselben NoticeId) wird ersetzt.
noticeId
und endOfLife
der Notiz werden mit den im Board angegebenen Ausdrücken errechnet, sodass bei der Anweisung kein weiterer Parameter erforderlich ist.
JSON
{
"TYPE": "PostNotice",
"boardPath": "MY-BOARD"
}
Anweisung ReadNotice
JSON
{
"TYPE": "ReadNotice",
"boardPath": "MY-BOARD"
}
Die noticeId
der Notiz wird mit den im Board angegebenen Ausdruck errechnet,
so dass bei der Anweisung kein weiterer Parameter erforderlich ist.
Wenn die verlangte Notiz nicht auf dem schwarzen Brett ist, wartet die Anweisung,
bis ein anderer Auftrag die mit postNotice
anheftet.
replaceAll
replaceAll(string: String, regex: String, replacement: String)
Analog zu Javas (replaceAll)[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String-].
Zur Angabe von $
und \
in replacement
: Wenn Gruppen aus regex
in replacement
verwendet werden, also etwa $1
, dann ist $1
keine Variable der Ausdruckssprache, sondern von replaceAll
, wie in replace($myString, 'x', '-->$1<--')
. replacement
ist also ein String in Apostrophen. replace($myString, 'x', "-->$1<--")
dagegen würde $1
der Ausdruckssprache verwenden und nicht das gewünscht Ergebnis liefern (wahrscheinlich wird es scheitern).
HTTP-Schnittstelle verträgt beliebig große JSON-Objekte
Die Web-Services für Events, Cluster-Replikation, Items und neue Aufträge teilen den HTTP-Strom in Chunks auf, die jetzt unabhängig von den Größen der JSON-Objekte sind.
Job timeout
Ein Job kann mit einem Timeout versehen werden.
Wenn nach Verstreichen der Zeit der Job noch läuft, dann bricht JS7 ihn ab
und geht dabei wie bei CancelOrder
vor.
sigkillDelay
wird beachtet.
Der Auftragsschritt scheitert, was mit try/catch abgefangen werden kann.
WorkflowJob mit einer Frist von 60 Sekunden, in JSON:
{
"agentPath": "AGENT",
"executable": {
...
},
"timeout": 60
}
Outcome in JSON:
{
"TYPE": "TimedOut",
"outcome": {
"TYPE": "Failed",
"namedValues": {
"returnCode": 143
}
}
}
Die Java-Schnittstelle kennt das neue JOutcome.TimedOut(Outcome)
.
v2.0.0-alpha.20210706
- FIX: HTTPS nutzt
KeyManagerFactory.getDefaultAlgorithm
zur Kompatibilität mit IBM Java (und anderen). - FIX: Zweiter Suspend eines Auftrags auf demselben Agenten funktioniert jetzt..
- FIX: Bessere Fehlermeldung, wenn Agent nicht zum Controller passt
- FIX:
docker stop
im Docker-Beispiel führt ordentlich zum Shutdown. - FIX:
JProxyContext.close
schließt den Threadpool. - FIX:
JSuspensionMode.standard
, um einen Auftrag zu suspendieren, ohne den Prozess abzubrechen. - Ausdrücke können multiplizieren und dividieren (Division noch nicht ganzzahlig)
v2.0.0-alpha.20210628
- Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
Parameter-Deklaration und Auftragsvariablen
- FileWatch-Aufträge werden gegen die Parameter-Deklaration geprüft und erhalten Default-Werte.
- Default-Werte für Auftragsparameter sind jetzt Ausdrücke.
- Auftragsvariablen werden jetzt als eine Art Auftragsparameter angesehen. Drei Fälle werden unterschieden:
- Required (JSON-Feld
valueType
)- Der Parameter muss angegeben werden.
- Optional (JSON-Felder
valueType
unddefault
: Expression)- Der Parameter kann angegeben werden.
- Final (JSON-Felder
valueType
undfinal
: Expression)- Der Parameter kann nicht bei addOrder angegeben werden.
Der Wert kommt nur aus dieser Deklaration im Workflow.
- Der Parameter kann nicht bei addOrder angegeben werden.
- Required (JSON-Feld
JobResource.variables
ersetzt.settings
.Workflow.orderPreparation
ersetztorderRequirements
Ausschnitt aus einem Workflow-JSON:
"orderPreparation": {
"parameters": {
"myRequired": {
"type": "Boolean"
},
"myOptional": {
"type": "Number",
"default": "7"
},
"myFinal": {
"final": "'FINAL'"
}
},
"allowUndeclared": true
}
orderPreparation
ist optional.
Wenn orderPreparation
fehlt, nimmt JS7 allowUndeclared = true
an
Die Variablen einer JobResource in einem Ausdruck
- Neue Funktion
jobResourceVariable
für variablen Zugriff auf Variablen einer JobResource.- jobResourceVariable("JOB-RESOURCE-PATH", "VARIABLE")
- Neue Funktion
jobResourceVariables
für Zugriff auf alle Variablen einer JobResource als Objekt.- jobResourceVariables("JOB-RESOURCE-PATH")
- In einer Auftragsparameterdeklaration werden die beiden Funktionen beim Hinzufügen des Auftrags
ausgewertet. Spätere Änderungen der JobResource wirken sich nicht aus. JobResource:PATH
liefert alle Variablen der Job-Ressource als ein Objekt.- Der neue Punkt-Operator ermöglicht Zugriff auf Objektfelder:
object.field
. - Neue Syntax für
.toNumber
und.toBoolean
- Weil die bisherige Syntax mit dem neuen Punkt-Operator zum Zugriff auf Objektfelder kollidiert,
sollten die neuen Funktionen genutzt werden: toNumber(EXPR)
stattEXPR.toNumber
toBoolean(EXPR)
stattEXPR.toBoolean
.
- Weil die bisherige Syntax mit dem neuen Punkt-Operator zum Zugriff auf Objektfelder kollidiert,
OrderScopesTest
klärt, welche Scopes (mit welchen Namen und Funktionen) wo zur Verfügung stehen
(es ist kompliziert).
Proxy
JControllerState.instant
liefert Zeitstempel desControllerState
.JControllerState.orderNamedValues
liefert alle für den Auftrag sichtbaren Variablen (Auftragsparameter, Job-Ergebnisse).JWorkflow.reachablePosition(Position)
liefert die von der gegebenen Position aus erreichbaren Positionen,
die imResumeOrder
-Kommando angegeben werden können.JControllerApi
meldet sich nicht mehr für jede Operation von neuem am Controller an.
ResumeOrder
Wenn eine Position angegeben ist, dann schneidet JS7 die Mini-Historie ab der Position ab,
so dass Position und Mini-Historie zueinander passen.
Außerdem erwartet das Kommando eine Liste von JHistoryOperation
statt bisher der kompletten Mini-Historie.
Vier Operationen stehen zur Verfügung:
JHistoryOperation.replace(Position, Outcome)
JHistoryOperation.insert(before: Position, Position, Outcome)
JHistoryOperation.delete(Position)
JHistoryOperation.append(Outcome)
JS7 prüft bislang kaum, ob die Operationen plausibel sind.
Weiteres
- Auftragsparameter haben Vorrang vor Job-Ergebnissen (anders als in JS1).
- Der Cluster erlaubt das gleichzeitige Herunterfahren beider Knoten.
- Order.Prompting ist jetzt cancelable
v2.0.0-alpha.20210616
- Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
- Der Parameter
defaultArguments
in derExecute
-Anweisung und im Job erwarten jetzt Ausdrücke statt bloßer Werte.- Das dürfte viele der vorhandenen Workflows betreffen.
- In den Ausdrücken können alle Operationen wie in JobResource-Settings abgerufen werden.
- JobResource-Settings sind in
defaultArguments
undWorkflowJob.env
abrufbar.JobResource:MY-JOB-RESOURCE:MY-SETTING
- In einem interpolierten String, zum Beispiel:
"-->$(JobResource:MY-JOB-RESOURCE:MY-SETTING)<--"
. - Der Auftragsschritt scheitert, wenn die JobResource oder die Setting nicht da ist.
- Neuer Operator
orElse
ist anwendbar auf Settings:JobResource:MY-JOB-RESOURCE:MISSING orElse "MY-DEFAULT"
- Nachträgliche Änderungen zur letzten Freigabe:
JSuspensionMode
ersetztJSuspendMode
JOrder.removed
ersetzt.deleted
v2.0.0-alpha.20210610
JS7 kennt die Abhängigkeiten unter den Items und kann Items löschen
- JS7 lehnt Items ab, wenn nicht sämtliche benötigten anderen Items vorhanden sind. Es kann also kein Workflow mehr übergeben werden, für den eine AgentRef fehlt.
- JS7 löscht (endgültig) selbständig obsolete Workflow-Versionen, für die es also keinen Auftrag mehr gibt.
JUpdateItemOperation.deleteSimple
kann jetzt außer FileWatch auch alle anderen SimpleItems löschen: Lock, JobResource und AgentRef.- Items lassen sich nur löschen, wenn sie nicht von anderen Items noch gebraucht werden.
- Items, die voneinander abhängen, können mit einem Aufruf UpdateItems hinzugefügt und gelöscht werden.
Prompt-Anweisung
- Die neue Anweisung
Prompt
hält den Auftrag an. Parameterquestion
ist ein Ausdruck. - Der Auftrag ist im Zustand
Prompting
. - Das neue Kommando Kommando
AnswerOrderPrompt
setzt einen im Prompt stehenden Auftrag fort. - Events
OrderPrompted
undOrderPromptAnswered
{
"TYPE": "Prompt",
"question": "\"QUESTION\""
}
{
"TYPE": "AnswerOrderPrompt",
"orderId": "ORDER"
}
{
"TYPE": "OrderPrompted",
"question": "QUESTION"
}
{
"TYPE": "OrderPromptAnswered"
}
{
"TYPE": "Prompting",
"question": "QUESTION"
}
Inkompatibilitäten
- Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
Diesmal gibt es einige Umbenennungen, und ein Parameter ist verschoben.
parallelism
ersetzttaskLimit
.parallelism=1
ist voreingestellt. Damit ist der Begriff Task fast getilgt.ShellScriptExecutable
ersetztScriptExecutable
.returnCodeMeaning
, bisher im Job, wird jetzt eins tiefer in ShellScriptExecutable erwartet. Kann entfallen für den normalen Fall, dass nur returnCode != 0 zum Abbruch führen soll.
Benennungstandards der SOS sind übernommen. „delete“ meint jetzt vernichten, „remove“ meint verschwinden lassen, aber nicht umbedingt vernichten:
VersionedItemRemoved
ersetztVersionedItemDeleted
, in allen Varianten, z.B.:RemoveVersioned
ersetztDeleteVersioned
OrderDeleted
ersetztOrderRemoved
, in allen Varianten, z.B.DeleteOrder
ersetztRemoveOrder
JOrder.Deleted
ersetzt `JOrder.Removed- (
JOrder.removed
habe ich übersehen)
OrderDeletionMarked
ersetztOrderRemoveMarked
deleteWhenTerminated
ersetztremoveWhenTerminated
(Order)markedAsDeleteWhenTerminated
ersetztmarkedAsRemoveWhenTerminated
(JOrderPredicates)
Fehlercodes:
VersionedItemRemoved
ersetztVersionedItemDeleted
CannotDeleteChildOrder
ersetztCannotRemoveChildOrder
CannotDeleteWatchingOrder
ersetztCannotRemoveWatchingOrder
Klassen, die in besserem English benannt sind:
OrderKillingMarked
ersetztOrderKillMarked
OrderResumptionMarked
ersetztOrderResumeMarked
CancellationMode
ersetztCancelMode
SuspensionMode
ersetztSuspendMode
- (
JSuspendMode
habe ich übersehen)
v2.0.0-alpha.20210526
- Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
$js7JobExecutionCount
: die neue Variable steht für JobResource und Execute zur Verfügung, und zählt die Anzahl der Starts des aktuellen Jobs für diesen Auftrag. Beim ersten Start ist die Zahl 1.
Kommando ResetAgent
ResetAgent
setzt einen nicht mehr kooperierenden Agenten zurück, dessen Zustand (Journal) nicht zum Zustand des Controllers passt. Das kann zum Beispiel passieren, wenn der Agent mit einem alten (von einer Datensicherung zurückgeladenen) Journal gestartet wird.
- Der Controller holt alle Aufträge zurück, die auf dem Agenten sind, oder auf dem Weg dahin oder zurück. Dabei ist dem Controller nicht bekannt, wie weit der Agent die Aufträge ausgeführt hat. Deshalb lässt er die Aufträge mit
Failed
beenden. Try/catch wirkt nicht. - Aufträge im Fork, von denen ein Kindauftrag zurückgeholt wird, sind nicht betroffen, denn im Fork wartende Auftrag ist stets am Controller.
- Der Controller versucht den Agenten zurückzusetzen, der daraufhin das Journal löscht (!) und erneut startet.
- Der Controller nutzt den neu gestarteten Agenten für die nächsten Aufträge.
- Mit dem Kommando kann der Agent nicht entfernt werden (dafür wird es ein anderes Kommando geben).
{
"TYPE": "ResetAgent",
"agentPath": "AGENT"
}
v2.0.0-alpha.20210521
- Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
- FIX: Das Kommando
RemoveOrdersWhenTerminated
wird für Dateiaufträge abgewiesen. JS7 löscht einen Dateiauftrag genau dann, wenn der Auftrag fertig (OrderFinished
,OrderFailed
oderOrderCancelled
) ist und die Datei verschwunden ist.
$`variable`
- Neue Syntax für Variablen mit komischen Zeichen: $`variable`
- variable kann jedes Zeichen außer ` und Steuerzeichen (wie Zeilenwechsel) enthalten
- $`mail.smtp.port` (die Punkte gehörten also zum Variablennamen und sind keine Objekttrenner)
- $`name with spaces`
- $
..
kann damit mehr als ${...}- ${...} wäre damit veraltet, aber man könnte es zukünftig für nette syntaktische Abkürzungen verwenden, etwa wie die Bash das tut.
-
${`variable`} geht erstmal weiterhin. Besser ist $ `variable`.
Agent
- Den Agent Server (für mehrere Agenten) gibt es nicht mehr. Der gestartete Agent unterstützt genau eine AgentPath. Der Agent schreibt nur noch ein Journal (nicht mehr zwei). Start wie bisher.
$js7ControllerId
liefert jetzt die tatsächliche ControllerId.
Neue Felder in BlockingInternalJob.Step
controllerId: ControllerId
controllerId().string()
liefert einen String
instructionLabel: Optional<Label>
instructionLabel().map(o -> o.string())
liefertOptional<String>
.
LicenseCheck
- Der Produktname für den Cluster lautet jetzt ordentlich
js7.controller.cluster
. - Das Interface
LicenseCheck
hat jetzt die Methodeinitialize
, der einLicenseCheckContext
mitconfigDirectory
übergeben wird. - JS7 protokolliert mehr (als debug)