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