2017-11-10 8 views
0

複数のステップでスプリングバッチを使用していますが、私は実行時にメモリの占有量が増えていることがわかります。複数のCSVファイルから。これらのデータを使っていくつかの変換レコードを削除しています。複数のステップで使用されているマップメモリ​​空間を解放する

私の質問は、メモリ占有を解放する最も/適切な方法です。

@Bean 
    public Job importParameterJob() { 

     return jobBuilderFactory.get("importParameterJob") 
       .incrementer(new RunIdIncrementer()) 
       .start((step1())) 
       .next((step2)) 
       .next((step3)) 
       .next((step4)) 
       .next((step5)) 
       .next(finalStep()) 
       .build(); 
    } 

のは、ここでは例を見てみましょう、私のステップ2は、アラがステップ2ストアのアイテムのプロセッサに、より正確に、マップリスト上のすべてのレコードを(リスト)をマッピングするためにcsvファイルからのレコードのレッズ格納するリストを使用している

私は他のステップの中にこの地図を使用する必要が何らかの理由で
public class Step2ItemProcessor implements ItemProcessor<Step2FileRow, Step2FileRow> { 

    private static final Logger log = LoggerFactory.getLogger(Step2ItemProcessor.class); 

    private Map<Long , Step2FileRow> step2FileRowMap; 

    public Step2ItemProcessor() { 
     step2FileRowMap = new HashMap<Long , Step2FileRow>(); 
     log.info("Step2 ItemProcessor a été crée avec une Map pour charger tous les Step2s"); 
    } 

    @Override 
    public Step2FileRow process(final Step2FileRow Step2FileRow) throws Exception { 
     step2FileRowMap.put(Step2FileRow.getId(), Step2FileRow); 
     log.info("Le Step2 ID :" + Step2FileRow.getId() +" a été ajouté dans la liste des Step2s en memoire Map"); 
     return null; 
    } 

    public Map<Long , Step2FileRow> getstep2FileRowMap() { 
     return step2FileRowMap; 
    } 
} 

、 作業が行われた後に必要なリストは、私はまだTODO、すべてのこれらのレコードのメモリ上の持っているものドードーするために使用されている場合、私の質問サンザシ缶私はこのItemProcessorを彼のリストで解放します。 私はタクレットを使用してこのItemProcessorを注入し、そのリストをnullにする必要がありましたか?または地図からレコードを解放するには、clear()メソッドを使用し

@Autowired 
    private Step2ItemProcessor listObject; 
+0

'Step2ItemProcessor'が実装' JobExecutionListener'と 'クリア()afterJob'で 'マップをしようと() ' –

+0

あなたの親切な助けていただきありがとうございます。私はまだ私はいくつかのものを実行するときに参照する必要があるいくつかのレコードをマップストアを述べたように、私はまだステップ3とステップ4でマップを使用していることはできません)、実際にステップ5からこのマップを参照していないので、このマップを削除することができます。このなぜ私は 'step5'は' StepExecutionListener' –

+0

と思っていますnullを返す。 \t} –

答えて

1

あなたがやりたいことのために2つのオプションがあります。

  1. スコープのステップとして、コンポーネントを定義する - これは、各ステップが取得できるようになりますそれは自分のインスタンスであり、以前のインスタンスはガベージコレクションのために利用可能になります。
  2. コンポーネントにItemStreamインターフェイスを実装する - ItemStreamインターフェイスは、ステートフルな任意のSpringバッチコンポーネントによって実装されることを意図しています。データの処理は、コンポーネントが必要なリソースを開くために、以前に以前に格納されていてもよい任意の状態をリセットするための許可を開始する前に、このメソッドが呼び出される -

    • ItemStream#open(ExecutionContext context):それは、フレームワークによって呼び出された3つのメソッドを提供します走る
    • ItemStream#update(ExecutionContext context) - このメソッドは、コンポーネントが障害発生時に状態を保存できるようにするステップの実行によって定期的に呼び出されます。
    • ItemStream#close() - このメソッドは、処理の完了後にすべてのリソースをクリーンアップするために用意されています。 ItemStreamオプションで

、あなたはItemStream#openの各Mapを再初期化し、潜在的にItemStream#closeでそれをクリーンアップすると思います。

あなたがここにステップスコープのコンポーネントの詳細を読むことができます:あなたがここにItemStreamインタフェースの詳細を読むことができhttps://docs.spring.io/spring-batch/4.0.x/reference/html/step.html#step-scopehttps://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ItemStream.html

+0

最初、私はしたいと思いますあなたの親切な助けと協力に感謝します。 私はステップ1から読み込まれたすべてのレコードを保存するためにマップを使用しています。このマップはステップ2とステップ3で使用され、その後ステップ4からは使用する必要はありません。あなたのアプローチがここで受け入れられるのを見てください:** 1への記録**このアプローチは、私が常にこのリストをいくつかのステップで参照しているので適用できません。 ** 2への録音**このアプローチには追加コストがあります。すべてのステップで、マップを再作成して複数回破棄します –

+0

マップを複数のステップで保存する必要がある場合は、リスナーを使用して作成し、それをクリーンアップします。 –

+0

はい、@ルーカのBasso Ricciのコメントをお待ちしております。ありがとうございました –

関連する問題