2012-01-20 13 views
2

Webサービスと通信するためにapache軸を使用しています。それは正常に動作しますが、1日のうちに1GBの一時ファイルが生成されます。これらのファイルは、サービスを再起動すると削除されますが、毎日サービスを再起動する必要があるため、ディスク領域が不足することはありません。再起動せずにapache軸tmpファイルを削除するには

これは簡単に修正できますか?

+0

問題はまだ軸2 1.6.2に存在します。 –

答えて

0

tempディレクトリのパスがわかっている場合は、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) - jarを一時ディレクトリに抽出する例外:java.io.FileNotFoundException:/tmp/axis2-tmp-9161756920591296931.tmp/axis21477916618765108874addressing-1.6。 0.mar(開いているファイルが多すぎます):代替のクラスローディング機構に切り替える

org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-7 [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の構成コンテキストが作成されるたびに配備されています。また、生成されたスタブはコンストラクタを介して既存のコンフィグレーションオブジェクトを受け入れることができます。ですから、以下のSpring構成は、(無関係なBeanとクラス名がドロップされた)問題を解決するために私たちを助けた:

<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ファイルの元のコピーを処理します。この場合もまた、望ましくない結果が生じる可能性があります。このテーマにはいくつかのバリエーションがありますが、私はjarのコピーを1つだけ作成するコードを追加しましたが、既存の機能を使用するのでこのソリューションはより良いと思います。ここでは、関数の私のバージョンは次のとおりです。

    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

私はそれを望みましたが、Webアプリケーションのクラスパス内に別のものがあることを保証することはできません。一方、これらの変更を伴う更新されたjarファイルを持つ人は、人生の節約になります。 –

0

新しいConfigurationContextが作成されるたびに、一時ファイルが作成されます。したがって、静的ブロック内に1回だけ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コードに対応する部分がブロックされます。 –

関連する問題