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.
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
Entwicklungsumgebung Windows10
** Ausführungsumgebung ** z/OS V2.4 CICS Transaction Server for z/OS V5.6
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
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.
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.
Referenz: Konfigurieren der Umgebung für JCICSX
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.
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)
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.
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)
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
Klicken Sie auf Zusätzliche Funktionen installieren
Wenn Sie "JCICS" für den Filter angeben, wird die JCICSX-Entwicklungsfunktion für Java aufgelistet. Klicken Sie auf "Weiter".
Lizenz bestätigen und abschließen
Wählen Sie nach der Installation der Funktion den Benutzer jcicsxClient-1.0 aus, der nach jcicsx gefiltert und angezeigt wird.
Als Feature hinzugefügt.
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>
...
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:
Damit ist die Konfiguration "Remote Development" abgeschlossen.
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
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/」
Wählen Sie CICS Explorer und Weiter
Nächster
Lizenz bestätigen und abschließen
Die Installation dauert lange. Diese Art der Bestätigung kann unterwegs erscheinen. Ergreifen Sie daher geeignete Maßnahmen.
Wenn Sie fertig sind, wird das folgende Popup angezeigt. Starten Sie Eclipse neu
Die CICS Explorer-Funktion ist jetzt in Eclipse integriert.
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
Wählen Sie "char-link-program-sample" unter dem geklonten Verzeichnis
Das Projekt wurde erstellt.
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.
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.
Klicken Sie mit der rechten Maustaste auf Projekt --Maven - Wählen Sie Projekt aktualisieren Wählen Sie ein Projekt und klicken Sie auf OK
Klicken Sie mit der rechten Maustaste auf CharLinkServlet.java-Run-Run auf dem Server Wählen Sie Liberty Server mit jcicsx-Konfiguration und Weiter
Erledigt
Nachdem die angegebene Liberty gestartet und die App bereitgestellt wurde, wird der Browser geöffnet und das Servlet ausgeführt.
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.
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)
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.
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.
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.
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.
Klicken Sie in der Installation von Eclipse --Run --Maven mit der rechten Maustaste auf pom.xml
Sie können das Ausführungsergebnis der MVN-Installation in der Konsolenansicht überprüfen.
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.
Greifen Sie unter der folgenden URL auf die CICS-Liberty-App zu http://etp1:56441/cics004-char-link-program-sample-1.0.0/SampleServlet
Ich konnte den Vorgang auch in der aktuellen CICS-Liberty-Umgebung mit demselben Code bestätigen!
Recommended Posts