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}