270 lines
9.3 KiB
Java
270 lines
9.3 KiB
Java
package com.eactive.eai.adapter.ftp;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.net.Socket;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
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.ftp.FTPUtil;
|
|
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;
|
|
import com.eactive.eai.common.util.Logger;
|
|
|
|
/**
|
|
* 금용결제원 SFTP
|
|
* 빅데이터 기반의 금융의심거래정보 분석 공유 서비스[FAS]
|
|
*
|
|
* 이름은 KS(Kftc Sftp)가 사용 중이라 FAS에 따옴
|
|
*
|
|
* 거래일자 확인: 전일자 YYYYMMDD 파일
|
|
* 파일명 : FS0001
|
|
*
|
|
* 오류
|
|
* 1. 거래일자 파일이 없는 경우에 오류 발생
|
|
*/
|
|
public class FTPFA extends Transfer implements SocketService{
|
|
|
|
private static final String PROP_GROUP_NAME_PREFIX = "TelegramInfo";
|
|
/** 원격지 경로 */
|
|
private static final String REMOTE_PATH = "remote.path";
|
|
/** 파일 수신시 접미어 */
|
|
private static final String POSTFIX = "post.fix";
|
|
/** sftp 사용 여부 */
|
|
private static final String SFTP_YN = "sftp";
|
|
|
|
public void sendFile(BatchDoc batchDoc) throws Exception {
|
|
throw new Exception("해당 Component 에 의한 FTP 송신이 구현되지 않았습니다.");
|
|
}
|
|
|
|
public void recvFile(BatchDoc batchDoc) throws Exception {
|
|
logger.info("[FTPFA] ■ 대외기관→FEP 파일 수신 시작...... ");
|
|
firstActivity = System.currentTimeMillis();
|
|
setLastActivity();
|
|
BatchRunningJobManager.getInstance().addRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID(), this, batchDoc);
|
|
try {
|
|
String ipaddress = batchDoc.getBatchMsg().getHeader().getRemoteIP();
|
|
int port = Integer.parseInt(batchDoc.getBatchMsg().getHeader().getPort());
|
|
String userid = batchDoc.getBatchMsg().getHeader().getUserID();
|
|
String passwd = batchDoc.getBatchMsg().getHeader().getUserPassword();
|
|
|
|
String propName = PROP_GROUP_NAME_PREFIX + "{" +
|
|
batchDoc.getBatchMsg().getHeader().getProcessCode() +
|
|
"_" +
|
|
batchDoc.getBatchMsg().getHeader().getInstitutionCode() + "}";
|
|
String jobName = PROP_GROUP_NAME_PREFIX + "{" +
|
|
batchDoc.getBatchMsg().getHeader().getProcessCode() +
|
|
"_" +
|
|
batchDoc.getBatchMsg().getHeader().getBizCode() + "}";
|
|
PropManager pmanager = PropManager.getInstance();
|
|
|
|
String remotePath = pmanager.getProperties(propName).getProperty(REMOTE_PATH);
|
|
String sftpYn = pmanager.getProperties(propName).getProperty(SFTP_YN);
|
|
boolean isSftp = "Y".equalsIgnoreCase(sftpYn);
|
|
String postfix = null;
|
|
try{
|
|
postfix = pmanager.getProperties(jobName).getProperty(POSTFIX);
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug( "[FTPFA]postfix:" + postfix);
|
|
}
|
|
}catch( Exception e ){}
|
|
|
|
if ( remotePath == null ){
|
|
throw new Exception("해당 기관에 전송 경로가 지정되어 있지 않습니다. -propName:" + propName + "," + REMOTE_PATH);
|
|
}
|
|
if ( !remotePath.endsWith("/") )
|
|
remotePath = remotePath + "/";
|
|
|
|
String authType = pmanager.getProperties(propName).getProperty(AUTH_TYPE);
|
|
if (StringUtils.isBlank(authType)) {
|
|
authType = AUTH_TYPE_ID; // id
|
|
}
|
|
|
|
//20220712
|
|
String connTimeoutStr = pmanager.getProperties(propName).getProperty(CONNECTION_TIMEOUT, "10");
|
|
int connTimeout = Integer.parseInt(connTimeoutStr);
|
|
String setTimeoutStr = pmanager.getProperties(propName).getProperty(READ_TIMEOUT, "10");
|
|
int setTimeout = Integer.parseInt(setTimeoutStr);
|
|
String bandWidthLimit = pmanager.getProperties(propName).getProperty(BADNWIDTH, "0");
|
|
bandWidthLimit = bandWidthLimit.replace("K", "000").replace("M", "000000").replaceAll(",", "");
|
|
int bandWidth = Integer.parseInt(bandWidthLimit);
|
|
|
|
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug( "[FTPFA]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 );
|
|
}
|
|
}
|
|
|
|
// 전일자
|
|
baseDate = DatetimeUtil.getDayAddedDate(baseDate, -1);
|
|
batchDoc.getBatchMsg().getHeader().setBaseDate(baseDate);
|
|
|
|
reqFileName = batchDoc.getBatchMsg().getHeader().getBizCode();
|
|
|
|
if ( postfix != null && !postfix.equals("")) {
|
|
reqFileName = reqFileName + postfix;
|
|
}
|
|
logger.debug( "[FTPFA]reqFileName:" + reqFileName );
|
|
|
|
try {
|
|
FTPFile[] list = FTPUtil.listFiles(ipaddress, port, userid, passwd, remotePath, null, isSftp, batchDoc.getLogger(Logger.LOGGER_ADAPTER), authType);
|
|
|
|
// 전일자 파일 확인
|
|
boolean dateFileExist = false;
|
|
FTPFile remoteFile = null;
|
|
for (FTPFile file : list){
|
|
if (file.getName().equals(baseDate)) {
|
|
dateFileExist = true;
|
|
}
|
|
if (file.getName().equals(reqFileName)) {
|
|
remoteFile = file;
|
|
}
|
|
}
|
|
|
|
if (dateFileExist == false) {
|
|
throw new Exception("거래일자 파일(" + baseDate + ")이 없습니다.");
|
|
}
|
|
|
|
if (remoteFile != null) {
|
|
batchDoc.getBatchMsg().getHeader().setFileSize(remoteFile.getSize());
|
|
batchDoc.getBatchMsg().getBody().setRecCnt(1);
|
|
batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash());
|
|
batchDoc.getBatchMsg().getHeader().setFileName(remoteFile.getName());
|
|
LogUtil.setLogFileStart(batchDoc);
|
|
//FTPUtil.retrieve(ipaddress, port, userid, passwd, remotePath + "/" + remoteFile.getName(), batchDoc.getBatchMsg().getHeader().getFilePath(), isSftp, batchDoc.getLogger(ElinkLogger.LOGGER_ADAPTER));
|
|
FTPUtil.retrieve(batchDoc, ipaddress, port, userid, passwd, remotePath, remoteFile.getName(), batchDoc.getBatchMsg().getHeader().getFilePath(),
|
|
connTimeout, setTimeout, isSftp, bandWidth, batchDoc.getLogger(Logger.LOGGER_ADAPTER), authType);
|
|
|
|
//batchDoc.getBatchMsg().getHeader().setFileSize(fileSize);
|
|
batchDoc.getBatchMsg().getHeader().setTotRecCnt(1);
|
|
String recvFile = batchDoc.getBatchMsg().getHeader().getFilePath() + File.separator + remoteFile.getName();
|
|
File rcvRealFile = new File( recvFile );
|
|
File rcvChkFile = new File( StringUtil.realToRootDir(recvFile) );
|
|
|
|
try {
|
|
File rcvArchFile = new File( StringUtil.realToArchDir(recvFile) );
|
|
if (rcvRealFile.exists() && rcvRealFile.length() == batchDoc.getBatchMsg().getHeader().getFileSize() ) {
|
|
//setFileHeaderAndTrailer(batchDoc, rcvRealFile);
|
|
rcvRealFile.renameTo(rcvArchFile);
|
|
rcvChkFile.createNewFile();
|
|
}else{
|
|
throw new Exception("파일수신에 실패하였습니다.");
|
|
}
|
|
//File 종료시간 설정
|
|
batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());
|
|
LogUtil.setLogFileEnd(batchDoc);
|
|
} catch (Exception e) {
|
|
throw e;
|
|
}
|
|
}
|
|
}catch ( Exception e ){
|
|
if ( !e.getMessage().contains("No such file"))
|
|
throw e;
|
|
}
|
|
|
|
|
|
} 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);
|
|
LogUtil.setErrorLog(batchDoc, ex.getMessage());
|
|
logger.error( errMsg, ex );
|
|
throw ex;
|
|
} finally {
|
|
this.disconnect();
|
|
}
|
|
logger.info("[FTPFA] ■ VAN사 → FEP 파일 수신 완료.");
|
|
}
|
|
|
|
@Override
|
|
public void shutdown() {
|
|
|
|
}
|
|
|
|
@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;
|
|
}
|
|
} |