2012-02-24 22 views
5

広い議論の質問。 私のアプリケーションの実行状態をJavaで保存できるライブラリがありますか?Javaでの状態の保存

私はファイルを処理するアプリケーションを持っていますが、アプリケーションは突然何らかのポイントでシャットダウンすることがあります。すべてのファイルが処理され、何もされていないかどうか、進行中のプロセスの処理が開始されました。

この機能を抽象化するライブラリは既にありますか、それとも最初から実装する必要がありますか?

+0

それは、コマンドラインアプリケーションです[春バッチ](http://static.springsource.org/spring-batch/)これをチェックしてください – yegor256

+0

特定の方法で、あなたを助ける可能性がある場合:[1] [JVMの状態を永続化] [1]:http://stackoverflow.com/questions/424341/are-there-any-java-vms-which-can-save-their-状態からファイルへのリロード - その – NiranjanBhat

+0

あなたが探しているリカバリの種類がトランザクションである場合は、進捗データをDBに格納する方が良いオプションかもしれません。そうでなければ、クラッシュ/シャットダウンの際にデータを失うことなく、これを行う方法があるかどうかはわかりません。結局のところ、プロセスを作る方法(一日の終わりに、JVMはプロセスです)は、例えば "kill -9"を発行するときに正しいことをしますか? – Pavan

答えて

3

あなたが探しているものはJava Serialization APIで実行できるシリアライゼーションのようです。

Apache Commons Langなどの既知のライブラリを使用する場合は、さらにコードを書くことができます。そのコード自体は、Java Serialization APIの上に構築されているSerializationUtilsクラスです。

アプリケーション状態をファイルにシリアライズ/デシリアライズする処理は、いくつかの行で行われます。

あなたがしなければならない唯一のことは、それはそれのように見えることができます:-) ApplicationState ...さんはそれを呼びましょう、あなたのアプリケーションの状態を保持するクラスを作成することです。このような構成とすることにより

class ApplicationState { 

enum ProcessState { 
    READ_DONE, 
    PROCESSING_STARTED, 
    PROCESSING_ENDED, 
    ANOTHER_STATE; 
} 

private List<String> filesDone, filesToDo; 
private String currentlyProcessingFile; 
private ProcessState currentProcessState; 
} 

を、および使用SerializationUtilsは、次のようにしてシリアル化されます。

try { 
     ApplicationState state = new ApplicationState(); 
     ... 
     // File to serialize object to 
     String fileName = "applicationState.ser"; 

     // New file output stream for the file 
     FileOutputStream fos = new FileOutputStream(fileName); 

     // Serialize String 
     SerializationUtils.serialize(state, fos); 
     fos.close(); 

     // Open FileInputStream to the file 
     FileInputStream fis = new FileInputStream(fileName); 

     // Deserialize and cast into String 
     String ser = (String) SerializationUtils.deserialize(fis); 
     System.out.println(ser); 
     fis.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

を実行すると、シリアライズする時間がなくなり、シリアライズするタイミングを知ることができます。 – Nishant

+0

@Nishantあなたのソリューションとの違いはありませんか? DBへの接続が切断された場合はどうなりますか?私は、ObservableインターフェイスをApplicationStateに実装するなど、何かが変化したときにアプリケーションの状態を永続化するために、両方のソリューションに別のスレッドのようなものが必要だと思います。どう思いますか ? – Jalayn

+0

ああ、私の悪い、あなたは処理の各モジュールが終了した後にシリアル化されるだろう。おそらく、処理されたファイルのリストは、すべて一緒にシリアル化されます。上記の私の疑いを気にしないでください。 – Nishant

1

ゼロから作成するのはかなり簡単です。

  1. 処理の進行状況の情報を格納しているDB(または単なるファイル)がありますか?すぐにファイルの処理を開始するよう

    Id|fileName|status|metadata 
    
  2. このテーブルにエントリを作成:ような何か。 PROCESSINGとし、中間状態を保存し、最後に完了したらステータスをDONEに設定することができます。

    このようにして、再起動すると、処理されるファイルは何か分かります。プロセスのシャットダウン時/クラッシュ時に実行されたファイルは何ですか?そして(明らかに)どこから始めるべきか。アプリケーションは疎結合(およびアプリケーションが利用できるようになりますか、クラッシュする可能性があります場合は保証はありません)されている大規模なエンタープライズ環境では

、我々は信頼性の高いアーキテクチャを確保するために、同じような何かをするためにメッセージキューを使用します。

0

言及する方法があまりにも多くあります。私はあなたが最も単純だと思う選択肢を選択します。

  • 行われているものを記録するファイル(および何行う必要がある)
  • (でも、別のマシン上で複数のプロセスをサポートする、)JMSの永続キュー
  • 組み込みまたはリモートデータベース。

私が挑戦しているアプローチは、メモリマップファイルを使用することです。いい機能は、アプリケーションが死んだり(OSがクラッシュしない限り)、死んでも情報が失われないということです。これは、フラッシュする必要がなく、そうでなければデータを失う心配もありません。

これは、データの一部がOSによって管理されているため、小さなヒープ(データのTBでも)が使用され、OSはディスクへのロードとフラッシュを処理して、メインメモリ実用)。

BTW:このアプローチは、OSがデータをディスクにフラッシュするときにkill -9であっても機能します。これをテストするために、私はUnsafe.getByte(0)を使って、アプリケーションを次のマシンコード命令のように変更した直後にSEGフォールトでクラッシュさせ、変更をディスクに書き込みます。

電源を入れても機能しませんが、すばやく操作する必要があります。メモリマップされたファイルを使用して、データをディスクに強制的に保存してから続行することができますが、これをテストする方法がわかりません。 ;)


私は

https://github.com/peter-lawrey/Java-Chronicle

そのを使用する方が簡単にファイルをメモリを作ることができるライブラリをマップした長くない読んで、あなたは一例として使用することができます。

+1

これは素晴らしいです!!多くのありがとうPeter.Worth読んで、私は確かにそれを試してみます。 – Neeraj

+0

あなたがそれを使っていなくても、読む価値があります。すなわち、私は自分のライブラリを押すように見えたくありません。私は、より多くの人々が知っておくべき、クールで面白いアプローチだと思っています。 –

0
+0

私はあなたが質問を間違って理解したと思います。説明全体をもう一度お読みください。 – Neeraj

+0

私はいくつかの永続的な構成ストレージを探していましたが、ここで私の答えを見つけて、この質問が何か違うことを忘れているのを忘れてしまいました。ありがとう。 –

関連する問題