001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.plugin.daemon; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.hayabusa.report.GE50Access; 021import org.opengion.hayabusa.report.ReportProcessing; 022import org.opengion.fukurou.util.LogWriter; 023import org.opengion.fukurou.util.StringUtil; 024import org.opengion.fukurou.util.HybsTimerTask; 025import org.opengion.fukurou.util.ApplicationInfo; 026import org.opengion.fukurou.db.DBUtil; 027 028import java.util.Map; 029import java.util.HashMap; 030import java.util.Date; 031 032/** 033 * 【レポート出力】帳票要求テーブルを監視して、帳票処理プログラムを呼び出します。 034 * このクラスは、HybsTimerTask を継承した タイマータスククラスです。 035 * startDaemon() がタイマータスクによって、呼び出されます。 036 * 037 * @og.rev 4.3.4.4 (2009/01/01) プラグイン化 038 * @og.group デーモン 039 * 040 * @version 4.0 041 * @author Kazuhiko Hasegawa 042 * @since JDK5.0, 043 */ 044public class Daemon_Report extends HybsTimerTask { 045 //* このプログラムのVERSION文字列を設定します。 {@value} */ 046 private static final String VERSION = "5.7.3.2 (2014/02/28)" ; 047 048 // 3.7.0.0 (2005/01/18) 複数同時デーモン時の、同一帳票IDは処理できない。 049 // 実行中の帳票ID をセットする、static Map 050 private static final Map<String,String> USE_LISTID = new HashMap<String,String>(); 051 052 // 3.8.5.0 (2006/03/06) EXCELをオープンするファイル名に要求番号を使う場合は、true 053 private static final boolean EXCEL_NAME_USE_YKNO = HybsSystem.sysBool( "REPORT_EXCEL_NAME_USE_YKNO" ); 054 055 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 056 private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE"; 057 private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR"; 058 059 // 3.7.0.0 (2005/01/18) GE53 に DMN_GRP追加による、検索条件の変更 060 // 5.1.0.0 (2009/11/04) OUTDIR ⇒ OUT_DIR , OUTFILE ⇒ OUT_FILE 061 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 062// private static final String GE50_SELECT = 063//// "SELECT A.SYSTEM_ID,A.YKNO,A.GROUPID,A.LISTID,A.JOKEN,A.OUT_DIR,A.OUT_FILE,A.USRSET" + 064// "SELECT A.SYSTEM_ID,A.YKNO,A.GROUPID,A.LISTID,A.JOKEN,A."+OUT_DIR+",A."+OUT_FILE+",A.USRSET" + 065// " FROM GE50 A,GE53 B" + 066// " WHERE A.SYSTEM_ID = B.SYSTEM_ID" + 067// " AND A.JOKEN = B.JOKEN" + 068// " AND A.FGJ = '1'" + 069// " AND B.FGJ = '1'" + 070// " AND A.FGKAN = '1'" ; 071 072 // 5.9.0.1 (2015/09/11) 073 private static final String GE50_SELECT = 074 "SELECT A.SYSTEM_ID,A.YKNO,A.GROUPID,A.LISTID,A.JOKEN,A."+OUT_DIR+",A."+OUT_FILE+",A.USRSET" + 075 " FROM GE50 A,GE53 B,GE54 C" + 076 " WHERE A.SYSTEM_ID = B.SYSTEM_ID" + 077 " AND A.JOKEN = B.JOKEN" + 078 " AND A.FGJ = '1'" + 079 " AND B.FGJ = '1'" + 080 " AND A.FGKAN = '1'" + 081 " AND A.SYSTEM_ID = C.SYSTEM_ID" + 082 " AND A.LISTID = C.LISTID"+ 083 " AND C.FGJ = '1'"; 084 085 private ReportProcessing rc = null; 086 087 // 3.5.4.9 (2004/02/25) メッセージ出力時のループカウント を追加 088 private int loopCnt = 0; 089 private static final int LOOP_COUNTER = 24; // カウンタを24回に設定 090 091 // 3.7.0.0 (2005/01/18) GE53 に DMN_GRP追加による、検索条件の変更 092 private String GE_SELECT = null; 093 094 // 3.8.5.0 (2006/03/06) プリンタIDが、引数から渡される場合の対応 095 private String PRTID = null; 096 // 3.8.5.0 (2006/03/06) デーモン名を設定します。 097 private String DMN_NAME = null; 098 // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加します。 099 private boolean debug = false; // 小文字に修正 100 101 // 3.8.5.3 (2006/06/30) タイマータスクがキャンセルされた場合の停止フラグ 102 private boolean running = true; 103 104 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 105 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 106 107 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 108 private ApplicationInfo appInfo; 109 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 110 111 /** 112 * このタイマータスクによって初期化されるアクションです。 113 * パラメータを使用した初期化を行います。 114 * 115 * @og.rev 3.6.0.7 (2004/11/12) 新規追加 116 * @og.rev 3.7.0.0 (2005/01/18) 帳票定義マスタ(GE54)を参照するように仕様変更 117 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 118 * @og.rev 4.0.1.0 (2007/12/19) GE50の検索順をシステムリソースで設定可能にする 119 * @og.rev 5.7.3.2 (2014/02/28) GE53の検索条件修正 120 */ 121 @Override 122 public void initDaemon() { 123 124 // 3.7.0.0 (2005/01/18) GE50, GE54 の USRUPD に、デーモン名をセットします。 125 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 126 127 // 3.8.5.0 (2006/03/06) デーモン名を設定します。 128 DMN_NAME = getName(); 129 130 StringBuilder buf = new StringBuilder(); 131 buf.append( GE50_SELECT ); 132 133 // SYSTEM_ID は、指定がなければ、全件検索対象になります。 134 String systemId = getValue( "SYSTEM_ID" ); 135 if( ! StringUtil.isNull( systemId ) ) { 136// if( systemId != null && systemId.trim().length() > 0 ) { 137 buf.append( " AND A.SYSTEM_ID='" ).append( systemId ).append( "'" ); 138 } 139 140 // 3.8.5.0 (2006/03/06) DMN_GRP は、必須指定 141 // 5.1.9.0 (2010/08/01) Avoid if (x != y) ..; else ..; 142 String dmnGroup = getValue( "DMN_GRP" ); 143 if( StringUtil.isNull( dmnGroup ) ) { 144 String errMsg = "デーモングループは必須指定です。" ; 145 throw new HybsSystemException( errMsg ); 146 } 147 else { 148 buf.append( " AND B.DMN_GRP='" ).append( dmnGroup ).append( "'" ); 149 } 150 151 // 3.8.5.0 (2006/03/06) GE50 の検索条件に、MODBASE と MODNO を使用する。 152 // デーモン起動時に 最大数(MODBASE)と余り番号(MODNO)を渡します。 153 // 最大数(MODBASE)を元に、検索時に、YKNOの余りを求め、これが、 154 // 引数の余り番号(MODNO)と一致する場合のみ、処理をします。 155 String modBase = StringUtil.nval( getValue( "MODBASE" ),null ); 156 String modNo = StringUtil.nval( getValue( "MODNO" ),null ); 157 if( modBase != null && modNo != null ) { 158 buf.append( " AND MOD(A.YKNO," ).append( modBase ).append( ")=" ).append( modNo ); 159 } 160 161 // 3.8.5.0 (2006/03/06) PRTID が指定されていれば、その値を使用する。なければ NULL 162 PRTID = StringUtil.nval( getValue( "PRTID" ), null ); 163 164 // 3.8.5.0 (2006/03/06) PRT_GRP が指定されていれば、振分条件検索時に使用する。 165 String prtGgrp = getValue( "PRT_GRP" ); 166 if( ! StringUtil.isNull( prtGgrp ) ) { 167// if( prtGgrp != null && prtGgrp.trim().length() > 0 ) { 168// buf.append( " AND B.PRT_GRP='" ).append( prtGgrp ).append( "'" ); 169 buf.append( " AND B.PRTID='" ).append( prtGgrp ).append( "'" ); // 5.7.3.2 (2014/02/28) GE53ではPRTIDにPRI_GRPが指定されている 170 } 171 172// buf.append( " ORDER BY A.SYSTEM_ID,A.LISTID,A.GROUPID,A.YKNO 173 buf.append( " ORDER BY " ); // 4.0.1.0 (2007/12/19) 174 buf.append( HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" ) ); 175 176 GE_SELECT = buf.toString() ; 177 178 // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加します。 179 debug = StringUtil.nval( getValue( "DEBUG" ),debug ) ; 180 181 if( debug ) { 182 System.out.println( "DMN_NAME=[" + DMN_NAME + "]" ); 183 System.out.println( "MODNO=[" + modNo + "]" ); 184 System.out.println( "QUERY=[" + GE_SELECT + "]" ); 185 System.out.println( "EXCEL_NAME_USE_YKNO=[" + EXCEL_NAME_USE_YKNO + "]" ); 186 } 187 188 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 189 if( USE_DB_APPLICATION_INFO ) { 190 appInfo = new ApplicationInfo(); 191 // ユーザーID,IPアドレス,ホスト名 192 appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 193 // 画面ID,操作,プログラムID 194 appInfo.setModuleInfo( "ReportDaemon",PRTID,DMN_NAME ); 195 } 196 else { 197 appInfo = null; 198 } 199 } 200 201 /** 202 * タイマータスクのデーモン処理の開始ポイントです。 203 * 204 * @og.rev 3.5.2.0 (2003/10/20) vals 変数を、ローカルに移動 205 * @og.rev 3.5.4.8 (2004/02/23) タイムスタンプを、10回に1回とする。 206 * @og.rev 3.6.0.0 (2004/09/17) タイムスタンプを、24回に1回とする。 207 * @og.rev 3.6.1.0 (2005/01/05) tyr 〜 catch を Exception から Throwable に変更。 208 * @og.rev 3.7.0.0 (2005/01/18) 複数同時デーモンでも、同一帳票IDは処理できない為、スキップします。 209 * @og.rev 3.7.0.4 (2005/03/18) エラー発生時に vals が null なら、HybsSystemException を throw する。 210 * @og.rev 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 211 * @og.rev 3.8.0.0 (2005/06/07) EXCEL 取込時の完成フラグは、FG_DBIN とします。 212 * @og.rev 3.8.0.0 (2005/06/07) rc.execute() 実行結果を boolean ではなく、文字列(FGKAN_XX)で返します。 213 * @og.rev 3.8.5.0 (2006/03/06) EXCELファイル名に要求番号を使う場合は、帳票IDでの排他制御は不要。 214 * @og.rev 3.8.5.2 (2006/05/31) DEBUG 情報の強化 215 * @og.rev 3.8.6.0 (2006/06/30) タイマータスクがキャンセルされた場合の処理を追加(running フラグ) 216 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 217 * @og.rev 5.3.0.0 (2010/12/01) エラーハンドリングを修正 218 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 219 * @og.rev 5.7.0.4 (2013/11/29) listIdをGE50Accessに渡すようにする 220 */ 221 @Override 222 protected void startDaemon() { 223 if( loopCnt % LOOP_COUNTER == 0 ) { 224 loopCnt = 1; 225 System.out.println(); 226 System.out.print( toString() + " " + new Date() + " " ); 227 } 228 else { 229 System.out.print( "." ); 230 loopCnt++ ; 231 } 232 233 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 234 GE50Access ge50 = null ; 235 236 int row = 0; 237 String[][] vals = null; 238 try { 239// vals = DBUtil.dbExecute( GE_SELECT,null,appInfo ); // 3.8.7.0 (2006/12/15) 240 vals = DBUtil.dbExecute( GE_SELECT,null,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 241 if( vals != null && vals.length > 0 ) { 242 243 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 244 // 毎回 オブジェクトを構築します。登録日付が初期化されます。 245 ge50 = new GE50Access( null,null,DMN_NAME ) ; // 3.8.5.0 (2006/03/06) 246 247 if( rc == null ) { rc = new ReportProcessing(); } 248 // 3.8.6.0 (2006/06/30) タイマータスクがキャンセルされた場合の処理を追加(running フラグ) 249 for( row=0; running && row<vals.length; row++ ) { 250 // 3.7.0.0 (2005/01/18) 使用中の帳票IDのチェックと、使用時の登録 251 String systemId = vals[row][0] ; 252 String ykno = vals[row][1] ; 253 String listId = vals[row][3] ; 254 // 3.8.5.0 (2006/03/06) EXCELファイル名に要求番号を使う場合は、帳票IDでの排他制御は不要。 255 if( ! EXCEL_NAME_USE_YKNO ) { 256 synchronized( USE_LISTID ) { 257 if( USE_LISTID.get( listId ) != null ) { 258 continue; // 使用中なら、飛ばす。 259 } 260 else { 261 USE_LISTID.put( listId,"DUMMY" ); 262 } 263 } 264 } 265 266 // デバッグ情報を出力します。 267 if( debug ) { 268 System.out.println(); 269 System.out.print( "[" + DMN_NAME + "]:[" + ykno + "] START = " ); 270 System.out.println( new Date() ); 271 } 272 273 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 274 ge50.setSystemId( systemId ); 275 ge50.setYkno( ykno ); 276 ge50.updateGE50( GE50Access.FG_RUN ); 277 278 ge50.setListId( listId ); // 5.7.0.4 (2013/11/29) 279 280 // system_id,ykno,groupid,listid,joken,outdir,outfile,usrset 281 rc.setSystemId( systemId ); 282 rc.setYkno( ykno ); 283 rc.setGroupId( vals[row][2] ); 284 rc.setListId( listId ); 285 rc.setJoken( vals[row][4] ); 286// rc.setPrtid( PRTID ); // 3.8.5.0 (2006/03/06) PRTIDを使用する。 287 rc.setPrtId( PRTID ); // 4.3.4.4 (2009/01/01) メソッド名変更 288 rc.setOutDir( vals[row][5] ); 289 rc.setOutFile( vals[row][6] ); 290 rc.setDebug( debug ); // 3.8.5.0 (2006/03/06) DEBUGを追加。 291 292 // 3.8.0.0 (2005/06/07) 実行結果を boolean ではなく、文字列(FGKAN_XX)で返します。 293 String fgkan = rc.execute(); 294 if( fgkan == null ) { 295 fgkan = GE50Access.FG_ERR2 ; 296 String errMsg = rc.getErrMsg(); 297 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 298 ge50.insertErrorGE56( errMsg ); 299 } 300 301 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 302 ge50.updateGE50( fgkan ); 303 304 rc.clear(); 305 // 3.8.5.0 (2006/03/06) EXCELファイル名に要求番号を使う場合は、帳票IDでの排他制御は不要。 306 if( ! EXCEL_NAME_USE_YKNO ) { 307 // 3.7.0.0 (2005/01/18) 使用中の帳票IDの削除 308 synchronized( USE_LISTID ) { 309 USE_LISTID.remove( listId ); 310 } 311 } 312 313 // デバッグ情報を出力します。 314 if( debug ) { 315 System.out.println(); 316 System.out.print( "[" + DMN_NAME + "]:[" + ykno + "] END = " ); 317 System.out.println( new Date() ); 318 } 319 } 320 } 321 } 322// catch( Throwable ex ) { // 3.6.1.0 (2005/01/05) 323// String errMsg = StringUtil.stringStackTrace( ex ) ; 324// LogWriter.log( errMsg ); 325// 326// // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 327// if( ge50 != null ) { 328// ge50.insertErrorGE56( errMsg ); 329// ge50.updateGE50( GE50Access.FG_ERR1 ); 330// } 331// 332// // 3.7.0.4 (2005/03/18) vals が null なら、DB接続エラーが濃厚 333// if( vals == null ) { throw new HybsSystemException( ex ); } 334// 335// if( ! EXCEL_NAME_USE_YKNO ) { 336// // 3.7.0.0 (2005/01/18) エラー発生時の、使用中の帳票IDの削除 337// synchronized( USE_LISTID ) { 338// USE_LISTID.remove( vals[row][3] ); // listId 339// } 340// } 341// 342// rc = null; 343// } 344 // 5.3.0.0 (2010/12/01) エラーハンドリングを修正 345 catch( Throwable ex ) { // 3.6.1.0 (2005/01/05) 346 rc = null; 347 348 String errMsg = StringUtil.stringStackTrace( ex ) ; 349 System.out.println( errMsg ); 350 LogWriter.log( errMsg ); 351 352 if( ! EXCEL_NAME_USE_YKNO ) { 353 // 3.7.0.0 (2005/01/18) エラー発生時の、使用中の帳票IDの削除 354 synchronized( USE_LISTID ) { 355 USE_LISTID.remove( vals[row][3] ); // listId 356 } 357 } 358 359 // 3.7.1.1 (2005/05/31) GE50Access を使用して、DB登録を行います。 360 if( ge50 != null ) { 361 ge50.insertErrorGE56( errMsg ); 362 ge50.updateGE50( GE50Access.FG_ERR1 ); 363 } 364 365 // 3.7.0.4 (2005/03/18) vals が null なら、DB接続エラーが濃厚 366 if( vals == null ) { 367 errMsg += "(vals == null)" ; 368 System.out.println( errMsg ); 369 LogWriter.log( errMsg ); 370 throw new HybsSystemException( ex ); 371 } 372 } 373 } 374 375 /** 376 * このタイマータスクのcancel() メソッドをオーバーライドします。 377 * HybsTimerTaskManager#cancelTask( int ) を実行します。 378 * 379 * @og.rev 3.8.5.3 (2006/06/30) 新規追加 380 * 381 * @return スケジュールされている 1 回以上実行されない場合に true 382 * @see java.util.TimerTask#cancel() 383 */ 384 @Override 385 public boolean cancel() { 386 running = false; 387 return super.cancel(); 388 } 389}