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.fukurou.transfer; 017 018import java.util.Date; 019import java.util.HashSet; 020import java.util.Set; 021 022import org.opengion.fukurou.db.ConnectionFactory; 023import org.opengion.fukurou.db.Transaction; 024import org.opengion.fukurou.db.TransactionReal; 025import org.opengion.fukurou.util.ApplicationInfo; 026import org.opengion.fukurou.util.LogWriter; 027import org.opengion.fukurou.util.StringUtil; 028 029/** 030 * 伝送処理を実行するためのクラスです。 031 * 032 * 伝送デーモンでセットされた読取方法、実行方法の基づき伝送処理を実行します。 033 * 伝送処理は以下のフローで実行されます。 034 * 035 * @データの読み取り 036 * 読取方法に対応する各実装クラスの処理を呼び出しデータを読み取ります。 037 * A処理実行 038 * 実行方法に対応する各実装クラスの処理を呼び出し@で取得したデータに対して処理を実行します。 039 * B終了処理 040 * @、Aが正常終了した場合,読取方法のクラスで定義された終了処理を実行します。 041 * @、Aでエラーが発生した場合、読取方法のクラスで定義されたエラー処理を実行します。 042 * 043 * @og.group 伝送システム 044 * 045 * @version 5.0 046 * @author Hiroki.Nakamura 047 * @since JDK1.6 048 */ 049public class TransferProcess { 050 051 // 実行方法に対応する実装クラスの基準名 052 private static final String READ_CLASS_BASE = "org.opengion.fukurou.transfer.TransferRead_" ; 053 054 // 実行方法に対応する実装クラスの基準名 055 private static final String EXEC_CLASS_BASE = "org.opengion.fukurou.transfer.TransferExec_" ; 056 057 // 実行対象の伝送セットオブジェクトのセット 058 private final Set<TransferConfig> configSet; 059 060 // 最後に実行した伝送設定オブジェクト 061 private TransferConfig config = null; 062 063 // 実行デーモン名 064 private String dmnName = null; 065 066 // DB接続情報記録 067 private ApplicationInfo appInfo; 068 069 // デバッグ情報を出力するかどうか 070 private boolean isDebug = false; 071 072 /** 073 * コンストラクタです。 074 * 075 * @param configSet 伝送設定オブジェクトのセット 076 */ 077 public TransferProcess( final Set<TransferConfig> configSet ) { 078 this.configSet = configSet; 079 } 080 081 /** 082 * デーモン名をセットします。 083 * 084 * @param dmnName デーモン名 085 */ 086 public void setDmnName( final String dmnName ) { 087 this.dmnName = dmnName; 088 } 089 090 /** 091 * DB接続情報をセットします。 092 * 093 * @param appInfo DB接続情報 094 */ 095 public void setAppInfo( final ApplicationInfo appInfo ) { 096 this.appInfo = appInfo; 097 } 098 099 /** 100 * デバッグ情報を出力します。 101 */ 102 public void setDebug() { 103 isDebug = true; 104 } 105 106 /** 107 * 最後に実行した伝送設定オブジェクトを返します。 108 * 109 * @return 伝送設定オブジェクト 110 */ 111 public TransferConfig getLastConfig() { 112 return config; 113 } 114 115 /** 116 * 伝送処理を実行します。 117 */ 118 public void process() { 119 Transaction tran = new TransactionReal( appInfo ); 120 TransferRead read = null; 121 TransferExec exec = null; 122 try { 123 for( TransferConfig c : configSet ) { 124 config = c; 125 126 // デバッグ情報を出力します。 127 if( isDebug ) { 128 System.out.println(); 129 System.out.print( " START = " + new Date() ); 130 System.out.print( "[" + dmnName + "]:[" + config.toString() + "]" ); 131 System.out.println(); 132 } 133 134 // 読取方法のオブジェクトを生成し、伝送プロセスにセットします。 135 read = (TransferRead)StringUtil.newInstance( READ_CLASS_BASE + config.getKbRead() ); 136 137 // 実行方法のオブジェクトを生成し、伝送プロセスにセットします。 138 exec = (TransferExec)StringUtil.newInstance( EXEC_CLASS_BASE + config.getKbExec() ); 139 140 String[] vals = read.read( config, tran ); 141 exec.execute( vals, config, tran ); 142 read.complete( config, tran ); 143 144 // デバッグ情報を出力します。 145 if( isDebug ) { 146 System.out.println(); 147 System.out.print( " END = " + new Date() ); 148 System.out.print( "[" + dmnName + "]:[" + config.toString() + "]" ); 149 System.out.println(); 150 } 151 } 152 } 153 catch( Throwable ex ) { 154 if( tran != null ) { 155 tran.rollback(); 156 tran.close(); 157 tran = null; // エラー発生時は、接続を終了します。(次の状況更新でデッドロックになるため) 158 } 159 160 if( read != null ) { 161 read.error( config, appInfo ); 162 } 163 164 throw new RuntimeException( ex ); 165 } 166 finally { 167 if( tran != null ) { tran.close(); } 168 } 169 } 170 171 /** 172 * 実行用のメインメソッド 173 * 174 * Usage: java org.opengion.hayabusa.transfer.TransferProcess 175 * -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター] 176 * -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター] 177 * -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード] 178 * [-debug=true/false] 179 * 180 * @og.rev 5.8.3.2 (2015/01/30) debug追加 181 * @og.rev 5.8.4.2 (2015/02/28) 修正 182 * 183 * @param args コマンド引数配列 184 */ 185 public static void main( final String[] args ) { 186 boolean debug = false; // 5.8.3.2 (2015/01/30) 187 try { 188 if( args.length < 5 ) { 189 LogWriter.log( "Usage: java org.opengion.hayabusa.transfer.TransferProcess" ); 190 LogWriter.log( " -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター]" ); 191 LogWriter.log( " -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター]" ); 192 LogWriter.log( " -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード]" ); 193 return; 194 } 195 196 String kbRead = null; 197 String readObj = null; 198 String readPrm = null; 199 String kbExec = null; 200 String execObj = null; 201 String execPrm = null; 202 String dbConfig = null; 203 String execDbid = null; 204 String hfrom = null; 205 206 207 for( int i=0; i<args.length; i++ ) { 208 String arg = args[i]; 209 if( arg.startsWith( "-kbRead=" ) ) { 210 kbRead = arg.substring( 8 ); 211 } 212 else if( arg.startsWith( "-readObj=" ) ) { 213 readObj = arg.substring( 9 ); 214 } 215 else if( arg.startsWith( "-readPrm=" ) ) { 216 readPrm = arg.substring( 9 ); 217 } 218 else if( arg.startsWith( "-kbExec=" ) ) { 219 kbExec = arg.substring( 8 ); 220 } 221 else if( arg.startsWith( "-execObj=" ) ) { 222 execObj = arg.substring( 9 ); 223 } 224 else if( arg.startsWith( "-execPrm=" ) ) { 225 execPrm = arg.substring( 9 ); 226 } 227 else if( arg.startsWith( "-DBConfig=" ) ) { 228 dbConfig = arg.substring( 10 ); 229 } 230 else if( arg.startsWith( "-execDbid=" ) ) { 231 execDbid = arg.substring( 10 ); 232 } 233 else if( arg.startsWith( "-hfrom=" ) ) { 234 hfrom = arg.substring( 7 ); 235 } 236 else if( arg.startsWith( "-debug=" ) ) { // 5.8.3.2 (2015/01/30) 237 if( "true".equals(arg.substring( 7 )) ){ debug = true; } // 5.8.4.2 (2015/02/28) 238 } 239 } 240 241 if( kbRead == null || kbRead.length() == 0 242 || readObj == null || readObj.length() == 0 243 || kbExec == null || kbExec.length() == 0 244 || execObj == null || execObj.length() == 0 245 || dbConfig == null || dbConfig.length() == 0 ) { 246 LogWriter.log( "以下のパラメーターは必須です。" ); 247 LogWriter.log( "-kbRead=読取方法 -readObj=読取対象" ); 248 LogWriter.log( "-kbExec=実行方法 -execObj=実行対象" ); 249 LogWriter.log( "-DBConfig=DBConfig.xml" ); 250 } 251 252// HybsSystem.setInitialData( new HashMap<String,String>() ); 253 254 // DBID接続情報の取得先の設定 255 ConnectionFactory.init( null,dbConfig ); 256 257 // 伝送設定オブジェクト 258 TransferConfig config = new TransferConfig( 259 kbRead, readObj, readPrm 260 , kbExec, execDbid, execObj, execPrm 261 , null, hfrom, null, -1 ); 262 Set<TransferConfig> configSet = new HashSet<TransferConfig>(); 263 configSet.add( config ); 264 265 // 伝送処理を実行します。 266 TransferProcess proc = new TransferProcess( configSet ); 267 if( debug ){ // 5.8.3.2 (2015/01/30) 268 proc.setDebug(); 269 } 270 271 272 System.out.println( "EXEC START Config=[" + config.toString() + "]" ); 273 proc.process(); 274 System.out.println( "EXEC END Config=[" + config.toString() + "]" ); 275 } 276 catch( Throwable ex ) { 277 ex.printStackTrace(); 278 // 5.8.3.2 (2015/01/30) 279 if( debug ){ 280 System.out.println( ex.toString() ); 281 } 282 // 異常終了の場合 283 System.exit( 1 ); 284 } 285 286 // 正常終了の場合 287 System.exit( 0 ); 288 } 289}