CICS Transaction Server fournit une bibliothèque de classes appelée JCICS pour utiliser la fonction CICS de Java. Il s'agit de la version Java de l'API dite EXEC CICS, qui vous permet d'appeler d'autres programmes CICS avec LINK et d'accéder aux ressources de gestion CICS telles que TSQ / TDQ. En utilisant cela, vous pouvez écrire une application CICS en Java. Expédié le 12/06/2020, CICS TS V5.6 propose désormais une nouvelle API CICS pour Java appelée JCICSX, qui est une extension de JCICS. Ici, je vais décrire une série de flux lorsque j'ai essayé de déplacer le JCI CSX.
Application Java CICS-Exécuter - (1) Exécuter un exemple d'application simple Application Java CICS-Run - (2) Build management by Maven Application Java CICS-Run - (3) Build management by Gradle Application Java CICS-Run - (4) Application Spring Boot Application Java exécutée par CICS - (5) Utiliser JCICSX
Environnement de développement Windows10
** Environnement d'exécution ** z/OS V2.4 CICS Transaction Server for z/OS V5.6
La position de la "bibliothèque de classes pour l'utilisation de la fonction CICS à partir de Java ≒ version Java de l'API EXEC CICS" est la même pour JCICS et JCICSX. Ce qui est différent, c'est que JCICSX est une API étendue qui facilite le test sur votre PC local (dans l'environnement de développement). De plus, JCICS prend en charge un large éventail de fonctions équivalentes à EXEC CICS, mais JCICSX est toujours limité et seules les fonctions liées au canal et au conteneur et au lien sont fournies. référence: JCICS Javadoc JCICSX Javadoc
«Facile à tester sur un PC local (environnement de développement)» présente les deux points suivants.
(1) Un test unitaire utilisant le framework de test est possible
Bien entendu, il n'y a pas d'exécution CICS sur le PC local, de sorte que le code dépendant de CICS (partie JCICSX) ne peut pas être exécuté tel quel. Lors de l'exécution d'un test unitaire d'un module contenant du code dépendant de l'environnement tel que l'accès à la base de données, il existe un framework (Mockito, etc.) qui gère la partie d'accès aux ressources externes comme un Mock, mais il est dit qu'il sera également appliqué à la partie d'accès CICS. .. (Je pense que cela est principalement dû aux fonctionnalités fournies par des frameworks tels que Mockito.)
(2) Le fonctionnement peut être confirmé sur le serveur Liberty sur le PC Il s'agit de la fonction d'extension principale de CICS, mais nous fournissons un mécanisme pour vérifier le fonctionnement de JCICSX avec Liberty sur le PC local (sur l'environnement de développement). L'image est la suivante.
Ce mécanisme est appelé "développement à distance". Préparez Liberty sur le PC et CICS-Liberty pour l'environnement de développement, et configurez les fonctionnalités pour le développement à distance JCICSX respectivement. Avec ce type de configuration, Liberty sur le PC local fonctionnera comme s'il s'exécutait sur CICS. Par conséquent, il n'est pas nécessaire de déployer l'application du côté de l'hôte et de vérifier le fonctionnement à chaque fois lors d'un essai et d'une erreur ou d'un test, et il est possible d'exécuter un cycle détaillé de vérification et de correction du fonctionnement sur le PC local. Une fois que le code est finalement solidifié, il peut être déployé et exécuté dans l'environnement réel CICS-Liberty pour l'anneau de test / production.
En d'autres termes, il est pratique d'utiliser JCICSX lors de la création d'une application Liberty qui transmet des données avec Channel & Container et appelle une application existante avec Link (LINK passé avec COMMAREA n'est pas possible).
Ce qui suit décrit la procédure de configuration pour tester JCICSX sur le serveur Liberty sur votre PC.
Référence: Configuration de l'environnement pour JCICSX
Préparez le profil JVM sur USS. (Les propriétés liées à JVMServer sont effectivement spécifiées dans le fichier sur cet USS. La définition de ressource JVMSERVER pointe vers le nom de fichier de ce profil JVM.) Un échantillon est fourni, alors copiez-le et utilisez-le.
Créez un répertoire appelé / var / cicsts / cicsts56 / CT56B4A1 / JVMProfiles et ajoutez-y /usr/lpp/cicsts/cicsts56/JVMProfiles/DFHWLP.jvmprofile (exemple de définition de Liberty situé sous le répertoire d'installation du CCD). Copiez-le avec le nom DFHWLPX.jvmprofile. Personnalisez en fonction de votre environnement.
DFHWLPX.extrait jvmprofile
JAVA_HOME=/usr/lpp/java/J8.0_64/
WORK_DIR=/var/cicsts/cicsts56/CT56B4A1/work
WLP_INSTALL_DIR=/usr/lpp/cicsts/cicsts56/wlp
-Dcom.ibm.cics.jvmserver.wlp.autoconfigure=true
-Dcom.ibm.cics.jvmserver.wlp.server.host=*
-Dcom.ibm.cics.jvmserver.wlp.server.http.port=56461
-Dcom.ibm.cics.jvmserver.wlp.server.https.port=56471
-Xms128M
-Xmx256M
-Xmso1M
-Xgcpolicy:gencon
-Xscmx256M
-Xshareclasses:name=cicsts%g,groupAccess,nonfatal
-Xtune:virtualized
-Dcom.ibm.tools.attach.enable=no
-Dfile.encoding=ISO-8859-1
_BPXK_DISABLE_SHLIB=YES
SIT
Spécifiez le répertoire où se trouve le fichier de propriétés ci-dessus dans le paramètre SIT "JVMPROFILEDIR".
JVMPROFILEDIR=/var/cicsts/cicsts56/CT56B4A1/JVMProfiles
Redémarrez la région pour que les modifications prennent effet.
Préparez la définition de ressource JVMSERVER. Personnalisez la définition JVMSERVER "DFHWLP" dans le groupe DFH $ WLP fourni par le produit en la copiant dans le groupe approprié avec le nom "DFHWLPX".
OBJECT CHARACTERISTICS CICS RELEASE = 0730
CEDA View JVmserver( DFHWLPX )
JVmserver : DFHWLPX
Group : TAGGRP
DEScription : CICS JVM server to run WLP samples
Status : Enabled Enabled | Disabled
Jvmprofile : DFHWLPX (Mixed Case)
Lerunopts : DFHAXRO
Threadlimit : 015 1-256
DEFINITION SIGNATURE
DEFinetime : 08/07/20 17:01:19
CHANGETime : 08/07/20 17:01:36
CHANGEUsrid : CICSUSER
CHANGEAGEnt : CSDApi CSDApi | CSDBatch
CHANGEAGRel : 0730
Installez ce JVMSERVER une fois.
Il est OK s'il est activé en regardant CEMT I JVMSERVER.
I JVMS
STATUS: RESULTS - OVERTYPE TO MODIFY
Jvm(DFHWLPX ) Ena Prf(DFHWLPX ) Ler(DFHAXRO )
Threadc(012) Threadl( 015 ) Cur(65873224)
Étant donné que "com.ibm.cics.jvmserver.wlp.autoconfigure = true" est spécifié dans le profil JVM, Liberty est automatiquement configuré lors de l'installation du serveur JVM.
\ <WORK_DIR > /CT56B4A1/DFHWLPX/wlp/usr/servers/defaultServer/server.xml a été créé, modifiez-le. Ajoutez une fonctionnalité appelée cicsts: jcicsxServer-1.0 comme suit:
server.xml
...
<featureManager>
<feature>cicsts:core-1.0</feature>
<feature>cicsts:defaultApp-1.0</feature>
<feature>jsp-2.3</feature>
<feature>wab-1.0</feature>
<feature>transportSecurity-1.0</feature>
<feature>cicsts:jcicsxServer-1.0</feature>
</featureManager>
...
Lorsque vous redémarrez le serveur JVM, vous pouvez voir le journal suivant en tant que message de démarrage Liberty. (<WORK_DIR>/CT56B4A1/DFHWLPX/wlp/usr/servers/defaultServer/logs/messages.log)
messages.log
...
[8/7/20 8:13:40:387 GMT] 00000050 com.ibm.ws.webcontainer.osgi.webapp.WebGroup I SRVE0169I: Loading Web Module: com.ibm.cics.wlp.jcicsxserver.
[8/7/20 8:13:40:387 GMT] 00000050 com.ibm.ws.webcontainer I SRVE0250I: Web Module com.ibm.cics.wlp.jcicsxserver has been bound to default_host.
[8/7/20 8:13:40:387 GMT] 00000050 com.ibm.ws.http.internal.VirtualHostImpl A CWWKT0016I: Web application available (default_host): http://xx.xx.xx:56461/jcicsxServer/
...
L'URL affichée ici est utilisée dans la configuration Liberty côté PC.
Configurez l'environnement Eclipse sur Windows 10 et installez Liberty. Pour la procédure, utilisez celle de l'article suivant telle quelle. [WebSphere Application Server Liberty Base - JCA Connection Environment Construction Memo --Development Environment Setup (Windows)](https://qiita.com/tomotagwork/items/73d84923cc1a1ee6f6b0#%E9%96%8B%E7%99%BA%E7% 92% B0% E5% A2% 83% E3% 82% BB% E3% 83% 83% E3% 83% 88% E3% 82% A2% E3% 83% 83% E3% 83% 97 fenêtres)
Double-cliquez sur le gestionnaire de fonctionnalités Liberty cible dans la vue serveur d'Eclipse pour ouvrir server.xml et cliquez sur Ajouter à droite de la liste des fonctionnalités
Cliquez sur Installer des fonctionnalités supplémentaires
Si vous spécifiez "JCICS" pour le filtre, la fonction de développement JCICSX pour Java sera répertoriée. Cliquez sur Installer dans le suivant.
Confirmer la licence et terminer
Maintenant que la fonctionnalité est installée, sélectionnez l'utilisateur: jcicsxClient-1.0, qui est filtré par jcicsx et affiché.
Ajouté en tant que fonctionnalité.
En regardant la source de server.xml, cela ressemble à ceci.
server.xml
<featureManager>
<feature>jsp-2.3</feature>
<feature>localConnector-1.0</feature>
<feature>servlet-3.1</feature>
<feature>jca-1.7</feature>
<feature>jndi-1.0</feature>
<feature>ejb-3.2</feature>
<feature>usr:jcicsxClient-1.0</feature>
</featureManager>
...
Modifiez server.xml et ajoutez les paramètres suivants.
server.xml
...
<!-- JCICSX Client Config -->
<usr_jcicsxClient serverUri="http://etp1:56461"/>
...
L'adresse et le port serverUri sont les points de terminaison ICMP-Liberty configurés pour le serveur JCICSX. Si vous regardez server.xml en mode Création, cela ressemblera à ceci:
Ceci termine la configuration "développement à distance".
Il existe plusieurs façons de fournir la bibliothèque de classes JCICSX, mais elle est également incluse dans le SDK CICS pour Java de CICS Explorer. Si vous intégrez la fonction CICS Explorer dans Eclipse, elle sera plus facile à gérer, nous inclurons donc CICS Explorer dans l'environnement Eclipse.
Référence: Téléchargement et démarrage de CICS Explorer
Sélectionnez Aide-Installer un nouveau logiciel dans le menu Eclipse
Appuyez sur Ajouter pour ajouter les référentiels suivants. 「https://public.dhe.ibm.com/ibmdl/export/pub/software/htp/zos/tools/aqua3.2/」
Sélectionnez CICS Explorer et Suivant
prochain
Confirmer la licence et terminer
L'installation prend beaucoup de temps. Ce type de confirmation peut apparaître sur le chemin, alors prenez les mesures appropriées.
Une fois terminé, la fenêtre contextuelle suivante apparaîtra, alors redémarrez Eclipse
La fonction CICS Explorer est désormais intégrée à Eclipse.
Ici, je vais essayer d'exécuter l'exemple fourni sur GitHub. GitHub: cics-java-jcicsx-samples Créez un clone localement.
c:\y\workspace\cicsts56>git clone https://github.com/cicsdev/cics-java-jcicsx-samples.git
Cloning into 'cics-java-jcicsx-samples'...
remote: Enumerating objects: 361, done.
remote: Counting objects: 100% (361/361), done.
remote: Compressing objects: 100% (157/157), done.
Receiving objects: 76% (275/361) ed 350 (delta 137), pack-reused 0
Receiving objects: 100% (361/361), 97.91 KiB | 331.00 KiB/s, done.
Resolving deltas: 100% (145/145), done.
Parmi les différents exemples, importez "char-link-program-sample" dans Eclipse.
Cliquez avec le bouton droit sur la vue Enterprise Explorer dans la perspective JavaEE-Import Maven-Sélectionnez un projet Maven existant
Sélectionnez "char-link-program-sample" dans le répertoire cloné
Le projet a été créé.
Jetons un coup d'œil à pom.xml.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ibm.cics</groupId>
<artifactId>char-link-program-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<!-- JCICSX dependency, used in CharLinkServlet.java -->
<dependency>
<groupId>com.ibm.cics</groupId>
<artifactId>com.ibm.cics.jcicsx</artifactId>
<version>1.000.0-5.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- The below bundles the application as a WAR in a CICS bundle and deploys this to CICS using the CICS bundle deployment API.
This is optional and can be removed if you don't wish to deploy the application this way -->
<plugin>
<groupId>com.ibm.cics</groupId>
<artifactId>cics-bundle-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<!-- These goals will firstly run the war packaging on the project, and then will run the deploy goal, which will happen during the verify phase of the lifecycle by default-->
<goals>
<goal>bundle-war</goal>
<goal>deploy</goal>
</goals>
<configuration>
<!-- The bundle classifier indicates that the war should be packaged into a CICS bundle -->
<classifier>cics-bundle</classifier>
<!-- Update the default JVM server that the application will be installed into by default, This is used when creating the bundle, and goes into the CICS bundle's manifest -->
<jvmserver>DFHWLP</jvmserver>
<!-- Set the URL of the deploy target -->
<url>http://yourcicsurl.com:9080</url>
<!-- We'd recommend that you use Maven's password encryption, or supply your credentials using environment variables or properties, as shown here. -->
<username>${cics-user-id}</username>
<password>${cics-password}</password>
<!-- Identify which bundle definition you're going to use from the CSD and which region and CICSPlex you want to deploy to -->
<bunddef>DEMOBUNDLE</bunddef>
<csdgroup>BAR</csdgroup>
<cicsplex>CICSEX56</cicsplex>
<region>IYCWEMW2</region>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Une dépendance JCICSX a été spécifiée. Les paramètres de la définition BUNDLE sont également inclus, mais pour l'instant, laissez-les tels quels.
Ensuite, jetons un œil à la source Servlet.
CharLinkServlet.java
package sample;
/* Licensed Materials - Property of IBM */
/* */
/* SAMPLE */
/* */
/* (c) Copyright IBM Corp. 2020 All Rights Reserved */
/* */
/* US Government Users Restricted Rights - Use, duplication or disclosure */
/* restricted by GSA ADP Schedule Contract with IBM Corp */
/* */
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.cics.jcicsx.CICSConditionException;
import com.ibm.cics.jcicsx.CICSContext;
/**
* A sample servlet to demonstrate how to use JCICSX to LINK to a CICS Program
* with CHAR data
*/
@WebServlet("/SampleServlet")
public class CharLinkServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Name of the program to invoke.
*/
private static final String PROG_NAME = "EDUCHAN";
/**
* Name of the channel to use.
*/
private static final String CHANNEL = "MYCHANNEL";
/**
* Name of the container used to send data to the target program.
*/
private static final String INPUT_CONTAINER = "INPUTDATA";
/**
* Name of the container which will contain the response from the target
* program.
*/
private static final String OUTPUT_CONTAINER = "OUTPUTDATA";
/**
* Data to place in the container to be sent to the target program.
*/
private static final String INPUTSTRING = "Hello from Java";
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().print("Hello world! ");
// Message to emit as the response
String resultStr = null;
// Gets the current CICS Context for the environment we're running in
CICSContext task = CICSContext.getCICSContext();
try {
// Create a reference to the Program we will invoke and specify the channel
// Don't syncpoint between remote links, this is the default
// Link to the program with an input container, containing the input string of
// "Hello from Java"
task.createProgramLinkerWithChannel(PROG_NAME, CHANNEL).setSyncOnReturn(false)
.setStringInput(INPUT_CONTAINER, INPUTSTRING).link();
// Get the data from the output container as a string
// You could remove task.getChannel(CHANNEL) and do this as one chained command
// above, but this demonstrates how you could call this part later on in your
// program
resultStr = task.getChannel(CHANNEL).getCHARContainer(OUTPUT_CONTAINER).get();
if (resultStr == null) {
// Missing response container
resultStr = "<missing>";
}
// Format the final message and print it
String msg = "Returned from link to \'" + PROG_NAME + "\' with a text response of \'" + resultStr + "\'";
response.getWriter().println(msg);
} catch (CICSConditionException e) {
response.getWriter().println("An exception has occured" + "\nRESP: " + e.getRespCode() + "\nRESP2: "
+ e.getResp2() + "\nMessage: " + e.getMessage());
}
}
}
Ici, les classes JCICSX sont utilisées pour effectuer des opérations sur les programmes Channel & Container et LINK. Plus précisément, les opérations suivantes sont effectuées.
--Créez un conteneur appelé "INPUT DATA" dans le canal "MY CHANNEL" et entrez la chaîne "Hello from Java" --Appelez le programme COBOL "EDUCHAN" avec "MY CHANNEL"
La source COBOL est également fournie, alors vérifiez-la également.
EDUCHAN
*----------------------------------------------------------------*
* Licensed Materials - Property of IBM *
* SAMPLE *
* (c) Copyright IBM Corp. 2016 All Rights Reserved *
* US Government Users Restricted Rights - Use, duplication or *
* disclosure restricted by GSA ADP Schedule Contract with *
* IBM Corp *
*----------------------------------------------------------------*
******************************************************************
* *
* Module Name EDUCHAN.CBL *
* Version 1.0 *
* Date 22/10/2016 *
* *
* CICS back-end channel/container sample *
* *
* This program expects to be invoked with a CHAR container named *
* INPUTDATA and returns the following containers: *
* A CHAR container containing the reversed input string *
* A CHAR container containing the time *
* A BIT container containing the CICS return code from reading *
* the input container *
******************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. EDUCHAN.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
* Container name declarations
* Channel and container names are case sensitive
01 DATE-CONT PIC X(16) VALUE 'CICSTIME'.
01 INPUT-CONT PIC X(16) VALUE 'INPUTDATA'.
01 OUTPUT-CONT PIC X(16) VALUE 'OUTPUTDATA'.
01 LENGTH-CONT PIC X(16) VALUE 'INPUTDATALENGTH'.
01 ERROR-CONT PIC X(16) VALUE 'ERRORDATA'.
01 RESP-CONT PIC X(16) VALUE 'CICSRC'.
* Data fields used by the program
01 INPUTLENGTH PIC S9(8) COMP-4.
01 DATALENGTH PIC S9(8) COMP-4.
01 CURRENTTIME PIC S9(15) COMP-3.
01 ABENDCODE PIC X(4) VALUE SPACES.
01 CHANNELNAME PIC X(16) VALUE SPACES.
01 INPUTSTRING PIC X(72) VALUE SPACES.
01 OUTPUTSTRING PIC X(72) VALUE SPACES.
01 RESPCODE PIC S9(8) COMP-4 VALUE 0.
01 RESPCODE2 PIC S9(8) COMP-4 VALUE 0.
01 DATE-TIME.
03 DATESTRING PIC X(10) VALUE SPACES.
03 TIME-SEP PIC X(1) VALUE SPACES.
03 TIMESTRING PIC X(8) VALUE SPACES.
01 RC-RECORD PIC S9(8) COMP-4 VALUE 0.
01 ERR-RECORD.
03 ERRORCMD PIC X(16) VALUE SPACES.
03 ERRORSTRING PIC X(32) VALUE SPACES.
PROCEDURE DIVISION.
* -----------------------------------------------------------
MAIN-PROCESSING SECTION.
* -----------------------------------------------------------
* Get name of channel
EXEC CICS ASSIGN CHANNEL(CHANNELNAME)
END-EXEC.
* If no channel passed in, terminate with abend code NOCH
IF CHANNELNAME = SPACES THEN
MOVE 'NOCH' TO ABENDCODE
PERFORM ABEND-ROUTINE
END-IF.
* Read content and length of input container
MOVE LENGTH OF INPUTSTRING TO INPUTLENGTH.
EXEC CICS GET CONTAINER(INPUT-CONT)
CHANNEL(CHANNELNAME)
FLENGTH(INPUTLENGTH)
INTO(INPUTSTRING)
RESP(RESPCODE)
RESP2(RESPCODE2)
END-EXEC.
* Place RC in binary container for return to caller
MOVE RESPCODE TO RC-RECORD.
EXEC CICS PUT CONTAINER(RESP-CONT)
FROM(RC-RECORD)
FLENGTH(LENGTH OF RC-RECORD)
BIT
RESP(RESPCODE)
END-EXEC.
IF RESPCODE NOT = DFHRESP(NORMAL)
PERFORM RESP-ERROR
END-IF.
* Place reversed string in output container
MOVE FUNCTION REVERSE(INPUTSTRING) TO OUTPUTSTRING.
EXEC CICS PUT CONTAINER(OUTPUT-CONT)
FROM(OUTPUTSTRING)
FLENGTH(LENGTH OF OUTPUTSTRING)
CHAR
RESP(RESPCODE)
END-EXEC.
IF RESPCODE NOT = DFHRESP(NORMAL)
PERFORM RESP-ERROR
END-IF.
* Get the current time
EXEC CICS ASKTIME ABSTIME(CURRENTTIME)
END-EXEC.
* Format date and time
EXEC CICS FORMATTIME
ABSTIME(CURRENTTIME)
DDMMYYYY(DATESTRING)
DATESEP('/')
TIME(TIMESTRING)
TIMESEP(':')
RESP(RESPCODE)
END-EXEC.
* Check return code
IF RESPCODE NOT = DFHRESP(NORMAL)
STRING 'Failed' DELIMITED BY SIZE
INTO DATESTRING END-STRING
END-IF.
* Place current date in container CICSTIME
EXEC CICS PUT CONTAINER(DATE-CONT)
FROM(DATE-TIME)
FLENGTH(LENGTH OF DATE-TIME)
CHAR
RESP(RESPCODE)
END-EXEC.
* Check return code
IF RESPCODE NOT = DFHRESP(NORMAL)
PERFORM RESP-ERROR
END-IF.
* Return back to caller
PERFORM END-PGM.
* -----------------------------------------------------------
RESP-ERROR.
MOVE 'EDUC' TO ABENDCODE
PERFORM ABEND-ROUTINE.
PERFORM END-PGM.
* -----------------------------------------------------------
* Abnormal end
* -----------------------------------------------------------
ABEND-ROUTINE.
EXEC CICS ABEND ABCODE(ABENDCODE) END-EXEC.
* -----------------------------------------------------------
* Finish
* -----------------------------------------------------------
END-PGM.
EXEC CICS RETURN END-EXEC.
Dans le programme COBOL, les chaînes de caractères reçues dans le conteneur INPUTDATA sont définies dans le conteneur OUTPUTDATA dans l'ordre inverse et renvoyées. De plus, nous ajoutons un conteneur pour mettre la date et l'heure et le code REEE.
La source est utilisée telle quelle sans aucune modification.
Étant donné que cet exemple est un scénario de création d'un programme Java qui appelle un programme COBOL existant, l'application COBOL doit être préparée dans l'environnement de développement. Transférez la source COBOL (EDUCHAN) vers z / OS, compilez-la / liez-la et enregistrez la définition de programme dans la région CICS où la configuration CCD-Liberty pour le développement à distance est effectuée. Il s'agit de la même procédure que pour une application CICS-COBOL conventionnelle, elle est donc omise ici.
Faites un clic droit sur le projet --Maven --Sélectionnez le projet de mise à jour Sélectionnez un projet et OK
Cliquez avec le bouton droit sur CharLinkServlet.java-Run-Run sur le serveur Sélectionnez Liberty Server avec configuration jcicsx et Suivant
Terminé
Une fois le Liberty spécifié lancé et l'application déployée, le navigateur s'ouvre et le servlet est exécuté.
Il a fonctionné avec succès! La chaîne "Hello from Java" est renvoyée dans l'ordre inverse. En d'autres termes, vous pouvez voir que le programme COBOL sur CICS a été appelé même s'il était exécuté sur le Liberty local. En d'autres termes, il a été confirmé que si vous configurez JCICSX pour le développement à distance à l'avance, vous pouvez même tester sur Liberty simplement en utilisant le côté PC! En tant que processus de développement normal, vous pouvez effectuer la modification, le déploiement et les tests sur votre PC.
Afin d'exécuter effectivement l'application CICS-Liberty, il est nécessaire de configurer JVMSERVER pour Liberty. Vous n'avez pas besoin de la fonction de développement à distance JCICSX ici, vous pouvez donc simplement configurer le JVMSERVER comme vous le feriez normalement. De plus, étant donné qu'il est supposé que Deploy sera automatisé en tant que projet Maven ici, le CICS cible appartient au CICSplex et il est nécessaire de configurer l'API de déploiement dans WUI. La "préparation de l'environnement d'exécution" suivante correspond à ce domaine tel qu'il est. Référence: [CICS-Run Java application- (2) Build management by Maven](https://qiita.com/tomotagwork/items/a487484835d4e8dd2d6f#%E5%AE%9F%E8%A1%8C%E7%92% B0% E5% A2% 83zos-cics)
pom.xml contient également la configuration du projet CICS Bundle. Lors du déploiement de l'application dans l'environnement CICS réel, la configuration qui l'entoure est requise, alors modifiez-la en fonction de l'environnement d'exécution défini ci-dessus.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ibm.cics</groupId>
<artifactId>cics004-char-link-program-sample</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<!-- JCICSX dependency, used in CharLinkServlet.java -->
<dependency>
<groupId>com.ibm.cics</groupId>
<artifactId>com.ibm.cics.jcicsx</artifactId>
<version>1.000.0-5.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- The below bundles the application as a WAR in a CICS bundle and deploys this to CICS using the CICS bundle deployment API.
This is optional and can be removed if you don't wish to deploy the application this way -->
<plugin>
<groupId>com.ibm.cics</groupId>
<artifactId>cics-bundle-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<!-- These goals will firstly run the war packaging on the project, and then will run the deploy goal, which will happen during the verify phase of the lifecycle by default-->
<goals>
<goal>bundle-war</goal>
<goal>deploy</goal>
</goals>
<configuration>
<!-- The bundle classifier indicates that the war should be packaged into a CICS bundle -->
<classifier>cics-bundle</classifier>
<!-- Update the default JVM server that the application will be installed into by default, This is used when creating the bundle, and goes into the CICS bundle's manifest -->
<jvmserver>DFHWLP</jvmserver>
<!-- Set the URL of the deploy target -->
<url>http://etp1:56002</url>
<!-- We'd recommend that you use Maven's password encryption, or supply your credentials using environment variables or properties, as shown here. -->
<username>TAG</username>
<password>********</password>
<!-- Identify which bundle definition you're going to use from the CSD and which region and CICSPlex you want to deploy to -->
<bunddef>CHARLINK</bunddef>
<csdgroup>TAGGRP</csdgroup>
<cicsplex>C73PLX</cicsplex>
<region>CT56B4A1</region>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Modifiez le premier artifactId et la première version afin qu'ils soient uniques dans le même environnement CICSplex.
Créez une définition BUNDLE sur CICS conformément à la définition dans pom.xml ci-dessus.
OBJECT CHARACTERISTICS CICS RELEASE = 0730
CEDA View Bundle( CHARLINK )
Bundle : CHARLINK
Group : TAGGRP
DEScription : CICS-BUNDLE-DEMO
Status : Enabled Enabled | Disabled
BUndledir : /var/cicsts/cicsts56/bundles/cics004-char-link-program-sam
(Mixed Case) : ple_1.0.0
:
:
:
BAsescope :
(Mixed Case) :
:
:
:
DEFINITION SIGNATURE
DEFinetime : 08/11/20 16:05:22
CHANGETime : 08/11/20 16:07:52
Aucune installation n'est effectuée ici.
Cette fois, nous utiliserons la même région pour l'environnement de développement et l'environnement de production, mais le serveur JVM est séparé. J'ai utilisé la définition JVMSERVER appelée DFHWLPX pour l'environnement de développement, mais cela doit être supprimé et seul le JVMServer: DFHWLP (non configuré pour JCICSX) pour l'environnement de production doit être activé.
Puisque le programme COBOL appelé EDUCHAN est lié à partir de l'application Java, il est nécessaire de pouvoir appeler ce programme. La même région étant cette fois utilisée pour l'environnement de développement et l'environnement de production, on suppose que le programme COBOl a déjà été mis en place. Bien entendu, si les régions sont séparées, il est nécessaire d'ajouter la définition du programme à l'environnement réel.
Cliquez avec le bouton droit sur pom.xml dans Eclipse --Exécuter --Maven install
Vous pouvez vérifier le résultat de l'exécution de mvn install dans la vue de la console.
C'est OK si BUILD SUCCESS est sorti.
Par mesure de sécurité, assurez-vous que l'ensemble et les composants fournis sont installés dans CICS Explorer.
Accédez à l'application CICS-Liberty à l'URL suivante http://etp1:56441/cics004-char-link-program-sample-1.0.0/SampleServlet
J'ai pu confirmer l'opération avec le même code même dans l'environnement réel CICS-Liberty!
Recommended Posts