2 * Copyright (c) 2017 The openGion Project.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13 * either express or implied. See the License for the specific language
14 * governing permissions and limitations under the License.
16 package org.opengion.fukurou.fileexec;
18 import java.util.concurrent.ConcurrentMap;
19 import java.util.concurrent.ConcurrentHashMap;
20 import java.util.StringJoiner;
21 import java.util.Arrays;
22 import java.util.List;
23 import java.nio.file.Path;
25 import org.opengion.fukurou.util.StringUtil;
28 * AppliExec は、アプリケーションの実行を行う共通の処理クラスです。
32 * ここでは、GE72の処理IDに応じた方法で実行します。
36 * @og.rev 7.0.0.0 (2017/07/07) 新規作成
39 * @author Kazuhiko Hasegawa
42 public final class AppliExec {
43 private static final XLogger LOGGER= XLogger.getLogger( AppliExec.class.getSimpleName() ); // ログ出力
45 /** GE72 テーブルのカラム定義の enum */
47 // public static enum GE72 {
48 /** GE72 テーブルから検索するカラム名 */
49 // RUNTYPE,RUNPG,CLMS,PARAMS,DBID,TABLE_NAME,SHT_NOS,FILE_ENC,SKIP_CNT ;
50 /** GE72 カラム */ EXECID,
51 /** GE72 カラム */ RUNTYPE,
52 /** GE72 カラム */ RUNPG,
54 /** GE72 カラム */ PARAMS,
56 /** GE72 カラム */ TABLE_NAME,
57 /** GE72 カラム */ SHT_NOS,
58 /** GE72 カラム */ FILE_ENC,
59 /** GE72 カラム */ SKIP_CNT ; // 7.2.1.0 (2020/03/13) EXECID 追加
61 /** order by で、開始日時(ST_TIME)順に処理されるようにしておきます。 */
62 private static final String FROM_WHERE = " from GE72 where SYSTEM_ID=? and EXECID=? and FGJ='1'" ; // 1件のみのはず
64 /** 列挙子のCSV形式文字列 のキャッシュ */
65 public static final String SELECT ;
67 final StringJoiner sj = new StringJoiner( "," , "select " , FROM_WHERE );
68 Arrays.stream( values() ).forEachOrdered( v -> sj.add( v.name() ) );
69 SELECT = sj.toString();
72 /** 列挙子の序数(カラムの並び順) */
75 /** private コンストラクター */
76 GE72() { NO = ordinal(); }
77 // private GE72() { NO = ordinal(); }
80 // GE72()のユニークキーは、systemId + execId だが、GE70()のユニークキーは、systemId + rsrv_no
81 private static final ConcurrentMap<String,AppliExec> APP_EXEC_MAP = new ConcurrentHashMap<>();
83 private final String[] ge72Data ;
85 private final RunExec runexec ; // これもキャッシュできますが、とりあえず動くまでは毎回作成します。
90 * @og.rev 6.8.1.5 (2017/09/08) LOGGER.debug 情報の追加
92 * @param systemId システムID
95 private AppliExec( final String systemId , final String execId ) {
96 LOGGER.debug( () -> "⑥ systemId=" + systemId + " , execId=" + execId );
98 final List<String[]> cmdRow = DBUtil.dbQuery( GE72.SELECT , systemId , execId );
100 if( cmdRow.isEmpty() ) {
101 // MSG3001 = コマンドリストに、予約番号,取込ID,処理IDは必須です。[{0}]
102 throw MsgUtil.throwException( "MSG3001" , "SYSTEM_ID=" + systemId + " , EXECID=" + execId );
105 ge72Data = cmdRow.get(0); // 1件のみのはず
106 final String type = ge72Data[GE72.RUNTYPE.NO];
110 case "0" : key = "NONE"; break; // なにもしない
111 case "1" : key = "DBIN"; break; // DB入力
112 // case "2" : key = "PLSQL"; break; // PL/SQLコール
113 case "3" : key = "BAT"; break; // BATファイルコール
114 // case "4" : key = "JSP"; break; // JSPファイルコール(URLコネクション)
115 default : key = null; break; // なにもしない(runTypeなしエラー)
119 // MSG3002 = RUNTYPEに対応するRunExec実装クラスがありません。[{0}]
120 throw MsgUtil.throwException( "MSG3002" , "RUNTYPE=" + type + " , systemId=" + systemId + " , execId=" + execId );
123 runexec = (RunExec)StringUtil.newInstance( "org.opengion.fukurou.fileexec.RunExec_" + key );
127 * システムIDと処理IDから、対応するAppliExecオブジェクトを返します。
129 * AppliExecオブジェクトを、動的に作成し、システムID + 予約番号 をキーにキャッシュします。
131 * 何らかの Exception が、throw された場合は、null を返します。
133 * @og.rev 7.2.1.0 (2020/03/13) APP_EXEC_MAPのキーを、systemId + rsrv_no に変更します。
135 * @param systemId システムID
136 * @param rsrvNo 予約番号(文字列のまま扱います)
138 * @return AppliDataオブジェクト(作成できなければ、null)
140 // public static AppliExec newInstance( final String systemId , final String execId ) {
141 public static AppliExec newInstance( final String systemId , final String rsrvNo , final String execId ) {
142 // final String mapKey = systemId + "_" + execId ;
143 final String mapKey = systemId + "_" + rsrvNo ;
145 return APP_EXEC_MAP.computeIfAbsent( mapKey , key -> new AppliExec( systemId,execId ) );
149 * システムID + 予約番号 をキーにキャッシュからAppliExecオブジェクトを削除します。
151 * 新しい AppliExecオブジェクトを作成する際に、GE72 を再読み込みします。
152 * 何か定義変更を行った後、読み取りスレッドを停止すると同時に、キャッシュを削除すれば、
153 * 次回起動時には、DBの設定を再読み込みします。
155 * @og.rev 7.2.1.0 (2020/03/13) APP_EXEC_MAPのキーを、systemId + rsrv_no に変更します。
157 * @param systemId システムID
158 * @param rsrvNo 予約番号(文字列のまま扱います)
160 public static void removeInstance( final String systemId , final String rsrvNo ) {
161 final String mapKey = systemId + "_" + rsrvNo ;
163 APP_EXEC_MAP.remove( mapKey );
167 * GE72.RUNTYPE に基づいて、各種処理を実行します。
169 * @og.rev 6.8.1.5 (2017/09/08) LOGGER.debug 情報の追加
171 * @param path 処理するファイルパス
172 * @return 処理件数(正は成功、マイナスは異常時の行番号)
174 public int exec( final Path path ) {
175 return runexec.exec( path,ge72Data ) ;
179 * GE72.RUNTYPE に基づいて、各種処理を実行します。
181 * @og.rev 7.2.1.0 (2020/03/13) 新規追加
183 * @param path 処理するファイルパス
184 * @param fgtkan 取込完了フラグ(0:取込なし , 1:処理中 , 2:済 , 7:デーモンエラー , 8:アプリエラー)
185 * @param errMsg エラーメッセージ
187 public void endExec( final Path path , final String fgtkan , final String errMsg ) {
188 runexec.endExec( path,ge72Data,fgtkan,errMsg ) ;