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