CICS-Java-Anwendung ausführen- (5) Verwenden Sie JCICSX

Einführung

CICS Transaction Server bietet eine Klassenbibliothek namens JCICS zur Verwendung der CICS-Funktion aus Java. Dies ist die Java-Version der sogenannten EXEC CICS-API, mit der Sie andere CICS-Programme mit LINK aufrufen und auf CICS-Verwaltungsressourcen wie TSQ / TDQ zugreifen können. Auf diese Weise können Sie eine CICS-Anwendung in Java schreiben. CICS TS V5.6 wurde am 12.06.2020 ausgeliefert und bietet jetzt eine neue CICS-API für Java namens JCICSX, eine Erweiterung von JCICS. Hier werde ich eine Reihe von Abläufen beschreiben, als ich versuchte, die JCI CSX zu verschieben.

In Verbindung stehender Artikel

CICS-Java-Anwendung ausführen - (1) Einfache Beispiel-App ausführen CICS-Java-Anwendung ausführen - (2) Build-Verwaltung durch Maven CICS-Java-Anwendung ausführen - (3) Build-Verwaltung von Gradle CICS-Run Java-Anwendung- (4) Spring Boot-Anwendung CICS-Java-Anwendung ausführen- (5) JCICSX verwenden

Umweltinformationen

Entwicklungsumgebung Windows10

** Ausführungsumgebung ** z/OS V2.4 CICS Transaction Server for z/OS V5.6

Übersicht über JCICSX

Die Position der "Klassenbibliothek für die Verwendung der CICS-Funktion aus Java ≒ Java-Version der EXEC CICS-API" ist für JCICS und JCICSX gleich. Der Unterschied besteht darin, dass JCICSX eine erweiterte API ist, die das Testen auf Ihrem lokalen PC (in der Entwicklungsumgebung) erleichtert. Darüber hinaus unterstützt JCICS eine Vielzahl von Funktionen, die EXEC CICS entsprechen. JCICSX ist jedoch weiterhin eingeschränkt, und es werden nur Funktionen für Channel & Container und Link bereitgestellt. Referenz: JCICS Javadoc JCICSX Javadoc

"Einfach auf einem lokalen PC (Entwicklungsumgebung) zu testen" hat die folgenden zwei Punkte.

(1) Unit-Test mit dem Test-Framework ist möglich image.png

Natürlich gibt es auf dem lokalen PC keine CICS-Laufzeit, daher kann der CICS-abhängige Code (JCICSX-Teil) nicht so ausgeführt werden, wie er ist. Wenn Sie einen Komponententest für ein Modul durchführen, das umgebungsabhängigen Code wie DB-Zugriff enthält, gibt es ein Framework (Mockito usw.), das den externen Ressourcenzugriffsteil als Mock behandelt. Es wird jedoch angegeben, dass er auch auf den CICS-Zugriffsteil angewendet wird. .. (Ich denke, dies liegt hauptsächlich an den Funktionen von Frameworks wie Mockito.)

(2) Der Betrieb kann auf dem Liberty-Server auf dem PC bestätigt werden Dies ist die Haupterweiterungsfunktion von CICS, aber wir bieten einen Mechanismus zum Überprüfen des Betriebs von JCICSX mit Liberty auf dem lokalen PC (in der Entwicklungsumgebung). Das Bild ist wie folgt. image.png

Dieser Mechanismus wird als "Fernentwicklung" bezeichnet. Bereiten Sie Liberty auf dem PC und CICS-Liberty für die Entwicklungsumgebung vor und konfigurieren Sie die Funktionen für die JCICSX-Remoteentwicklung. Bei dieser Art der Konfiguration funktioniert Liberty auf dem lokalen PC so, als würde es auf CICS ausgeführt. Daher ist es nicht erforderlich, die Anwendung auf der Host-Seite bereitzustellen und den Betrieb jedes Mal zu überprüfen, wenn Sie versuchen, Fehler zu machen oder zu testen, und es ist möglich, einen detaillierten Zyklus der Betriebsprüfung und -korrektur auf dem lokalen PC auszuführen. Sobald der Code endgültig verfestigt ist, kann er in der realen CICS-Liberty-Umgebung für den Test- / Produktionsring bereitgestellt und ausgeführt werden.

Mit anderen Worten, es ist praktisch, JCICSX zu verwenden, wenn Sie eine Liberty-App erstellen, die Daten mit Channel & Container übergibt und eine vorhandene App mit Link aufruft (mit COMMAREA übergebener LINK ist nicht möglich).

Im Folgenden wird das Konfigurationsverfahren zum Testen von JCICSX auf dem Liberty-Server auf Ihrem PC beschrieben.

Konfiguration der CICS-Liberty-Remoteentwicklungsumgebung

Referenz: Konfigurieren der Umgebung für JCICSX

Konfiguration auf der CICS-Liberty-Seite (Serverseite)

JVM-Profil

Bereiten Sie das JVM-Profil auf USS vor. (Die mit JVMServer verbundenen Eigenschaften werden effektiv in der Datei auf diesem USS angegeben. Die JVMSERVER-Ressourcendefinition verweist auf den Dateinamen dieses JVM-Profils.) Ein Beispiel wird mitgeliefert. Kopieren Sie es und verwenden Sie es.

Erstellen Sie ein Verzeichnis mit dem Namen / var / cicsts / cicsts56 / CT56B4A1 / JVMProfiles und fügen Sie /usr/lpp/cicsts/cicsts56/JVMProfiles/DFHWLP.jvmprofile (Beispieldefinition für Liberty im CCD-Installationsverzeichnis) hinzu. Kopieren Sie es mit dem Namen DFHWLPX.jvmprofile. Passen Sie es an Ihre Umgebung an.

DFHWLPX.jvmprofile Auszug


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

Geben Sie im SIT-Parameter "JVMPROFILEDIR" das Verzeichnis an, in dem sich die obige Eigenschaftendatei befindet.

JVMPROFILEDIR=/var/cicsts/cicsts56/CT56B4A1/JVMProfiles 

Starten Sie die Region neu, damit die Änderungen wirksam werden.

JVM-Serverdefinition

Bereiten Sie die JVMSERVER-Ressourcendefinition vor. Passen Sie die JVMSERVER-Definition "DFHWLP" in der vom Produkt bereitgestellten DFH $ WLP-Gruppe an, indem Sie sie in die entsprechende Gruppe mit dem Namen "DFHWLPX" kopieren.

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                                                                                                                    

Installieren Sie diesen JVMSERVER einmal.

Es ist in Ordnung, wenn es unter CEMT I JVMSERVER aktiviert ist.

I JVMS                                                
STATUS:  RESULTS - OVERTYPE TO MODIFY                 
 Jvm(DFHWLPX ) Ena     Prf(DFHWLPX ) Ler(DFHAXRO )    
    Threadc(012) Threadl( 015 ) Cur(65873224)              

JCICSX-Feature / serverseitige Konfiguration

Da im JVM-Profil "com.ibm.cics.jvmserver.wlp.autoconfigure = true" angegeben ist, wird Liberty bei der Installation des JVM-Servers automatisch konfiguriert.

\ <WORK_DIR > /CT56B4A1/DFHWLPX/wlp/usr/servers/defaultServer/server.xml wurde erstellt. Bearbeiten Sie es daher. Fügen Sie eine Funktion namens cicsts: jcicsxServer-1.0 wie folgt hinzu:

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

Wenn Sie den JVM-Server neu starten, wird das folgende Protokoll als Liberty-Startnachricht angezeigt. (<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/
...

Die hier gezeigte URL wird in der Liberty-Konfiguration auf der PC-Seite verwendet.

Liberty-Konfiguration (clientseitig) auf dem lokalen PC

Einführung von Eclipse / Liberty

Richten Sie die Eclipse-Umgebung unter Windows 10 ein und installieren Sie Liberty. Verwenden Sie für das Verfahren das im folgenden Artikel beschriebene. [Liberty Base für WebSphere Application Server - Konstruktionsnotiz für die JCA-Verbindungsumgebung - Setup der Entwicklungsumgebung (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 Fenster)

JCIC SX-bezogene Funktionen hinzugefügt

Doppelklicken Sie in der Serveransicht von Eclipse auf den Liberty-Ziel-Feature-Manager, um server.xml zu öffnen, und klicken Sie rechts neben der Feature-Liste auf Hinzufügen image.png

Klicken Sie auf Zusätzliche Funktionen installieren image.png

Wenn Sie "JCICS" für den Filter angeben, wird die JCICSX-Entwicklungsfunktion für Java aufgelistet. Klicken Sie auf "Weiter". image.png

Lizenz bestätigen und abschließen image.png

image.png

Wählen Sie nach der Installation der Funktion den Benutzer jcicsxClient-1.0 aus, der nach jcicsx gefiltert und angezeigt wird. image.png

Als Feature hinzugefügt. image.png

Wenn man sich die Quelle von server.xml ansieht, sieht es so aus.

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

JCICSX-Feature / clientseitige Konfiguration

Bearbeiten Sie die Datei server.xml und fügen Sie die folgenden Einstellungen hinzu.

server.xml


...
    <!-- JCICSX Client Config -->
    <usr_jcicsxClient serverUri="http://etp1:56461"/>
...

Die serverUri-Adresse und der Port sind OCIS-Liberty-Endpunkte, die für den JCICSX-Server konfiguriert sind. Wenn Sie sich server.xml in der Entwurfsansicht ansehen, sieht es folgendermaßen aus: image.png

Damit ist die Konfiguration "Remote Development" abgeschlossen.

Entwickeln von Anwendungen auf einem lokalen PC mit JCICSX

Wartung der JCICSX-Entwicklungsumgebung

Es gibt verschiedene Möglichkeiten, die JCICSX-Klassenbibliothek bereitzustellen, sie ist jedoch auch im CICS SDK für Java im CICS Explorer enthalten. Wenn Sie die CICS Explorer-Funktion in Eclipse integrieren, ist die Verwaltung einfacher, sodass CICS Explorer in die Eclipse-Umgebung aufgenommen wird.

Referenz: CICS Explorer herunterladen und starten

Wählen Sie im Menü Eclipse die Option Hilfe - Neue Software installieren image.png

Drücken Sie Hinzufügen, um die folgenden Repositorys hinzuzufügen. 「https://public.dhe.ibm.com/ibmdl/export/pub/software/htp/zos/tools/aqua3.2/」 image.png

Wählen Sie CICS Explorer und Weiter image.png

Nächster image.png

Lizenz bestätigen und abschließen image.png

Die Installation dauert lange. Diese Art der Bestätigung kann unterwegs erscheinen. Ergreifen Sie daher geeignete Maßnahmen. image.png

Wenn Sie fertig sind, wird das folgende Popup angezeigt. Starten Sie Eclipse neu image.png

Die CICS Explorer-Funktion ist jetzt in Eclipse integriert.

Beispiel-App importieren

Hier werde ich versuchen, das auf GitHub bereitgestellte Beispiel auszuführen. GitHub: cics-java-jcicsx-samples Erstellen Sie lokal einen Klon.

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.

Importieren Sie von den verschiedenen Beispielen "char-link-program-sample" in Eclipse.

Klicken Sie mit der rechten Maustaste auf die Enterprise Explorer-Ansicht in JavaEE Perspective-Import Maven - Wählen Sie ein vorhandenes Maven-Projekt aus image.png

Wählen Sie "char-link-program-sample" unter dem geklonten Verzeichnis image.png

Das Projekt wurde erstellt. image.png

Überprüfen Sie den Inhalt

Werfen wir einen Blick auf 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>

Eine JCICSX-Abhängigkeit wurde angegeben. Die Einstellungen für die BUNDLE-Definition sind ebenfalls enthalten, lassen Sie sie jedoch vorerst unverändert.

Schauen wir uns als nächstes die Servlet-Quelle an.

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());
		}
	}

}

Hier wird die JCICSX-Klasse verwendet, um Operationen an Channel & Container auszuführen und das Programm zu verknüpfen. Insbesondere werden die folgenden Operationen ausgeführt.

--Erstelle einen Container namens "INPUT DATA" im Kanal "MY CHANNEL" und gib die Zeichenfolge "Hello from Java" ein.

Die COBOL-Quelle wird ebenfalls bereitgestellt. Überprüfen Sie dies ebenfalls.

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.


Im COBOL-Programm werden die im Container INPUTDATA empfangenen Zeichenfolgen in umgekehrter Reihenfolge im Container OUTPUTDATA festgelegt und zurückgegeben. Andere Wir fügen einen Container hinzu, um Datum und Uhrzeit sowie den RESP-Code anzugeben.

Die Quelle wird unverändert verwendet.

Vorbereitung der COBOL-Anwendung

Da dieses Beispiel ein Szenario zum Erstellen eines Java-Programms ist, das ein vorhandenes COBOL-Programm aufruft, muss die COBOL-Anwendung in der Entwicklungsumgebung vorbereitet werden. Übertragen Sie die COBOL-Quelle (EDUCHAN) nach z / OS, kompilieren / verknüpfen Sie sie und registrieren Sie die Programmdefinition in der CICS-Region, in der die CCD-Liberty-Konfiguration für die Remoteentwicklung durchgeführt wird. Dies ist das gleiche Verfahren wie bei einer herkömmlichen CICS-COBOL-Anwendung, daher wird es hier weggelassen.

Java-Anwendung erstellen / bereitstellen / testen

Klicken Sie mit der rechten Maustaste auf Projekt --Maven - Wählen Sie Projekt aktualisieren Wählen Sie ein Projekt und klicken Sie auf OK image.png

Klicken Sie mit der rechten Maustaste auf CharLinkServlet.java-Run-Run auf dem Server Wählen Sie Liberty Server mit jcicsx-Konfiguration und Weiter image.png

Erledigt image.png

Nachdem die angegebene Liberty gestartet und die App bereitgestellt wurde, wird der Browser geöffnet und das Servlet ausgeführt. image.png

Es lief erfolgreich! Die Zeichenfolge "Hallo von Java" wird in umgekehrter Reihenfolge zurückgegeben. Mit anderen Worten, Sie können sehen, dass das COBOL-Programm unter CICS aufgerufen wurde, obwohl es auf der lokalen Liberty ausgeführt wurde. Mit anderen Worten, wenn Sie JCICSX im Voraus für die Remote-Entwicklung konfigurieren, können Sie bestätigen, dass Sie sogar auf Liberty testen können, indem Sie nur die PC-Seite bedienen! Als normaler Entwicklungsprozess können Sie die Änderung, Bereitstellung und Prüfung auf Ihrem PC abschließen.

Bereitstellung / Test in einer echten CICS-Liberty-Umgebung

CICS-Seitenvorbereitung

Um die CICS-Liberty-Anwendung tatsächlich ausführen zu können, muss JVMSERVER for Liberty konfiguriert werden. Sie benötigen die JCICSX-Remoteentwicklungsfunktion hier nicht, sodass Sie den JVMSERVER einfach wie gewohnt konfigurieren können. Da hier davon ausgegangen wird, dass Deploy als Maven-Projekt automatisiert wird, gehört das Ziel-CICS zum CICSplex, und es ist erforderlich, die Deployment-API in der WUI zu konfigurieren. Die folgende "Vorbereitung der Ausführungsumgebung" entspricht diesem Bereich wie er ist. Referenz: [CICS-Java-Anwendung ausführen - (2) Build-Verwaltung durch Maven](https://qiita.com/tomotagwork/items/a487484835d4e8dd2d6f#%E5%AE%9F%E8%A1%8C%E7%92% B0% E5% A2% 83zos-cics)

Bearbeiten Sie pom.xml

pom.xml enthält auch die Konfiguration für das CICS Bundle-Projekt. Wenn Sie die App in der tatsächlichen CICS-Umgebung bereitstellen, ist die Konfiguration erforderlich. Bearbeiten Sie sie daher gemäß der oben festgelegten Ausführungsumgebung.

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>

Ändern Sie die erste Artefakt-ID und -Version so, dass sie in derselben CICSplex-Umgebung eindeutig sind.

Vorbereitung der BUNDLE-Definition

Erstellen Sie eine BUNDLE-Definition in CICS gemäß der Definition in pom.xml oben.

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                                          

Hier erfolgt keine Installation.

JVMSERVER vorbereiten

Dieses Mal verwenden wir dieselbe Region für die Entwicklungsumgebung und die Produktionsumgebung, aber der JVM-Server ist getrennt. Ich habe eine JVMSERVER-Definition namens DFHWLPX für die Entwicklungsumgebung verwendet, diese sollte jedoch verworfen werden und nur der JVMServer: DFHWLP (nicht für JCICSX konfiguriert) für die Produktionsumgebung sollte aktiviert sein.

Vorbereiten einer COBOL-Anwendung

Da das COBOL-Programm EDUCHAN über die Java-Anwendung verknüpft ist, muss dieses Programm aufgerufen werden können. Da diesmal dieselbe Region für die Entwicklungsumgebung und die Produktionsumgebung verwendet wird, wird davon ausgegangen, dass das COBOl-Programm bereits eingerichtet wurde. Wenn die Regionen getrennt sind, muss die Programmdefinition natürlich zur tatsächlichen Umgebung hinzugefügt werden.

Java-Anwendung erstellen / bereitstellen

Klicken Sie in der Installation von Eclipse --Run --Maven mit der rechten Maustaste auf pom.xml image.png

Sie können das Ausführungsergebnis der MVN-Installation in der Konsolenansicht überprüfen. image.png

Es ist in Ordnung, wenn BUILD SUCCESS ausgegeben wird.

Stellen Sie zur Sicherheit sicher, dass das Bundle und die gebündelten Teile im CICS Explorer installiert sind. image.png

Lauf

Greifen Sie unter der folgenden URL auf die CICS-Liberty-App zu http://etp1:56441/cics004-char-link-program-sample-1.0.0/SampleServlet image.png

Ich konnte den Vorgang auch in der aktuellen CICS-Liberty-Umgebung mit demselben Code bestätigen!

Recommended Posts

CICS-Java-Anwendung ausführen- (5) Verwenden Sie JCICSX
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
CICS-Java-Anwendung ausführen- (2) Build-Management mit Maven
[Java] Verwenden Sie Collectors.collectingAndThen
Verwenden Sie OpenCV mit Java
Verwenden Sie PreparedStatement in Java
Verwenden Sie Lambda-Ebenen mit Java
[Java] Verwendung von Map
Verwendung von Java Optional
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
[Java] Big Decimal richtig verwenden ~ 2018 ~
CICS-Java-Anwendung ausführen- (4) Spring Boot-App
[Java] Gründe für die Verwendung von statischen
Verwendung von Java-Variablen
Verwenden Sie SpatiaLite mit Java / JDBC
Führen Sie die Java EE-Anwendung unter CICS aus
Verwendung von HttpClient (Get) von Java
Verwenden Sie Microsoft Graph mit Standard-Java
Verwandeln Sie Java-Anwendungen mit Jib ganz einfach in Docker
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Verwenden wir Twilio in Java! (Einführung)
Verwenden Sie Azure Bing SpellCheck mit Java
Verwenden Sie JDBC mit Java und Scala.
[Java] Verwenden Sie nicht "+" im Anhang!
Verwenden Sie zusammengesetzte Schlüssel in Java Maps.
[Verarbeitung × Java] Verwendung von Variablen
Verwenden Sie Java 11 mit Google Cloud-Funktionen
Java (Klassentyp für Feld verwenden)
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
[Verarbeitung × Java] Verwendung von Arrays
Verwendung von Java-Lambda-Ausdrücken
Verwenden Sie Stream in Java?
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps