CICS上でJavaEEアプリケーションを動かす

# はじめに
CICS(CICS Transaction Server for z/OS)というと、COBOL、 PL/I、 アセンブラ等の言語でアプリケーションを書くのが主流というイメージがあると思いますが、ずいぶん前からJavaのサポートも追加されています。
さらに最近のバージョンでは、Liberty(WAS: WebSphere Application Serverの軽量版)がCICS上で動作するようになっています。つまり、CICS上でJavaEEアプリケーションを稼働させることができるようになっています。

例えば既存のCICSアプリケーションがあったとして、それをWebからアクセスさせるためのWeb用のインターフェースを作りたい場合、別途アプリケーションサーバーを購入しなくてもCICSだけで実現できてしまいます。

CICS上でLibertyを動かすための最低限の設定と、サンプル・アプリケーションを動かす手順をまとめておきます。

<環境>
CICS TS V5.3 for z/OS
CICSリージョン名: CT53H4A1

# 実行環境整備

基本はこの辺の記述に従います。
https://www.ibm.com/support/knowledgecenter/SSGMCP_5.3.0/com.ibm.cics.ts.java.doc/JVMserver/config_jvmserver_liberty.html

CICS上動かすLibertyサーバーのプロパティ情報や、ログ等はUSS上のファイルで管理されます。そのため、まずUSS(Unix System Service)上にCICS-Libertyフィーチャーで使用するディレクトリやファイルを準備します。

## USS ディレクトリ
以下のようなディレクトリを作成しておきます。

* /var/cicsts/cicsts53/CT53H4A1/JVMProfiles/ (JVM Propertyファイル配置用)
* /var/cicsts/cicsts53/CT53H4A1/work/ (ログなどが出力される作業用ディレクトリ)

## JVM Propertyファイル
Libertyやその前提となるJVMのプロパティーなどを設定するファイルを準備します。
これは製品提供の雛形が<導入ディレクトリ>/JVMProfiles/DFHWLP.jvmpropertiesに提供されているので、それを/var/cicsts/cicsts53/CT53H4A1/JVMProfiles/DFHWLP.jvmpropertiesにコピーして編集します。
最低限必要な設定は以下の通りです。

```xxx:DFHWLP.jvmproperties
JAVA_HOME=/usr/lpp/java/J7.1_64/
WORK_DIR=/var/cicsts/cicsts53/CT53H4A1/work
WLP_INSTALL_DIR=/usr/lpp/cicsts/cicsts53/wlp
-Dcom.ibm.cics.jvmserver.wlp.autoconfigure=true
-Dcom.ibm.cics.jvmserver.wlp.server.host=*
-Dcom.ibm.cics.jvmserver.wlp.server.http.port=53481
-Dcom.ibm.cics.jvmserver.wlp.server.https.port=53482
```

使用するJavaのJAVA_HOME、work用ディレクトリ、LibertyがListenするポート番号などを指定します。

## SIT
CICSリージョンのSITにて、上で用意したプロパティーファイルのディレクトリをJVMPROFILEDIRパラメーターで指定します。

```xxx:SIT
JVMPROFILEDIR=/var/cicsts/cicsts53/CT53H4A1/JVMProfiles 
```

このSITパラメーターを有効にしてCICSリージョンを起動します。

## CICS資源定義: JVMServer定義
CICS上でLibertyを稼働させる場合、USS上に用意したプロパティーファイルを指定したJVMServer定義という資源定義を作成してインストールする必要があります。
これもサンプルがDFH$WLPグループに提供されているので、コピーして使用すればよいでしょう。

```xxx:JVMServer定義例
OBJECT CHARACTERISTICS                                    CICS RELEASE = 0700 
 CEDA  View JVmserver( DFHWLP   )                                             
  JVmserver      : DFHWLP                                                     
  Group          : TAGGRP                                                     
  DEScription    : CICS JVM server to run WLP samples                         
  Status         : Enabled            Enabled | Disabled                      
  Jvmprofile     : DFHWLP                                         (Mixed Case)
  Lerunopts      : DFHAXRO                                                    
  Threadlimit    : 015                1-256                                   
 DEFINITION SIGNATURE                                                         
  DEFinetime     : 01/29/16 09:08:50                                          
  CHANGETime     : 01/29/16 09:08:50                                          
  CHANGEUsrid    : CICSUSER                                                   
  CHANGEAGEnt    : CSDApi             CSDApi | CSDBatch                       
  CHANGEAGRel    : 0700                                                     
```

ここで指定したうJvmprofile(上の例だとDFHWLP)の値に拡張子「.jvmprofile」が付いたファイルが、SITのJVMPROFILEDIRで指定したディレクトリから探索されます。

JVMServer定義を作成したら、それをインストールしましょう。
すると、CICSのJOBLOGには以下のようなメッセージが出力されます。

```
DFHRD0131 I 03/07/2017 19:14:04 CT53H4A1 TCP00045 CICSUSER CEDA INSTALL JVMSERVER(DFHWLP)                                      
0045     CEDA CICSUSER 03/07/17 19:14:04 INSTALL JVMSERVER(DFHWLP) GROUP(TAGGRP)                                               
DFHPG0210 03/07/2017 19:14:04 CT53H4A1  IBMUSER CJSR Resource definition for DFHAXRO has been system autoinstalled.            
DFHSJ0207 03/07/2017 19:14:09 CT53H4A1 JVMSERVER DFHWLP is running Java version 1.7.1.                                         
DFHSJ0919 I 03/07/2017 19:14:17 CT53H4A1 IBMUSER JVMSERVER DFHWLP is processing any queued bundles.                            
DFHSJ0915 03/07/2017 19:14:17 CT53H4A1 IBMUSER JVMSERVER DFHWLP is now enabled and is ready for use.                           
DFHSJ0901 I 03/07/2017 19:14:17 CT53H4A1 JVMSERVER DFHWLP Java full version is: JRE 1.7.0 IBM J9 2.7 z/OS s390x-64 Compressed  
           References 20140410_195893 (JIT enabled, AOT enabled) J9VM - R27_Java727_SR1_20140410_1931_B195893 JIT  -           
           tr.r13.java_20140410_61421 GC   - R27_Java727_SR1_20140410_1931_B195893_CMPRSS J9CL - 20140410_195893. 
```

これでCICS上でLibertyのサーバーが立ち上がりました！

## 稼働確認

NETSTATコマンド等でListenしているポートの情報を確認すると、先にプロパティーファイルで指定したポートでListenしているのが分かると思います。

```xxx:NETSTAT例
398 00000090  CT53H4A1 000015DC 0.0.0.0..53481         0.0.0.0..0             LISTEN     
398 00000090  CT53H4A1 000015DD 0.0.0.0..53482         0.0.0.0..0             LISTEN   
```

LibertyサーバーがCICS上で稼働しているので、ブラウザから接続してみましょう。
http://hostname:53481/ にアクセスすると、ホーム画面が参照できます。
![image01.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/922e0700-3865-e6f3-e352-4858773d3997.jpeg)

さらに、デフォルトで提供されるWebアプリにアクセスしてみると、以下のような環境情報が確認できます。
`http://server:port/com.ibm.cics.wlp.defaultapp/`
![image02.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/28259cdf-587d-6ea3-0d58-9329645ee4e7.jpeg)

これで最低限の実行環境は整いました。
簡単ですねぇ。

# 開発環境整備
この辺の記述がベースです。
https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.3.0/com.ibm.cics.ts.java.doc/topics/installingthelibertyprofile.html

さて、CICSアプリといえども、Libertyの上で動くJavaEEアプリケーションを開発する訳なので、開発環境は PCOMの3270画面ではなく、もちろんPC上のEclipseです。
Eclipse用にCICS-Liberty用のSDKプラグインが提供されているので、それを追加すれば開発環境が作れます。
Eclipseはフリーで提供される任意のもの(バージョンの整合性は要確認ですが)を使えばよいのですが、CICSはCICS ExplorerというEclipseベースの管理ツール(フリー)が提供されているので、それを入手して、そこにSDKを入れるのがよいでしょう。

## CICS Explorer
以下の記述を参考に...
[CICS Explorerのインストール](https://www.ibm.com/support/knowledgecenter/SSGMCP_5.3.0/com.ibm.cics.core.help/topics/concepts/install_planning.html)

インストールの仕方が2通りあって、さらに、事前にEclipse入ってる場合とかz/OS Explorer入ってる場合とかあって分かりにくいかもしれませんが、手っ取り早いのは、以下のサイトの一番下の「Using Eclipse (p2)」の Option1 Starting from Scrach を選んで、該当のプラットフォームのCICS Explorerをダウンロードすればよいです。
https://developer.ibm.com/mainframe/products/downloads/eclipse-tools/#p2
で、zipが入手できるので、こいつを展開するだけです。
zip展開するとzosexplorer.exeというのがあるのでそれを実行して起動します。(CICS Explorerダウンロードしても実行ファイルはzosexplorer.exeです。)

## SDKプラグイン
以下の記述を参考に...
[Installing the CICS SDK for web and JSP](https://www.ibm.com/support/knowledgecenter/SSGMCP_5.3.0/com.ibm.cics.core.help/topics/tasks/task_install_web_sdk.html)

CICS Explorerのメニューから、ヘルプ - 新規ソフトウェアのインストール を選択し、
IBM Explorer for z/OS Update Site - http://public.dhe.ibm.com/ibmdl/export/pub/software/htp/zos/tools/aqua/ を選択します。

Webサイトからダウンロードしてインストールするので、Webにつながっている必要があります。

IBM CICS Explorerを展開して、IBM CICS SDK for Servlet and JSP support, IBM CICS SDK for Servlet and JSP translation support を選択し、インストールします。
![image03.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/00e8bf24-7782-552d-78e7-be29a7be29ad.jpeg)

## 各種設定
開発環境整備のため、いくつか設定を行います。

### ターゲットのCICSバージョン設定 
Eclipse(CICS Explorer)上で、どのバージョンのCICSを開発のターゲットにするか指定します。
設定を選択し、
プラグイン開発 - ターゲットプラットフォームを選択し、
ターゲットとなるCICSのバージョンを選択します。(ここでは CICS TS V5.3 with Liberty and PHP)
![image04.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/806f26f1-3a71-90e6-5337-7ac411a32eb1.jpeg)

![image05.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/8bce17ac-b7d1-7c35-377f-8133cffc8c96.jpeg)

### FTP構成
CICS ExplorerからアプリケーションをターゲットのCICSにデプロイする場合、作成したアプリケーションをUSS上に転送する必要があります。CICS Explorerからデプロイできるようにするために、FTPの接続構成を作っておきます。
ホスト接続ビューを開き、z/OS FTPの項目に、FTP構成の定義を行います。
![image06.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/5b70bcc2-a3f5-c2be-21aa-d2d84623c534.jpeg)

CICS ExplorerからFTP接続ができると、以下のように緑色のマークになります。
![image07.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/b75fed85-a196-88ce-fe3d-fc4815a9a7b2.jpeg)

### USSディレクトリ
アプリケーションを配置するためのディレクトリをUSS上に用意しておきましょう。
CICS-Libertyアプリケーションは、CICS上ではBUNDLE定義という資源で関連付けされるので、以下のようにbundlesというディレクトリを作成しておきます。
/var/cicsts/cicsts53/CT53H4A1/bundles/


# サンプルアプリ
さて、開発環境が整ったので、CICS SDKで提供されているサンプルアプリのプロジェクトを作成して、それをCICS-Liberty上にデプロイして動かす、というところまでやってみましょう。

## サンプル・プロジェクトの作成
以下の記述を参考に...
[Creating the servlet examples](https://www.ibm.com/support/knowledgecenter/SSGMCP_5.3.0/com.ibm.cics.server.sdk.help/topics/gettingstarted_libertyproject.html)

ファイル - 新規 - サンプルから、CICS Hello Worldを選択します。
![image08.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/cf32f458-f5a5-ddac-e486-8dcfc4befd0c.jpeg)

これでCICS Hello WorldのサンプルアプリのプロジェクトがEclipse上にインポートされました。
これは、アプリとしてはjspが1つ含まれているだけの単純なものです。
![image09.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/7c4dafb6-fc75-86eb-c6a2-fefe565ce534.jpeg)

また、これはCICS上の資源として管理するためのCICS Bundleの定義(cics.xml)が含まれています。

## デプロイ
以下の記述を参考に...
[Deploying the servlet examples](https://www.ibm.com/support/knowledgecenter/SSGMCP_5.3.0/com.ibm.cics.server.sdk.help/topics/gettingstarted_libertydeploy.html)

このアプリをデプロイしてみましょう。
xxx.bundle というプロジェクトを右クリックし、z/OS UNIX ファイルシステムへのバンドル・プロジェクトのエクスポート を選択します。
![image10.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/a0d5a502-7550-5e5f-e990-8b484803394b.jpeg)

ファイルシステム内の特定のロケーションにエクスポートを選択して次へ

上で用意しておいたデプロイ先のディレクトリを選択し、エクスポートします。
![image11.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/0bb8978f-808b-e02c-b7d2-1293af3757ab.jpeg)

これでUSS上にアプリが配置されました。

最後に、このアプリをCICSから認識させるために、BUNDLE定義という資源定義をCICS上に追加します。
このサンプル用のBUNDLE定義はDFH$WLPグループに提供されていますので、コピーして適宜編集してインストールします。

```xxx:BUNDLE定義例
OVERTYPE TO MODIFY                                        CICS RELEASE = 0700 
 CEDA  ALter Bundle( WLPHELLO )                                               
  Bundle         : WLPHELLO                                                   
  Group          : TAGGRP                                                     
  DEScription  ==> CICS Bundle for Liberty Hello servlet                      
  Status       ==> Enabled            Enabled | Disabled                      
  BUndledir    ==> /var/cicsts/cicsts53/CT53H4A1/bundles/com.ibm.cics.server. 
  (Mixed Case) ==> examples.wlp.hello.bundle_1.0.1                        
               ==>                                                            
               ==>                                                            
               ==>                                                            
  BAsescope    ==>                                                            
  (Mixed Case) ==>                                                            
               ==>                                                            
               ==>                                                            
               ==>                                                            
 DEFINITION SIGNATURE                                                         
  DEFinetime     : 03/07/17 21:02:49                                          
  CHANGETime     : 03/07/17 21:04:26                                          
                                                                              
                                                    SYSID=H4A1 APPLID=CT53H4A1
```

CICS JOBLOGには以下のようなメッセージが出力されます。

```
+CWWKG0016I: Starting server configuration update.                          
+CWWKG0017I: The server configuration was successfully updated in 636       
 0.031 seconds.                                                             
+CWWKZ0001I: Application com.ibm.cics.server.examples.wlp.hello.war 637     
 started in 0.069 seconds.                                                  
```

## 実行
CICS-Liberty上にデプロイされたアプリケーションに、ブラウザからアクセスしてみましょう。

以下のURLにブラウザからアクセス
http://hostname:53481/com.ibm.cics.server.examples.wlp.hello/

アプリケーションが以下のような画面を返せばOKです。
![image12.JPG](https://qiita-image-store.s3.amazonaws.com/0/132331/f3aa6dc2-2dd2-cad4-da57-c916b9f12d31.jpeg)
CICSリージョン名(applid)が返されているのが確認できます。

# おわりに
ここではCICS-Libertyアプリを動かすための一連の手順をご紹介しました。
アプリの中身には踏み込んでいませんが、CICS-LibertyアプリではJCICSというEXEC CICS API相当のJavaのインターフェースが提供されているので、Javaから直接CICSのリソースをアクセスすることができます。
このCICS-Libertyフィーチャーを利用することで、既存のCICSアプリをWebから活用したり、拡張部分をJavaで開発する、といったことがやりやすくなるかもね。