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 * ②処理実行 038 * 実行方法に対応する各実装クラスの処理を呼び出し①で取得したデータに対して処理を実行します。 039 * ③終了処理 040 * ①、②が正常終了した場合,読取方法のクラスで定義された終了処理を実行します。 041 * ①、②でエラーが発生した場合、読取方法のクラスで定義されたエラー処理を実行します。 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 } 132 133 // 読取方法のオブジェクトを生成し、伝送プロセスにセットします。 134 read = (TransferRead)StringUtil.newInstance( READ_CLASS_BASE + config.getKbRead() ); 135 136 // 実行方法のオブジェクトを生成し、伝送プロセスにセットします。 137 exec = (TransferExec)StringUtil.newInstance( EXEC_CLASS_BASE + config.getKbExec() ); 138 139 String[] vals = read.read( config, tran ); 140 exec.execute( vals, config, tran ); 141 read.complete( config, tran ); 142 143 // デバッグ情報を出力します。 144 if( isDebug ) { 145 System.out.println(); 146 System.out.print( " END = " + new Date() ); 147 System.out.print( "[" + dmnName + "]:[" + config.toString() + "]" ); 148 } 149 } 150 } 151 catch( Throwable ex ) { 152 if( tran != null ) { 153 tran.rollback(); 154 tran.close(); 155 tran = null; // エラー発生時は、接続を終了します。(次の状況更新でデッドロックになるため) 156 } 157 158 if( read != null ) { 159 read.error( config, appInfo ); 160 } 161 162 throw new RuntimeException( ex ); 163 } 164 finally { 165 if( tran != null ) { tran.close(); } 166 } 167 } 168 169 /** 170 * 実行用のメインメソッド 171 * 172 * Usage: java org.opengion.hayabusa.transfer.TransferProcess 173 * -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター] 174 * -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター] 175 * -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード] 176 * 177 * @param args コマンド引数配列 178 */ 179 public static void main( final String[] args ) { 180 try { 181 if( args.length < 5 ) { 182 LogWriter.log( "Usage: java org.opengion.hayabusa.transfer.TransferProcess" ); 183 LogWriter.log( " -kbRead=読取方法 -readObj=読取対象 [-readPrm=読取パラメーター]" ); 184 LogWriter.log( " -kbExec=実行方法 -execObj=実行対象 [-execPrm=実行パラメーター]" ); 185 LogWriter.log( " -DBConfig=DBConfig.xml [-execDbid=実行接続先DBID] [-hfrom=送り元ホストコード]" ); 186 return; 187 } 188 189 String kbRead = null; 190 String readObj = null; 191 String readPrm = null; 192 String kbExec = null; 193 String execObj = null; 194 String execPrm = null; 195 String dbConfig = null; 196 String execDbid = null; 197 String hfrom = null; 198 199 for( int i=0; i<args.length; i++ ) { 200 String arg = args[i]; 201 if( arg.startsWith( "-kbRead=" ) ) { 202 kbRead = arg.substring( 8 ); 203 } 204 else if( arg.startsWith( "-readObj=" ) ) { 205 readObj = arg.substring( 9 ); 206 } 207 else if( arg.startsWith( "-readPrm=" ) ) { 208 readPrm = arg.substring( 9 ); 209 } 210 else if( arg.startsWith( "-kbExec=" ) ) { 211 kbExec = arg.substring( 8 ); 212 } 213 else if( arg.startsWith( "-execObj=" ) ) { 214 execObj = arg.substring( 9 ); 215 } 216 else if( arg.startsWith( "-execPrm=" ) ) { 217 execPrm = arg.substring( 9 ); 218 } 219 else if( arg.startsWith( "-DBConfig=" ) ) { 220 dbConfig = arg.substring( 10 ); 221 } 222 else if( arg.startsWith( "-execDbid=" ) ) { 223 execDbid = arg.substring( 10 ); 224 } 225 else if( arg.startsWith( "-hfrom=" ) ) { 226 hfrom = arg.substring( 7 ); 227 } 228 } 229 230 if( kbRead == null || kbRead.length() == 0 231 || readObj == null || readObj.length() == 0 232 || kbExec == null || kbExec.length() == 0 233 || execObj == null || execObj.length() == 0 234 || dbConfig== null || dbConfig.length()== 0 ) { 235 LogWriter.log( "以下のパラメーターは必須です。" ); 236 LogWriter.log( "-kbRead=読取方法 -readObj=読取対象" ); 237 LogWriter.log( "-kbExec=実行方法 -execObj=実行対象" ); 238 LogWriter.log( "-DBConfig=DBConfig.xml" ); 239 } 240 241 // DBID接続情報の取得先の設定 242 ConnectionFactory.init( null,dbConfig ); 243 244 // 伝送設定オブジェクト 245 TransferConfig config = new TransferConfig( 246 kbRead, readObj, readPrm 247 , kbExec, execDbid, execObj, execPrm 248 , null, hfrom, null, -1 ); 249 Set<TransferConfig> configSet = new HashSet<TransferConfig>(); 250 configSet.add( config ); 251 252 // 伝送処理を実行します。 253 TransferProcess proc = new TransferProcess( configSet ); 254 255 System.out.println( "EXEC START Config=[" + config.toString() + "]" ); 256 proc.process(); 257 System.out.println( "EXEC END Config=[" + config.toString() + "]" ); 258 } 259 catch( Throwable ex ) { 260 ex.printStackTrace(); 261 // 異常終了の場合 262 System.exit( 1 ); 263 } 264 265 // 正常終了の場合 266 System.exit( 0 ); 267 } 268}