Tomcat 6 : 웹 메소드 호출이 종료 된 후 임시 파일을 삭제하는 방법은 무엇입니까?
-
03-07-2019 - |
문제
MTOM 바이너리 첨부 파일을 통해 비누 응답의 일부로 반환되는 데이터가있는 임시 파일이 있습니다. 메소드 호출 "ENDER"(즉, 전송이 끝나는 즉시)마다 쓰레기를 버리고 싶습니다. 내가 이것을하는 가장 좋은 방법은 무엇입니까? 이 작업을 수행하는 방법을 알아낼 수있는 가장 좋은 방법은 세션이 파괴 될 때 삭제하는 것이지만,이를 수행 할 수있는 더 즉각적인 방법이 있는지 확실하지 않습니다.
참고로, 나는 축을 사용하고 있지 않고, 그것이 중요하다면 Jax-Ws를 사용하고 있습니다.
업데이트 : 답변자가 실제로 문제를 이해하고 있는지 확신 할 수 없습니다. Java에서 파일을 삭제하는 방법을 알고 있습니다. 내 문제는 이것입니다.
@javax.jws.WebService
public class MyWebService {
...
@javax.jws.WebMethod
public MyFileResult getSomeObject() {
File mytempfile = new File("tempfile.txt");
MyFileResult result = new MyFileResult();
result.setFile(mytempfile); // sets mytempfile as MTOM attachment
// mytempfile.delete() iS WRONG
// can't delete mytempfile because it hasn't been returned to the web service client
// yet. So how do I remove it?
return result;
}
}
해결책
나는이 같은 문제에 부딪쳤다. 문제는 JAX-WS 스택이 파일을 관리한다는 것입니다. jax-ws가 파일로 수행 될 때 코드에서 결정할 수 없으므로 언제 삭제 해야하는지 알 수 없습니다.
제 경우에는 파일이 아닌 객체 모델에서 Datahandler를 사용하고 있습니다. MyFileresult는 파일 필드 대신 다음 필드를 갖습니다.
private DataHandler handler;
내 해결책은 FiledAtasource의 맞춤형 버전을 만드는 것이 었습니다. 파일의 내용을 읽기 위해 FileInputStream을 반환하는 대신 FileInputStream의 다음 확장을 반환합니다.
private class TemporaryFileInputStream extends FileInputStream {
public TemporaryFileInputStream(File file) throws FileNotFoundException {
super(file);
}
@Override
public void close() throws IOException {
super.close();
file.delete();
}
}
본질적으로 데이터 소스는 한 번만 읽을 수 있습니다. 스트림이 닫히면 파일이 삭제됩니다. JAX-WS 스택은 파일을 한 번만 읽으므로 작동합니다.
솔루션은 약간의 해킹이지만이 경우 최상의 옵션 인 것 같습니다.
다른 팁
표준 Java 온도 파일을 사용하고 있습니까? 그렇다면이 작업을 수행 할 수 있습니다.
File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
당신이 말하는이 webapp의 컨텍스트에서 설정 한 작업 폴더. 이 작업 디렉토리를 알려진 디렉토리로 설정할 수 있습니까? 그렇다면 임시 작업 디렉토리 (알고있는) 내에서 온도 파일을 찾을 수 있습니다. 찾은 후에는 삭제할 수 있습니다.