Application Java CICS-Run - (5) Utiliser JCICSX

introduction

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.

Article associé

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

Informations environnementales

Environnement de développement Windows10

** Environnement d'exécution ** z/OS V2.4 CICS Transaction Server for z/OS V5.6

Vue d'ensemble de JCICSX

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 image.png

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. image.png

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.

Configuration de l'environnement de développement distant CICS-Liberty

Référence: Configuration de l'environnement pour JCICSX

Configuration côté CICS-Liberty (côté serveur)

Profil JVM

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.

Définition du serveur JVM

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)              

Fonction JCICSX / configuration côté serveur

É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.

Configuration Liberty (côté client) sur le PC local

Présentation d'Eclipse / Liberty

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)

Ajout de fonctionnalités liées à JCIC SX

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 image.png

Cliquez sur Installer des fonctionnalités supplémentaires image.png

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. image.png

Confirmer la licence et terminer image.png

image.png

Maintenant que la fonctionnalité est installée, sélectionnez l'utilisateur: jcicsxClient-1.0, qui est filtré par jcicsx et affiché. image.png

Ajouté en tant que fonctionnalité. image.png

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>
...

Fonction JCICSX / configuration côté client

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: image.png

Ceci termine la configuration "développement à distance".

Développement d'applications sur un PC local à l'aide de JCICSX

Maintenance de l'environnement de développement JCICSX

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 image.png

Appuyez sur Ajouter pour ajouter les référentiels suivants. 「https://public.dhe.ibm.com/ibmdl/export/pub/software/htp/zos/tools/aqua3.2/」 image.png

Sélectionnez CICS Explorer et Suivant image.png

prochain image.png

Confirmer la licence et terminer image.png

L'installation prend beaucoup de temps. Ce type de confirmation peut apparaître sur le chemin, alors prenez les mesures appropriées. image.png

Une fois terminé, la fenêtre contextuelle suivante apparaîtra, alors redémarrez Eclipse image.png

La fonction CICS Explorer est désormais intégrée à Eclipse.

Importer un exemple d'application

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 image.png

Sélectionnez "char-link-program-sample" dans le répertoire cloné image.png

Le projet a été créé. image.png

Vérifiez le contenu

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.

Préparation de l'application COBOL

É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.

Créer / déployer / tester une application Java

Faites un clic droit sur le projet --Maven --Sélectionnez le projet de mise à jour Sélectionnez un projet et OK image.png

Cliquez avec le bouton droit sur CharLinkServlet.java-Run-Run sur le serveur Sélectionnez Liberty Server avec configuration jcicsx et Suivant image.png

Terminé image.png

Une fois le Liberty spécifié lancé et l'application déployée, le navigateur s'ouvre et le servlet est exécuté. image.png

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.

Déployer / tester dans un environnement réel CICS-Liberty

Préparation côté CICS

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)

Modifier pom.xml

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.

Préparation de la définition du BUNDLE

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.

Préparation du JVMSERVER

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é.

Préparer une application COBOL

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.

Créer / déployer une application Java

Cliquez avec le bouton droit sur pom.xml dans Eclipse --Exécuter --Maven install image.png

Vous pouvez vérifier le résultat de l'exécution de mvn install dans la vue de la console. image.png

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. image.png

Courir

Accédez à l'application CICS-Liberty à l'URL suivante http://etp1:56441/cics004-char-link-program-sample-1.0.0/SampleServlet image.png

J'ai pu confirmer l'opération avec le même code même dans l'environnement réel CICS-Liberty!

Recommended Posts

Application Java CICS-Run - (5) Utiliser JCICSX
Application Java CICS-Run - (3) Gestion de build avec Gradle
Application Java CICS-Run - (2) Gestion de build avec Maven
[Java] Utilisez Collectors.collectingAndThen
Utiliser OpenCV avec Java
Utiliser PreparedStatement en Java
Utiliser des couches Lambda avec Java
[Java] Comment utiliser Map
Comment utiliser java Facultatif
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
[Java] Utilisez correctement Big Decimal ~ 2018 ~
Application Java CICS-Run - (4) Application Spring Boot
[java] Raisons d'utiliser statique
Comment utiliser les variables Java
Utiliser SpatiaLite avec Java / JDBC
Exécutez l'application Java EE sur CICS
Comment utiliser HttpClient de Java (Get)
Utiliser Microsoft Graph avec Java standard
Transformez facilement les applications Java en Docker avec Jib
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
Utilisons Twilio en Java! (Introduction)
Utiliser Azure Bing SpellCheck avec Java
Utilisez JDBC avec Java et Scala.
[Java] N'utilisez pas "+" dans append!
Utilisez des clés composites dans Java Maps.
[Traitement × Java] Comment utiliser les variables
Utiliser Java 11 avec Google Cloud Functions
java (utilisez le type de classe pour le champ)
[JavaFX] [Java8] Comment utiliser GridPane
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
[Traitement × Java] Comment utiliser les tableaux
Comment utiliser les expressions Java lambda
Utilisez-vous Stream en Java?
[Java] Comment utiliser la classe Math
Comment utiliser le type enum Java