Erzielen Sie die exklusive Kontrolle über Datasets in einer Java-Umgebung mit mehreren Threads (WAS für z / OS-Umgebung) des IBM Mainframes

Überblick

Verwenden von JZOS [Referenzlink 1] , Sie können Java-Programme entwickeln, die Datasets in der z / OS-Umgebung (IBM Mainframe-Umgebung) eingeben und ausgeben. [Referenzlink 6 ]. Für Java-Anwendungen, die in einer Single-Thread-Umgebung ausgeführt werden, ist es kein Problem, wenn Sie die ausschließliche Kontrolle über das Dataset dem Betriebssystem überlassen. Wie in der folgenden Tabelle gezeigt, wird die exklusive Steuerung durch den DISP-Parameter (SHR / OLD) ausgeführt, der beim Zuweisen des Datensatzes angegeben wird, sodass keine spezielle Steuerlogik als Anwendung implementiert werden muss. Die ausschließliche Steuerung ist in diesem Fall die ausschließliche Steuerung zwischen Prozessen und entspricht der ausschließlichen Steuerung beim Ausführen eines Stapelprogramms, das in COBOL-Sprache oder PL / I-Sprache mit JCL geschrieben ist (** <Datensatz im COBOL-Stapel unten). Ausschließliche Kontrolle von> **).

Neue Anfrage\Bearbeitung läuft lesen(SHR) Schreiben(OLD)
lesen(SHR) × (Anmerkung 1)
Schreiben(OLD) × (Anmerkung 1) × (Anmerkung 1)

** Hinweis 1 ** Im Fall von JCL befinden sich neue Anforderungen in einem Wartezustand, wenn Zugriffsanforderungen in Konflikt stehen, und sind verfügbar, wenn der Datensatz nach Abschluss der laufenden Verarbeitung freigegeben wird, jedoch eine dynamische Zuweisung durch BPXWDYN In diesem Fall tritt sofort ein Fehler auf. Es ist üblich, DISP = OLD zum Zeitpunkt des Schreibens und DISP = SHR zum Zeitpunkt des Lesens anzugeben, wenn eine exklusive Steuerung mit JCL durchgeführt wird, und selbst wenn die Schreibverarbeitung mit DISP = SHR durchgeführt wird, tritt aufgrund seiner selbst ein Fehler auf. ist nicht.

** ** Wie in der folgenden Abbildung gezeigt, versucht COBOL-Stapel Nr. 2 von Job 2, mit COP = OLD und aufgrund der ausschließlichen Kontrolle des Betriebssystems darauf zuzugreifen, wenn COBOL-Stapel Nr. 1 von Job Nr. 1 versucht, auf den Datensatz zuzugreifen, der mit DISP = OLD geschrieben wird. COBOL-Stapel Nr. 2 wartet auf die Freigabe des Datensatzes.

image.png

In einem Java-Programm in einer Multithread-Umgebung ist es jedoch nicht möglich, die gesamte ausschließliche Kontrolle dem Betriebssystem zu überlassen. Im Folgenden werden Probleme im Zusammenhang mit Zugriffskonflikten bei der Arbeit mit Datasets in einer Multithread-Java-Umgebung und Lösungen unter Verwendung der JZOS-API mit Beispielen beschrieben.

Herausforderungen in einer Multithread-Java-Umgebung

Beim Zugriff auf ein Dataset von einem Java-Programm in einer Single-Threaded-Umgebung ist keine besondere Aktion in Bezug auf Konflikte erforderlich, sondern eine serverseitige Java-Anwendung, die auf WebSphere Application Server für z / OS (im Folgenden als WAS für z / OS bezeichnet) ausgeführt wird. Beim Zugriff auf den Datensatz von ist Vorsicht geboten. Dies liegt daran, dass die WAS for z / OS-Umgebung eine Multithread-Umgebung (Java EE-Umgebung) ist. Die oben erwähnte exklusive Steuerung durch das Betriebssystem ist eine Geschichte, wenn auf denselben Datensatz zwischen mehreren Prozessen zugegriffen wird, und wenn auf denselben Datensatz von mehreren Threads in demselben Prozess zugegriffen wird, liegt es in der Verantwortung der Anwendung, die exklusive Steuerlogik zu implementieren. Es ist erforderlich, eine Beschädigung der Daten zu verhindern (siehe ** <Probleme mit der exklusiven Dataset-Steuerung in Java Batch unter WAS für z / OS> ** unten).

** <Probleme mit der exklusiven Kontrolle von Datensätzen im Java-Batch unter WAS für z / OS> ** Die exklusive Steuerung von Java-Stapel Nr. 1 und Java-Stapel Nr. 2 in der folgenden Abbildung funktioniert effektiv, aber mehrere Threads im selben Adressraum (entsprechend dem Unix / Window-Prozess) wie Java-Stapel Nr. 1 und Java-Stapel Nr. 3. Es liegt in der Verantwortung der Anwendung, eine ausschließliche Kontrolle zwischen ihnen zu implementieren.

image.png

Implementieren Sie eine exklusive Steuerlogik in der Klasse com.ibm.jzos.Enqueue

Wie können wir dann die exklusive Steuerung implementieren? Die von der JZOS-API bereitgestellte Methode (com.ibm.jzos.Enqueue-Klasse] [Referenzlink 2 /knowledgecenter/SSYKE2_8.0.0/com.ibm.java.zsecurity.api.80.doc/com.ibm.jzos/com/ibm/jzos/Enqueue.html)].

Das Beispielprogramm "EnqTest.java" ist unten dargestellt. Um die wichtigsten Implementierungspunkte zu vermitteln, wird im folgenden Beispiel eine einfache eigenständige Java-Anwendung verwendet. Die in der Hauptmethode beschriebene Logik kann jedoch fast wie in einer Java EE-Anwendung verwendet werden (** Hinweis 2 **).

EnqTest.java


package sample;
import com.ibm.jzos.ZFile;
import com.ibm.jzos.Enqueue;
import javax.xml.bind.DatatypeConverter;

public class EnqTest {
	public static void main(String args[]) throws Exception {
		String qname = "TEST_Q01";
		String dsName = "USER001.TEST.DATA1";
		Enqueue enq = new Enqueue(qname, dsName);
		enq.setScope(Enqueue.ISGENQ_SCOPE_SYSTEM);
		enq.setControl(Enqueue.ISGENQ_CONTROL_SHARED);      // <-Im Falle eines Lesevorgangs
		//enq.setControl(Enqueue.ISGENQ_CONTROL_EXCLUSIVE); // <-Zur Schreibverarbeitung
		enq.setContentionActWait();
		
		try{
			enq.obtain();
			byte[] token = enq.getEnqToken();
			System.out.println("token:"+DatatypeConverter.printHexBinary(token));
			
			//Beschreiben Sie hier die Dateneingabe- / Ausgabeverarbeitung
			
		} catch(Throwable t) {
			t.printStackTrace();
		} finally {
			if (enq.getEnqToken() != null) {
				enq.release();
			}

		}
	}

}

** Das ist der Punkt! ** Die Punkte des Beispielprogramms werden unten erläutert. Da sich das obige Beispiel auf die ausschließliche Steuerung konzentriert, entfällt die Eingabe- / Ausgabeverarbeitung des Datensatzes. Für diejenigen, die den spezifischen Inhalt des Eingabe- / Ausgabeprozesses des Datensatzes kennen möchten, "Referenzlink 6. Versuchen Sie, mit JZOS von Java aus auf den Datensatz zuzugreifen" / 8f75ce6a2f52c6c61ff5) Ich möchte, dass Sie es überprüfen.

** Anmerkung 2) ** Im obigen Beispiel ist der Bereich auf ** Enqueue.ISGENQ_SCOPE_SYSTEM ** festgelegt, um als eigenständige Java-Anwendung ausgeführt zu werden. Wenn Sie jedoch Konflikte zwischen mehreren Threads in derselben JVM in einer WAS for z / OS-Umgebung steuern möchten, * Geben Sie * Enqueue.ISGENQ_STEP ** für den Bereich an.

** Notiz 3) ** Weitere Informationen zur API finden Sie unter Referenzlink 2 (/ibm/jzos/Enqueue.html). Informationen zu den von der API aufgerufenen Systemdiensten finden Sie unter Referenzlink 3. .htm), Referenzlink 4, [Referenzlink 5] Siehe (https://www.ibm.com/support/knowledgecenter/de/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieaa200/isgenq.htm).

Referenzlink

1. JZOS Batch Launcher and Toolkit https://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.zsecurity.80.doc/zsecurity-component/jzos.html

2. JZOS API (Javadoc) http://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.zsecurity.api.80.doc/com.ibm.jzos/index.htm

** 3. Globale Ressourcenserialisierung ** https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag400/comm.htm

** 4. ISGENQ - Global Resource Sequential ENQ Service ** https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieaa900/isgenq.htm

** 5. ISGENQ - ENQ-Dienst für die globale Ressourcenserialisierung (englische Seite oben) ** https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieaa200/isgenq.htm

** 6. Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen ** https://qiita.com/tsunogai/items/8f75ce6a2f52c6c61ff5

Recommended Posts

Erzielen Sie die exklusive Kontrolle über Datasets in einer Java-Umgebung mit mehreren Threads (WAS für z / OS-Umgebung) des IBM Mainframes
[Für Anfänger] Bis zum Erstellen einer Webanwendungsentwicklungsumgebung mit Java unter Mac OS
Hinweise zur Signalsteuerung in Java