2012-01-20 3 views
2

웹 서비스와 통신하기 위해 아파치 축을 사용하고 있습니다. 정상적으로 작동하지만 하루 동안 1GB의 임시 파일을 생성합니다. 이 파일은 서비스를 다시 시작하면 삭제되지만 매일 디스크 공간을 모두 소모하지 않도록 서비스를 다시 시작해야 할 필요가 있습니다.아파치 축 tmp 파일을 다시 시작하지 않고 삭제하는 방법

쉽게 해결할 수 있습니까?

+0

문제는 여전히 axis2 1.6.2에 있습니다. –

답변

0

임시 디렉토리 경로를 알고있는 경우, rm -rf/path/to/temp/* 매 6, 12 ..etc ~ cron을 실행할 수 있습니다.

또는 Linux 시스템에서 실행중인 bashscript를 작성하여 특정 크기에 도달하면이 디렉토리를 비울 수 있습니다. 그리고 그것을 crontab에도 넣으십시오.

+0

응원을 응원합니다. 나는 이런 종류의 헛소리를 피하기를 바랬지 만, 내가받은 유일한 대답이기 때문에 이것을 받아 들일 것입니다. –

0

나는 다른 방법으로 다른 것을 찾지 않고 매일 다시 시작합니다. 프로세스를 중지하지 않으면 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

1

에 열려있는 파일에 대한 ulimit를 증가하고있다 이러한 문제를 해결하고, 버전 1.7.0에서 수정 된 것 같습니다 :

https://issues.apache.org/jira/browse/AXIS2-3919

아직 시도하지는 않았지만 일단이 의견을 업데이트하겠습니다.

+0

문제의 새로운 의견에 따르면, 1.7에도 존재합니다. 동정 ... – Anton

5

우리는 이러한 파일의 생성을 피할 수있는 프로그램 방식을 발견했습니다. 이는 가사를 수행하는 더 좋은 방법이라고 생각합니다. 그 in the commentsAXIS2-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> 
+0

좋은 발견,이 나를 위해 완벽하게 작동합니다. 나는 다른 Spring/Autowire 접근 방식을 사용했지만 최종 결과는 동일합니다. 모든 요청에 ​​JAR 파일을 더 이상 재배포 할 필요가 없습니다. –

0

그것은 우리를 위해 쇼 스토퍼입니다 : 그래서, 다음과 같은 봄 구성이 문제를 해결하는 데 도움을 준 (관련이없는 콩 및 클래스 이름은 하락).두 가지 해결책이 있습니다 :

  1. 존재하지 않는 디렉토리로 java.io.tmpdir을 설정하십시오. 이것에 약간의 바람직하지 않은 결과가있을 수 있습니다!
  2. 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); 
    } 
    

난이 도움이되기를 바랍니다 : 여기에 함수의 내 버전입니다.

+0

웹 응용 프로그램의 클래스 패스에서 jar 파일이 다른 파일 포인터보다 앞에 있다는 보장은 없습니다. 반면에 이러한 변경 사항이 적용된 항아리를 가지고있는 사람이라면 생명의 은인이 될 것입니다. –

0

임시 파일은 새 ConfigurationContext가 만들어 질 때마다 만들어집니다. 따라서 정적 블록에서 한 번만 ConfigurationContext를 만들고 모든 후속 호출에서이 컨텍스트를 사용하십시오.

private static ConfigurationContext configContext; 

static { 
    configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null); 
} 

public callService() { 
    Stub stub = new Stub(configContext, END_POINT_URL); 
    //code 
} 

컨텍스트를 전달하지 않으면 axis2가 각 호출에서 새로운 컨텍스트를 만듭니다.

2

나는 정적 블록을 만드는 솔루션 (proudandhonour에서 제공)을 시도하고 훌륭하게 작동합니다. 첫 번째 요청에 대해서만 임시 파일을 만듭니다. 또한 Linux 서버에서 uilimit을 16000으로 업데이트합니다. 이제 임시 파일을 삭제할 필요가 없습니다.

private static ConfigurationContext configContext; 
static{ 
    configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null); 
} 
+0

StackOverflow에 오신 것을 환영합니다. 질문의 형식을 올바르게 지정하십시오! Java 코드에 해당하는 부분을 코드 블록으로 표시하십시오. –

관련 문제