pianoman
518
2018-12-26 11:56:57 작성 2018-12-26 12:00:59 수정됨
4
962

자바에서 FTP 접속 후 파일리스트 읽어올때


자바로 FTP에 접속해서 파일을 읽고, 내용을 DB에 쓰는 프로그램 개발중입니다.

org.apache.commons.net.ftp.FTPClient

이거 IMPORT해서 사용하는데, 샘플 프로그램을 만들어서 실행하다가

알수없는 증상이 계속 되서 문의드립니다.


프로그램은 

1) FTP접속

2) 로그인

3) 특정폴더에서 파일리스트 읽기(루트폴더입니다.)

4) DB에 쓰기


이렇게 구성되는데요...

3) 과정이 되다가 안되다가 합니다.

루트폴더에 파일이 10개 있는데, 어떤대는 실행하면 정상적으로 프로그램이 실행됩니다.

로그로 파일리스트 읽어들인 갯수를 찍어보면 10개 찍히구요.


그런데 어떤 경우에는 3) 과정을 실행은 하는데, 파일 갯수가 0으로 찍히면서

4)는 생략하고 접속종료합니다.


당연히 루트폴더에 보면 파일은 10개가 그대로 있구요.


정말 프로그램 하나도 안바꾸고 같은 프로그램을 계속 테스트하는데도

이런 증상이 나타나서 좀 당황스럽습니다.


일단 정상적으로 실행되는 경우가 있다보니,

폴더접근권한과 같은 문제는 아닐것 같고요.


현재 같은 계정을 3군데서 사용중이기는 합니다.

3군데 모두 배치로 실행되는데, 각각 담당자들과 협의해서

배치 실행시간의 간격을 2시간 간격으로 놔뒀습니다.

저희쪽이 3군데 중 가장 마지막에 실행하구요.

며칠간 확인해보니... 파일 읽어들인 갯수는 계속 0으로 나오네요...


뭐가 문제일지 제가 수동으로 돌려봐도...

될때도 있고 또 지금은 안되고... 


혹시 원인이 뭔지 아시는분 계실까요??

부탁드립니다 ㅠ.ㅜ;


client = new FTPClient();

... 관련 config

client.connect(host, port);

client.login(name, pass);

FTPFile[] files = client.listFiles();

LOGGER.debug("cnt : " + files.length); // 이 부분이 cnt : 0 나옴

... DB쓰는 부분

client.disconnet();


소스는 대략 이렇게 됩니다.


0
0
  • 답변 4

  • 빵직이
    52
    2018-12-31 10:00:30

    ftp 계정을 3군데서 사용중이면 앞 2군데에서 disconnect()를 제대로 하고 있는지를 확인해봐야 할 것 같습니다.

    그리고 저 소스만 봐서는 전체적인 것을 잘 모르겠지만..

    try~catch~finally로 묶어서 finally에서 disconnect를 해줍니다.

    그리고 일반적으로 이런 배치성 시스템 같은 경우는 로그를 철저히 남겨야 합니다. 분쟁의 소지가 있기 때문입니다.

    DB작업 부분을 스킵하고 접속이 종료된다면 db작업 부분에서 문제가 있을수도 있겠네요..

    현재 count가 0으로 들어오는 시점이 언제인지를 파악하는게 제일 중요한 것 같습니다.


    0
  • pianoman
    518
    2019-01-03 10:39:14

    우선 회신 너무 감사드립니다.

    1. 소스 간결하게 써놓느라 try catch는 제외하고 올렸습니다. 당연히 묶어놓았구요 ^^;

    2. 이 부분에서 분쟁의 소지가 있을듯 하여 서버 담당자에게 이야기 해

    접속 계정을 3개 각각 따로 받았습니다. 그래서 제 계정은 오직 저 혼자 사용합니다.

    결국 그런데도 같은 현상이 발생하네요;;;

    3. 배치 개발은 제가 하지만, 등록 및 로그관리는 현지의 서버 담당자가 하기 때문에

    이 부분을 제가 직접 손보기가 힘든 상태입니다.

    배치가 정상적으로 수행되었는지 여부를 별도로 로그 남기는 방법을 취하고 있는데...

    이것도 결국 카운트가 0이냐 아니냐 정도만 남겨지네요.

    4. 정확히 DB작업부분을 스킵하는 것은 DB작업 이전, "정해진 경로"에서

    파일을 읽어서 필요로 하는 파일이 있을때 수행됩니다.

    그런데 현재 문제는 정해진 경로에서 파일을 읽어들이지 못하는 것이 문제이기 때문에

    DB작업부분과는 무관해보입니다.

    5. count 가 0 인 시점이 파일리스트를 읽어오는 부분이지요.

    그래서 그 count가 1 이상인 경우에 DB작업부분이 실행이 됩니다.

    0
  • 늅늅
    623
    2019-02-07 17:35:55

    FTPFile[] files = client.listFiles();

    client.getReplyString();

    ftp 로직 중간중간에  client.getReplyString();
    리턴값을 찍어보세요.
    분명 특정상황에 에러코드가 있을겁니다.~~~~

    안될때 상황을 기록 해보세요 안될때 안되는 패턴이 나올거에요..
    예를 들자면 파일명이 너무 길거나,파일명에 공백이 있거나,서버보안프로그램이 있거나,
    파일사이즈가 너무크거나, 특정 시간에만 발생한다거나, 리스트를 항목을 가지고 올때 파일이 사용중이거나..등등등....
    0
  • pianoman
    518
    2019-03-08 13:25:08

    앗 확인이 늦었습니다.

    저건 저대로 아직 방치된 상태라서 아직은 답변주신게 아주 유효할것 같습니다.

    지금 다른거 하느라 시간이 없어서... ㅠ.ㅜ;

    답글주신대로 최대한 상세하게 이것저것 체크해보도록 하겠습니다.

    감사합니다 !

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.