    001package org.opengion.hayabusa.queue;
    002
    003// import org.apache.commons.lang3.StringUtils;                                 // 7.0.6.0 (2019/10/07)
    004import org.opengion.fukurou.db.ConnectionFactory;
    005import org.opengion.fukurou.db.DBFunctionName;
    006import org.opengion.fukurou.db.DBUtil;
    007import org.opengion.fukurou.db.Transaction;
    008import org.opengion.fukurou.db.TransactionReal;
    009// import org.opengion.fukurou.util.ApplicationInfo;
    010import org.opengion.fukurou.db.ApplicationInfo;                                 // 7.0.6.0 (2019/10/07) util → db に移動のため
    011import org.opengion.hayabusa.common.HybsSystem;
    012import org.opengion.fukurou.system.DateSet;                                             // 7.0.6.0 (2019/10/07) HybsSystem.getDate( String )
    013
    014/**
    015 * キュー処理用のDBアクセスクラス
    016 * キューの受信と送信処理で、
    017 * データベースにアクセスして処理を行います。
    018 *
    019 * 実際のMQ,SQSとの通信そのものはfukurouで行います。
    020 *
    021 * @og.group メッセージ連携
    022 *
    023 * @og.rev 5.10.15.2 (2019/09/20) 新規作成
    024 *
    025 * @version 5
    026 * @author oota
    027 * @since JDK7
    028 *
    029 */
    030public class DBAccessQueue {
    031        private static final String DYSET_YMD  = "yyyyMMddHHmmss";
    032//      private static ApplicationInfo appInfo ;
    033        private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" );
    034        private final String SYSTEM_ID;
    035        private final String USRSET;
    036        private final String PGUPD;
    037        private final String DMN_NAME;
    038        private final ApplicationInfo appInfo ;                 // 7.2.9.4 (2020/11/20) PMD:Possible unsafe assignment to a non-final static field in a constructor.
    039
    040        /** 処理中 {@value} */
    041        public static final String  FGKAN_PROCESS = "2";
    042        /** 完了 {@value} */
    043        public static final String  FGKAN_END = "3";
    044        /** エラー{@value} */
    045        public static final String  FGKAN_ERROR = "4";
    046
    047        /** コネクションにアプリケーション情報を追記するかどうか指定 */
    048        // パラメータ編集必要
    049        private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    050
    051        /**
    052         * コンストラクター
    053         * 初期処理を行います。
    054         *
    055         * @param systemid システムID
    056         * @param usrset ユーザID
    057         * @param prpupd プログラムID
    058         * @param dmnName デーモン名
    059         */
    060        public DBAccessQueue(final String systemid, final String usrset, final String prpupd, final String dmnName) {
    061                SYSTEM_ID = systemid;
    062//              USRSET = StringUtils.defaultString(usrset, "UNNONE") ;                  // 7.0.6.0 (2019/10/07)
    063//              PGUPD  = StringUtils.defaultString( prpupd, "UNNONE" ) ;                // 7.0.6.0 (2019/10/07)
    064//              DMN_NAME = StringUtils.defaultString( dmnName, "UNNONE" ) ;             // 7.0.6.0 (2019/10/07)
    065                USRSET          = usrset  == null ? "UNNONE" : usrset ;                         // "" の時、"" を返す必要がある。StringUtil.nval は、"" と null を同値に扱う
    066                PGUPD           = prpupd  == null ? "UNNONE" : prpupd ;
    067                DMN_NAME        = dmnName == null ? "UNNONE" : dmnName ;
    068
    069                if (USE_DB_APPLICATION_INFO) {
    070                        appInfo = new ApplicationInfo();
    071
    072                        // ユーザーID,IPアドレス,ホスト名
    073                        appInfo.setClientInfo(USRSET, HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME);
    074                        // 画面ID,操作,プログラムID
    075                        appInfo.setModuleInfo("DBAccessQueue", null, DMN_NAME);
    076                }
    077                else {
    078                        appInfo = null;
    079                }
    080        }
    081
    082        /**
    083         * GE65検索
    084         * GE65の処理対象リストを取得します。
    085         *
    086         * @return 処理対象リスト
    087         */
    088        public String[][] selectGE65() {
    089                final String sql = "SELECT A.YKNO, A.QUEUEID, A.MESSAGE, A.SFDUPID, B.QUESYU, B.JMSURL FROM GE66 A"
    090                                + " INNER JOIN GE65 B ON A.SYSTEM_ID = B.SYSTEM_ID AND A.QUEUEID = B.QUEUEID AND B.FGJ = '1'"
    091                                + " WHERE A.SYSTEM_ID = ? AND A.FGKAN = '1' AND A.FGJ = '1'";
    092
    093                // 7.2.9.4 (2020/11/20) PMD:Consider simply returning the value vs storing it in local variable 'vals'
    094                return DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
    095//              final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
    096//              return vals;
    097        }
    098
    099        /**
    100         * エラー状態に更新
    101         * 完了フラグをエラー状態に更新して、
    102         * エラー情報を格納します。
    103         *
    104         * @param ykno 要求番号
    105         * @param errMsg エラーメッセージ
    106         */
    107        public void updateGE66Error(final String ykno, final String errMsg) {
    108                final String updSql = "UPDATE GE66 SET FGKAN = ?, ERRMSG = ?"
    109                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
    110                DBUtil.dbExecute(updSql, new String[] {
    111                                FGKAN_ERROR, errMsg, SYSTEM_ID, ykno
    112                }, appInfo, DBID);
    113        }
    114
    115        /**
    116         * 完了フラグの更新
    117         * 完了フラグを指定された値に更新します。
    118         *
    119         * @param ykno 要求番号
    120         * @param fgkan 完了フラグ
    121         */
    122        public void updateGE66(final String ykno, final String fgkan) {
    123//              final String dyset = HybsSystem.getDate(DYSET_YMD);
    124                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
    125                final String updSql = "UPDATE GE66 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
    126                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
    127                DBUtil.dbExecute(updSql, new String[] {
    128                                fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, ykno}, appInfo, DBID);
    129        }
    130        /**
    131         * 受信管理データ取得
    132         * 受信管理テーブルから、キューIDとbizlogic名を取得します。
    133         *
    134         * @return 受信管理リスト
    135         */
    136        public String[][] setlectGE67() {
    137                // 対象 キュー名(グループ名)とbizlogic名の取得処理
    138                final String sql = "SELECT QUEUEID, BIZLOGICID FROM GE67"
    139                                + " WHERE SYSTEM_ID = ? AND FGJ = '1'";
    140
    141                // 7.2.9.4 (2020/11/20) PMD:Consider simply returning the value vs storing it in local variable 'vals'
    142                return DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
    143//              final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
    144//              return vals;
    145        }
    146
    147        /**
    148         * 処理番号生成
    149         * GE68_SEQUENCEからシーケンス番号を生成します。
    150         *
    151         * @og.rev 7.0.6.4 (2019/11/29) TransactionRealのclose漏れ対応
    152         *
    153         * @return 処理番号
    154         */
    155        public String generateSyoriNo() {
    156                String syoriNo = "";
    157
    158//              final Transaction tran = new TransactionReal( appInfo );
    159
    160                // 処理番号生成
    161                try( Transaction tran = new TransactionReal( appInfo ) ) {                              // 7.0.6.4 (2019/11/29) try-with-resources文
    162//              try {
    163                        final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) );
    164                        syoriNo = Integer.toString(dbName.getSequence("GE68S01", tran, DBID));
    165//              }finally {
    166//                      tran.close();
    167                }
    168
    169                return syoriNo;
    170        }
    171
    172        /**
    173         * GE68(キュー受信結果テーブル)更新
    174         * キュー受信結果テーブルを指定された完了状態に更新します。
    175         *
    176         * @param syno 処理番号
    177         * @param fgkan 完了フラグ
    178         */
    179        public void updateGE68(final String syno,  final String fgkan) {
    180//              final String dyset = HybsSystem.getDate(DYSET_YMD);
    181                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
    182
    183                final String sql = "UPDATE GE68 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
    184                                + "WHERE FGJ = '1'"
    185                                + " AND SYSTEM_ID = ?"
    186                                + " AND SYNO = ?";
    187
    188                final String[] data = new String[] {fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, syno};
    189
    190                // sql実行
    191                DBUtil.dbExecute(sql, data, appInfo, DBID);
    192        }
    193
    194        /**
    195         *  GE68(キュー受信結果テーブル)登録
    196         * キュー受信結果テーブルに受信データを登録します。
    197         *
    198         * @param queueNm キュー名
    199         * @param syno 処理NO
    200         * @param bizlogicId ﾋﾞｽﾞﾛｼﾞｯｸID
    201         * @param messageText メッセージ
    202         */
    203        public void insertGE68(final String queueNm, final String syno, final String bizlogicId
    204                        ,final String messageText) {
    205//              final String dyset = HybsSystem.getDate(DYSET_YMD);
    206                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
    207
    208                final String sql = "INSERT INTO GE68(SYSTEM_ID, QUEUEID, SYNO, BIZLOGICID, MESSAGE, FGKAN, FGJ,"
    209                                + "DYSET, DYUPD, USRSET, USRUPD, PGSET,  PGUPD)"
    210                                + " VALUES(?,?,?,?,?,?,'1'"
    211                                + ",?,?,?,?,?,?)";
    212
    213                final String[] data = new String[] {
    214                                SYSTEM_ID, queueNm, syno, bizlogicId, messageText, DBAccessQueue.FGKAN_PROCESS
    215                                ,dyset, dyset, USRSET,  USRSET, PGUPD, PGUPD
    216                };
    217
    218                // sql実行
    219                DBUtil.dbExecute(sql,  data, appInfo, DBID);
    220        }
    221
    222        /**
    223         * GE68(キュー受信結果テーブル)エラー更新
    224         * キュー受信結果テーブルをエラー状態に更新します。
    225         *
    226         * @param syoriNo 処理NO
    227         * @param errMsg エラーメッセージ
    228         */
    229        public void updateGE68Error(final String syoriNo, final String errMsg) {
    230                // エラーテーブルに登録
    231//              final String dyset = HybsSystem.getDate(DYSET_YMD);
    232                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
    233
    234                final String sql = "UPDATE GE68"
    235                                + " SET ERRMSG = ?, FGKAN = ?"
    236                                + " ,DYUPD = ?, USRUPD = ?, PGUPD = ?"
    237                                + " WHERE SYSTEM_ID = ? AND FGJ = '1' AND SYNO = ? ";
    238
    239                final String[] data = new String[] {
    240                                  errMsg                                                        // エラーメッセージ
    241                                , DBAccessQueue.FGKAN_ERROR
    242                                , dyset
    243                                , USRSET
    244                                , PGUPD
    245                                , SYSTEM_ID
    246                                , syoriNo
    247                };
    248
    249                // sql実行
    250                DBUtil.dbExecute(sql, data, appInfo, DBID);
    251        }
    252}