웹 서비스와 통신하기 위해 아파치 축을 사용하고 있습니다. 정상적으로 작동하지만 하루 동안 1GB의 임시 파일을 생성합니다. 이 파일은 서비스를 다시 시작하면 삭제되지만 매일 디스크 공간을 모두 소모하지 않도록 서비스를 다시 시작해야 할 필요가 있습니다.아파치 축 tmp 파일을 다시 시작하지 않고 삭제하는 방법
쉽게 해결할 수 있습니까?
웹 서비스와 통신하기 위해 아파치 축을 사용하고 있습니다. 정상적으로 작동하지만 하루 동안 1GB의 임시 파일을 생성합니다. 이 파일은 서비스를 다시 시작하면 삭제되지만 매일 디스크 공간을 모두 소모하지 않도록 서비스를 다시 시작해야 할 필요가 있습니다.아파치 축 tmp 파일을 다시 시작하지 않고 삭제하는 방법
쉽게 해결할 수 있습니까?
임시 디렉토리 경로를 알고있는 경우, rm -rf/path/to/temp/* 매 6, 12 ..etc ~ cron을 실행할 수 있습니다.
또는 Linux 시스템에서 실행중인 bashscript를 작성하여 특정 크기에 도달하면이 디렉토리를 비울 수 있습니다. 그리고 그것을 crontab에도 넣으십시오.
응원을 응원합니다. 나는 이런 종류의 헛소리를 피하기를 바랬지 만, 내가받은 유일한 대답이기 때문에 이것을 받아 들일 것입니다. –
나는 다른 방법으로 다른 것을 찾지 않고 매일 다시 시작합니다. 프로세스를 중지하지 않으면 tmp 파일을 삭제할 수 없습니다. 나는 디스크 공간이 더 많은 다른 위치로 시스템 속성 "java.io.tmpdir"
을 변경했기 때문에 적어도 디스크 공간이 부족하지는 않습니다.
org.springframework.scheduling.quartz.SchedulerFactoryBean # :
System.setProperty("java.io.tmpdir","/opt/Axis2Temp");
둘째는 아래와 같이 열려있는 파일이 너무 많습니다 예외가 발생합니다 몇 시간 동안 응용 프로그램을 runnng 후,이 파일과 관련된 또 다른 문제가 있습니다 0_Worker-7 org.apache.axis2.deployment.util.Utils. [createClassLoader] (856) - 임시 디렉토리로 병을 추출하는 예외 : java.io.FileNotFoundException : /tmp/axis2-tmp-9161756920591296931.tmp/axis21477916618765108874addressing-1.6. 0.mar (열린 파일이 너무 많음) : 대체 클래스 로딩 메커니즘으로 전환
org.springframework.scheduling.quartz.SchedulerFactoryBean # 0_Worker-7 org.apache.axis2.deployment.util.Utils. [createClassLoader] (860) - java.io.FileNotFoundException : /tmp/axis2-tmp-9161756920591296931.tmp /axis21477916618765108874addressing-1.6.0.mar (열려있는 파일이 너무 많습니다)
, 나는이 같은 문제에서 찾아 봤는데 내가 4000
에 열려있는 파일에 대한 ulimit를 증가하고있다 이러한 문제를 해결하고, 버전 1.7.0에서 수정 된 것 같습니다 :
https://issues.apache.org/jira/browse/AXIS2-3919
아직 시도하지는 않았지만 일단이 의견을 업데이트하겠습니다.
문제의 새로운 의견에 따르면, 1.7에도 존재합니다. 동정 ... – Anton
우리는 이러한 파일의 생성을 피할 수있는 프로그램 방식을 발견했습니다. 이는 가사를 수행하는 더 좋은 방법이라고 생각합니다. 그 in the comments의 AXIS2-3919 문제를 게시하지만, 단지의 경우 여기에 복사합니다 :
사실, 파일마다 AXIS 구성 컨텍스트가 생성 된 임시 폴더에 배포됩니다. 또한 생성 된 스텁은 생성자를 통해 기존 구성 객체를 허용 할 수 있습니다. 나는 최근이 정확한 문제를 가로 질러 온
<bean id="....Stub" factory-bean="...." factory-method="...." scope="request">
<!-- this next element effects the proxying of the surrounding bean,
needed because .... will try to set the stub out of request scope -->
<aop:scoped-proxy/>
<constructor-arg index="0" >
<!-- The WS stub is created here, and passed to the factory-method of ... as a parameter -->
<bean class="com......ws.....Stub" scope="prototype">
<constructor-arg ref="axisConfigContext" />
</bean>
</constructor-arg>
</bean>
<!-- Exists to avoid deployment of axis jar into temp dir for each request. See AXIS2-3919 for more details. -->
<bean id="axisConfigContext"
class="org.apache.axis2.context.ConfigurationContextFactory"
factory-method="createConfigurationContextFromFileSystem">
<constructor-arg index="0"><null /></constructor-arg>
<constructor-arg index="1"><null /></constructor-arg>
</bean>
좋은 발견,이 나를 위해 완벽하게 작동합니다. 나는 다른 Spring/Autowire 접근 방식을 사용했지만 최종 결과는 동일합니다. 모든 요청에 JAR 파일을 더 이상 재배포 할 필요가 없습니다. –
그것은 우리를 위해 쇼 스토퍼입니다 : 그래서, 다음과 같은 봄 구성이 문제를 해결하는 데 도움을 준 (관련이없는 콩 및 클래스 이름은 하락).두 가지 해결책이 있습니다 :
org.apache.axis2.deployment.util.Utils의 맞춤형 버전을 만들고 createClassLoader 함수를 편집하십시오. 이것을 축 라이브러리 앞에 클래스 경로에 배치하십시오. 이 함수는 파일을 복사하게하는 boolean extractJars를 취합니다. 불가능할 경우 (예 : tmp 디렉토리가없는 경우) 클래스 로더는 jar 파일의 원본을 제거합니다. 다시 한 번 바람직하지 않은 결과가있을 수 있습니다. 이 테마에는 여러 가지 변형이 있습니다. 병의 단일 복사본을 만드는 코드를 추가하는 방법도 있지만 기존의 기능을 사용하기 때문에이 솔루션이 더 좋다고 생각합니다.
public static ClassLoader createClassLoader (URL[] urls,
ClassLoader serviceClassLoader,
boolean extractJars,
File tmpDir,
boolean isChildFirstClassLoading) {
List embedded_jars = Utils.findLibJars(urls[0]);
return createDeploymentClassLoader(urls, serviceClassLoader,
embedded_jars, isChildFirstClassLoading);
}
난이 도움이되기를 바랍니다 : 여기에 함수의 내 버전입니다.
웹 응용 프로그램의 클래스 패스에서 jar 파일이 다른 파일 포인터보다 앞에 있다는 보장은 없습니다. 반면에 이러한 변경 사항이 적용된 항아리를 가지고있는 사람이라면 생명의 은인이 될 것입니다. –
임시 파일은 새 ConfigurationContext가 만들어 질 때마다 만들어집니다. 따라서 정적 블록에서 한 번만 ConfigurationContext를 만들고 모든 후속 호출에서이 컨텍스트를 사용하십시오.
private static ConfigurationContext configContext;
static {
configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null);
}
public callService() {
Stub stub = new Stub(configContext, END_POINT_URL);
//code
}
컨텍스트를 전달하지 않으면 axis2가 각 호출에서 새로운 컨텍스트를 만듭니다.
나는 정적 블록을 만드는 솔루션 (proudandhonour에서 제공)을 시도하고 훌륭하게 작동합니다. 첫 번째 요청에 대해서만 임시 파일을 만듭니다. 또한 Linux 서버에서 uilimit을 16000으로 업데이트합니다. 이제 임시 파일을 삭제할 필요가 없습니다.
private static ConfigurationContext configContext;
static{
configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null);
}
StackOverflow에 오신 것을 환영합니다. 질문의 형식을 올바르게 지정하십시오! Java 코드에 해당하는 부분을 코드 블록으로 표시하십시오. –
문제는 여전히 axis2 1.6.2에 있습니다. –