Heim >Java >javaLernprogramm >So implementieren Sie ein Prozessorchestrierungs-Framework in Java
Wir haben bereits erwähnt, dass wir das Registrierungsprozessmodell in Form von YML, Eigenschaften, XML, JSON und Schnittstellen unterstützen müssen, um das widerzuspiegeln. Single-Responsibility-PrinzipWir müssen die Logik des Parsens eines Formats unabhängig verarbeiten. Um das -Prinzip der Erweiterungsentwicklung und des Abschlusses von Modifikationen widerzuspiegeln, definieren wir zunächst eine Reihe von Schnittstellen und übergeben Sie dann die Fabrikmodell-Formel. Stellen Sie die entsprechende Implementierungslogik bereit. Hier ist die Fabrik der Benutzer, der die spezifische Implementierung über die Schnittstelle aufruft, und die Implementierung hier ist der Anbieter, der ebenfalls eine Reihe von # ist. 🎜🎜#Strategiemuster.
ProzessladenWerksmodus erforderlich ist. , und es muss für die Entwicklung und Änderung externer Erweiterungen geschlossen werden. Um Knoten hinzuzufügen, müssen Sie keine andere Codelogik verwenden. Sie müssen lediglich einen Knotenparser in der Factory-Funktion hinzufügen. Gleichzeitig definieren wir hier eine Kartensammlung zur Verwendung in Das Analyseobjekt wird beim Laden der Factory-Funktion erstellt, anstatt bei jeder Analyse einen Parser zu erstellen, wodurch unnötiger Speicher reduziert wird
Der Code ist wie folgt:<code>public class NodeComponentFactory {<br><br> private final static Map<string> cacheParser = new HashMap();<br><br> static {<br> cacheParser.put(NodeParserEnum.method.name(),new MethodNodeComponent());<br> cacheParser.put(NodeParserEnum.bean.name(),new BeanNodeComponent());<br> cacheParser.put(NodeParserEnum.condition.name(),new ConditionNodeComponent());<br> cacheParser.put(NodeParserEnum.service.name(),new ServiceNodeComponent());<br> cacheParser.put(NodeParserEnum.subflow.name(),new SubFlowNodeComponent());<br> }<br><br> public static NodeParser getNodeInstance(String nodeName){<br> return cacheParser.get(nodeName);<br> }<br>}<br></string></code>Wenn wir festgestellt haben, dass jeder Knoten-Parsing-Typ die Parser-Schnittstelle implementieren muss und jeder Knoten ähnliche Schritte hat, müssen wir hier die Verwendung einer abstrakten Fabrik in Betracht ziehen, die auch mit a konsistent ist
Abhängigkeitsinversion Das Designprinzip besteht darin, dass auf das obere Modul über die abhängige Schnittstelle zugegriffen wird. Das nächste Modul erbt die abstrakte Klasse und verwendet auch Strategiemuster, um Schnittstellenaufrufe durchzuführen. Im logischen Implementierungsprozess werden wir feststellen, dass viele Schritte wiederholt werden, z. B. das Initialisieren von Eingabeparametern und das Ausführen von Datensätzen. Wir fügen den gesamten wiederholten Inhalt in abstrakte Klassen ein und verwenden Vorlagenmodus, um dies zu ermöglichen Prozessknoten konzentrieren sich nur auf die Analyseebene.
<code>public abstract class AbstractNodeComponent implements NodeParser{<br><br> public Map<string node> nodeMap;<br><br><br> /**<br> * 初始化参数<br> * @param inputUrl<br> * @param baseInput<br> * @return<br> */<br> public BaseInput initInput(String inputUrl, BaseInput baseInput){<br> BaseInput baseInputTarget = ClassUtil.newInstance(inputUrl, BaseInput.class);<br> BeanUtils.copyProperties(baseInput,baseInputTarget);<br> return baseInputTarget;<br> }<br><br><br> /**<br> * 解析节点信息<br> * @param node 节点信息<br> * @param baseInput 请求参数<br> * @param baseTemp 临时上下文<br> * @return<br> */<br> public BaseOutput parserNode(Node node, BaseInput baseInput, BaseTemp baseTemp){<br> baseTemp.setFlowRecord(baseTemp.getFlowRecord().append(FlowConstants.NODEKEY+FlowConstants.NODE+FlowConstants.COLON+node.getId()));<br> BaseOutput baseOutput = parser(node, baseInput, baseTemp);<br> return baseOutput;<br> };<br><br> @Override<br> public void setNodeMap(Map<string node> nodeMap) {<br> this.nodeMap = nodeMap;<br> }<br><br> @Override<br> public abstract BaseOutput parser(Node node, BaseInput baseInput, BaseTemp baseTemp);<br><br>}</string></string></code>ProzessladereihenfolgeWir müssen die Komponenten für die Prozessausführung sehr sorgfältig aufteilen Implementiert eine Funktion in eine Komponente, um das
Prinzip der Einzelverantwortung widerzuspiegeln. Nur durch eine sehr feine Aufteilung der Ausführungsfunktionen können sie in jedem Prozess der Prozessausführung flexibel kombiniert werden , Sie können mehrere Komponenten sehen. Die erste ist der Eingang zur einheitlichen Ausführung des Prozesses. Es gibt zwei Orte, an denen sie verwendet wird, die erste ist die Schnittstelle für externe Aufrufe, die zweite ist der Einstiegspunkt für untergeordnete. Die zweite Komponente ist die einheitliche Ladeverwaltungskomponente, die oben erwähnte Factory-Klasse. Der Parser wird verwendet, um die Operationen verschiedener Knotentypen während des Entwurfsprozesses zu implementieren Prozesse, Management und Knoten müssen bekannt sein, um die Kopplung zu reduzieren. Nur so können verschiedene Komponenten flexibel zusammengestellt werden.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie ein Prozessorchestrierungs-Framework in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!