Files
bapweb/src/com/eactive/eai/adapter/ftp/FTP03.java
T
Rinjae d6bf8e1943 init
2025-10-23 13:21:43 +09:00

243 lines
7.8 KiB
Java

package com.eactive.eai.adapter.ftp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Properties;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPFile;
import com.eactive.eai.adapter.socket.config.ConfigurationContext;
import com.eactive.eai.adapter.socket.service.SocketService;
import com.eactive.eai.batch.common.CalendarUtil;
import com.eactive.eai.batch.common.LogUtil;
import com.eactive.eai.batch.common.StringUtil;
import com.eactive.eai.batch.doc.BatchDoc;
import com.eactive.eai.batch.running.BatchRunningJobManager;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.util.DatetimeUtil;
//KIS 제공 자료 정보계 ( FTP )
//IP : 203.234.219.30 PORT : 21
//ID : kjbank PWD: kjbank0409
//파일명 kjfb_YYYYMMDD.tar.gz
//매월 첫주 화요일에 수신
/**
* 데이터 수신에 시간이 오래 걸리는 경우에 KeepAliveTimeout을 설정하여 NOOP 를 Control Connection으로
* 전송하도록 TCP 연결을 유지하도록 수정
*
*/
public class FTP03 extends Transfer implements SocketService{
private static final String PROP_GROUP_NAME_PREFIX = "TelegramInfo";
public void sendFile(BatchDoc batchDoc) throws Exception {
throw new Exception("해당 Component 에 의한 FTP 송신이 구현되지 않았습니다.");
}
public void recvFile(BatchDoc batchDoc) throws Exception {
logger.info("[FTP03] ■ 대외기관→FEP 파일 수신 시작...... ");
firstActivity = System.currentTimeMillis();
setLastActivity();
BatchRunningJobManager.getInstance().addRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID(), this, batchDoc);
//2. System FTP Shell 명령어를 Runtime 으로 실행
try {
// 기관 프라퍼티에서 keepAliveTimeout 읽음
// 설정이 없는 경우 0으로 설정하여 disable
String instPropName = PROP_GROUP_NAME_PREFIX + "{" +
batchDoc.getBatchMsg().getHeader().getProcessCode() +
"_" +
batchDoc.getBatchMsg().getHeader().getInstitutionCode() + "}";
int keepAliveTimeout = 0;
int keepAliveReplyTimeout = 1;
try {
Properties instProperties = PropManager.getInstance().getProperties(instPropName);
keepAliveTimeout = Integer.parseInt(instProperties.getProperty("keep.alive.timeout", "0"));
keepAliveReplyTimeout = Integer.parseInt(instProperties.getProperty("keep.alive.reply.timeout", "1"));
} catch (Exception e) {
logger.info(e.getLocalizedMessage());
}
logger.info("keepAliveTimeout = {} seconds", keepAliveTimeout);
logger.info("keepAliveReplyTimeout = {} seconds", keepAliveReplyTimeout);
String ipaddress = batchDoc.getBatchMsg().getHeader().getRemoteIP();
String port = batchDoc.getBatchMsg().getHeader().getPort();
String userid = batchDoc.getBatchMsg().getHeader().getUserID();
String passwd = batchDoc.getBatchMsg().getHeader().getUserPassword();
if (ftpClient == null || !ftpClient.isConnected()) this.connect(ipaddress, Integer.parseInt(port) );
ftpClient.login(userid, passwd);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
setLastActivity();
logger.debug( "[FTPC3]FileName:" + batchDoc.getBatchMsg().getHeader().getFileName());
String reqFileName = batchDoc.getBatchMsg().getHeader().getFileName();
String baseDate = DatetimeUtil.getCurrentDate();
if ( reqFileName != null && reqFileName.length() > 8 ){
if ( DatetimeUtil.isRightDate(reqFileName.substring(reqFileName.length() - 8 )) ){
baseDate = reqFileName.substring(reqFileName.length() - 8 );
batchDoc.getBatchMsg().getHeader().setBaseDate(baseDate);
}
}
reqFileName = batchDoc.getBatchMsg().getHeader().getBizCode() + "_" + baseDate + ".tar.gz";
ftpClient.setDataTimeout(600*1000);
ftpClient.setConnectTimeout(300);
// Keep Alive 설정
ftpClient.setControlKeepAliveTimeout(keepAliveTimeout);
ftpClient.setControlKeepAliveReplyTimeout(keepAliveReplyTimeout * 1000);
String remoteDir = "pub/" + baseDate;
logger.debug( "[FTPC3]remoteDir:" + remoteDir);
logger.debug( "[FTPC3]reqFileName:" + reqFileName);
if ( !ftpClient.changeWorkingDirectory(remoteDir)){
logger.info("[FTP03] ■ VAN사 → FEP 수신 파일 없음.["+remoteDir+"]");
return;
}
FTPFile[] files = ftpClient.listFiles();
setLastActivity();
for (int inx = 0; inx < files.length; inx++) {
if ( !files[inx].isFile() || !files[inx].getName().equals(reqFileName) ) continue;
FileOutputStream fos = null;
batchDoc.getBatchMsg().getHeader().setFileName(reqFileName);
batchDoc.getBatchMsg().getHeader().setFileSize(files[inx].getSize());
batchDoc.getBatchMsg().getHeader().setTotRecCnt(1);
String recvFile = batchDoc.getBatchMsg().getHeader().getFilePath() + File.separator + reqFileName;
File rcvRealFile = new File( recvFile );
File rcvChkFile = new File( StringUtil.realToRootDir(recvFile) );
batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash());
LogUtil.setLogFileStart(batchDoc);
try {
fos = new FileOutputStream( rcvRealFile );
ftpClient.retrieveFile(reqFileName, fos);
setLastActivity();
} catch (Exception e) {
setLastActivity();
logger.error(e.getMessage(), e);
throw new Exception("파일수신에 실패하였습니다. -" + e.getMessage());
} finally {
fos.close();
}
try {
File rcvArchFile = new File( StringUtil.realToArchDir(recvFile) );
if (rcvRealFile.exists() && rcvRealFile.length() == batchDoc.getBatchMsg().getHeader().getFileSize() ) {
rcvRealFile.renameTo(rcvArchFile);
rcvChkFile.createNewFile();
}else{
throw new Exception("파일수신에 실패하였습니다.");
}
} catch (Exception e) {
throw e;
}
//File 종료시간 설정
batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());
LogUtil.setLogFileEnd(batchDoc);
break;
}
} catch(Exception ex) {
String[] msgArgs = new String[1];
msgArgs[0] = batchDoc.getBatchMsg().getHeader().getProcessCode();
String errCode = "BECEAIFJI002";
String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs);
batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());
LogUtil.setErrorLog(batchDoc, ex.getMessage());
logger.error( errMsg, ex );
throw ex;
} finally {
this.disconnect();
}
logger.info("[FTPCC] ■ VAN사 → FEP 파일 수신 완료.");
}
@Override
public void shutdown() {
disconnect();
}
@Override
public Socket getCurrentSocket() {
return null;
}
@Override
public boolean connect() {
return false;
}
@Override
public ConfigurationContext getContext() {
return null;
}
@Override
public void setControl(Object control) {
}
@Override
public void notifyMessage() {
}
@Override
public boolean idle(long timeout) {
return false;
}
@Override
public int getCurrentState() {
return 0;
}
@Override
public boolean isConnected() throws IOException {
return false;
}
@Override
public boolean isActive() {
return false;
}
@Override
public void checkActivity() {
}
@Override
public String getRemoteIPAddress() {
return null;
}
@Override
public void setLastActivity() {
lastActivity = System.currentTimeMillis();
}
@Override
public long getFirstActivity() {
return firstActivity;
}
@Override
public long getLastActivity() {
return lastActivity;
}
}