728x90
반응형
SMALL
상황
정해진 디렉토리에 존재하는
파일들을 http로 전송하는 과정
1.디렉토리에 담긴 파일 경로를 배열에 담았다.
2.배열에 접근해서 파일을 바이너리로 만들어서 http 로 전송한다.
3.반환코드 200을 받으면 배열에서 삭제한다.
4.실제 파일을 디렉토리에서 삭제한다.
문제점
http 로 한번 파일을 전송하고 나서 익셉션이 터진다.
"java.util.ConcurrentModificationException"
문제가 되는 코드
//파일 경로가 담긴 배열을 forEach로 읽어들인다.
for(String target : filePaths) {
//http post 파일 전송
post(target);
}
원인
forEach 문이 돌아가는 과정에서
post(target) 메서드 내부에서 filePaths 인덱스에 접근해서 삭제하는 과정이 존재하는데 그부분때문에 인덱스가 삭제되는 동시에 forEach문 관점에서는 인덱스값이 갑자기 사라졌기때문에 발생하는 문제로 추측된다.
post 메서드 일부 코드 발췌..
public static void post(String filePath) throws Exception {
.
.
.
if(responseCode==200) {
//실제 디렉토리에서 파일 삭제
boolean isDelete = file.delete();
if(isDelete) {
logger.info("실제 파일이 삭제되었습니다.");
//큐 삭제
pop();
}else {
logger.info("실제 파일이 삭제되지 않았습니다.");
}
.
.
.
}
파일을 전송하고 원하는 반환값을 받았다면 파일을 삭제하는 순서
였고 단순 ArrayList로만 생각한것이 짧았다.
Queue 를 적용하면 인덱스에 신경쓰지 않아도 될것같다.
삭제처리만 잘해주자!
변경
문제가 되는 코드
private static List<String> filePaths = new ArrayList();
...
//파일 경로가 담긴 배열을 forEach로 읽어들인다.
for(String target : filePaths) {
//http post 파일 전송
post(target);
}
변경된 코드
private static Queue<String> filePaths = new LinkedList();
...
while(!filePaths.isEmpty()) {
String target = filePaths.peek();
post(target);
}
728x90
반응형
LIST
'Language > 자바' 카테고리의 다른 글
JAVA의 WatchService에서 주의할점 (0) | 2023.08.10 |
---|---|
Java 8 date/time type `java.time.LocalDateTime` not supported by default 문제 해결 (0) | 2022.11.10 |
[자바]JDBC 의 중복된 코드들을 전략 패턴으로 리펙토링 해보자 (0) | 2022.06.15 |
log4j 파일기록 JDK 버전문제 (0) | 2022.05.31 |
[자바]23. ResultSet 을 Java VO 타입 을 JSON 형식으로 변환하기 (0) | 2022.01.25 |