Utilisation de JZOS [Lien de référence 1] , Vous pouvez développer des programmes Java qui entrent et sortent des ensembles de données dans l'environnement z / OS (environnement mainframe IBM) [Reference link 6 ]. Pour les applications Java qui s'exécutent dans un environnement à thread unique, il n'y a aucun problème si vous laissez le contrôle exclusif de l'ensemble de données au système d'exploitation. Comme indiqué dans le tableau ci-dessous, le contrôle exclusif est effectué par le paramètre DISP (SHR / OLD) spécifié lors de l'allocation de l'ensemble de données, il n'est donc pas nécessaire d'implémenter une logique de contrôle spéciale en tant qu'application. Le contrôle exclusif dans ce cas est un contrôle exclusif entre les processus et équivaut au contrôle exclusif lors de l'exécution d'un programme batch écrit en langage COBOL ou PL / I avec JCL (** <Ensemble de données dans le batch COBOL ci-dessous). Contrôle exclusif de> **).
Nouvelle requête\Traitement en cours | En train de lire(SHR) | L'écriture(OLD) |
---|---|---|
en train de lire(SHR) | ○ | × (Note 1) |
l'écriture(OLD) | × (Note 1) | × (Note 1) |
** Note 1 ** Dans le cas du JCL, les nouvelles demandes seront en état d'attente lorsque les demandes d'accès sont en conflit, et seront accessibles lorsque le jeu de données sera libéré une fois le traitement en cours terminé, mais allocation dynamique par BPXWDYN Dans ce cas, une erreur immédiate se produira. De plus, il est habituel de spécifier DISP = OLD au moment de l'écriture et DISP = SHR au moment de la lecture lors de l'exécution du contrôle exclusif avec JCL, et même si le traitement d'écriture est effectué avec DISP = SHR, une erreur se produira en raison d'elle-même. n'est pas.
** <Contrôle exclusif de l'ensemble de données dans le lot COBOL> ** Comme le montre la figure ci-dessous, lorsque le lot COBOL n ° 1 du travail n ° 1 tente d'accéder à l'ensemble de données en cours d'écriture avec DISP = OLD, le lot COBOL n ° 2 du travail n ° 2 tente d'y accéder avec DISP = OLD, et en raison du contrôle exclusif du système d'exploitation, Le lot COBOL n ° 2 attend que l'ensemble de données soit libéré.
Cependant, dans un programme Java dans un environnement multithread, il n'est pas possible de laisser tout le contrôle exclusif au système d'exploitation. Ce qui suit décrit les problèmes liés aux conflits d'accès lors de l'utilisation d'ensembles de données dans un environnement Java multithread et des solutions utilisant l'API JZOS avec des exemples.
Lors de l'accès à un ensemble de données à partir d'un programme Java dans un environnement à thread unique, aucune action spéciale n'est requise concernant les conflits, mais une application Java côté serveur qui s'exécute sur WebSphere Application Server for z / OS (ci-après dénommée WAS for z / OS). Des précautions doivent être prises lors de l'accès à l'ensemble de données à partir de. En effet, l'environnement WAS pour z / OS est un environnement multithread (environnement Java EE). Le contrôle exclusif mentionné ci-dessus par le système d'exploitation est une histoire lors de l'accès au même ensemble de données entre plusieurs processus, et lors de l'accès au même ensemble de données à partir de plusieurs threads dans le même processus, il est de la responsabilité de l'application d'implémenter la logique de contrôle exclusif. Il est nécessaire d'éviter la corruption des données (voir ** <Problèmes de contrôle exclusif des jeux de données dans Java Batch sur WAS pour z / OS> ** ci-dessous).
** <Problèmes de contrôle exclusif de l'ensemble de données dans Java batch sur WAS pour z / OS> ** Le contrôle exclusif du lot Java n ° 1 et du lot Java n ° 2 dans la figure ci-dessous fonctionne efficacement, mais plusieurs threads dans le même espace d'adressage (correspondant au processus Unix / Window) tels que le lot Java n ° 1 et le lot Java n ° 3. Il est de la responsabilité de l'application de mettre en œuvre un contrôle exclusif entre eux.
Ensuite, comment pouvons-nous implémenter un contrôle exclusif? La méthode fournie par l'API JZOS (classe com.ibm.jzos.Enqueue] [Lien de référence 2 /knowledgecenter/SSYKE2_8.0.0/com.ibm.java.zsecurity.api.80.doc/com.ibm.jzos/com/ibm/jzos/Enqueue.html)].
L'exemple de programme ʻEnqTest.java` est illustré ci-dessous. Afin de transmettre les principaux points d'implémentation, l'exemple ci-dessous prend la forme d'une simple application Java autonome, mais la logique décrite dans la méthode main peut être utilisée presque telle quelle dans une application Java EE (** Note 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); // <-Dans le cas du processus de lecture
//enq.setControl(Enqueue.ISGENQ_CONTROL_EXCLUSIVE); // <-Pour le traitement d'écriture
enq.setContentionActWait();
try{
enq.obtain();
byte[] token = enq.getEnqToken();
System.out.println("token:"+DatatypeConverter.printHexBinary(token));
//Décrivez ici le traitement d'entrée / sortie de l'ensemble de données
} catch(Throwable t) {
t.printStackTrace();
} finally {
if (enq.getEnqToken() != null) {
enq.release();
}
}
}
}
** C'est le point! ** Les points de l'exemple de programme sont expliqués ci-dessous. Étant donné que l'exemple ci-dessus se concentre sur le contrôle exclusif, le traitement d'entrée / sortie de l'ensemble de données est omis. Pour ceux qui veulent connaître le contenu spécifique du processus d'entrée / sortie de l'ensemble de données, "Lien de référence 6. Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS" / 8f75ce6a2f52c6c61ff5) Je voudrais que vous le vérifiiez.
** Note 2) ** Dans l'exemple ci-dessus, la portée est définie sur ** Enqueue.ISGENQ_SCOPE_SYSTEM ** afin de s'exécuter en tant qu'application Java autonome, mais si vous souhaitez contrôler les conflits entre plusieurs threads dans la même JVM dans un environnement WAS pour z / OS, * Spécifiez * Enqueue.ISGENQ_STEP ** pour la portée.
** Note 3) ** Pour plus d'informations sur l'API, voir [Lien de référence 2](https://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.zsecurity.api.80.doc/com.ibm.jzos/com (/ibm/jzos/Enqueue.html). Pour les services système appelés par l'API, voir Lien de référence 3. .htm), Lien de référence 4, [Lien de référence 5] Voir (https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieaa200/isgenq.htm).
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. Sérialisation globale des ressources ** https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag400/comm.htm
** 4. ISGENQ - Service ENQ séquentiel de ressources mondiales ** https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieaa900/isgenq.htm
** 5. ISGENQ - Service ENQ de sérialisation des ressources mondiales (page en anglais ci-dessus) ** https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieaa200/isgenq.htm
** 6. Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS ** https://qiita.com/tsunogai/items/8f75ce6a2f52c6c61ff5
Recommended Posts