広い議論の質問。 私のアプリケーションの実行状態をJavaで保存できるライブラリがありますか?Javaでの状態の保存
私はファイルを処理するアプリケーションを持っていますが、アプリケーションは突然何らかのポイントでシャットダウンすることがあります。すべてのファイルが処理され、何もされていないかどうか、進行中のプロセスの処理が開始されました。
この機能を抽象化するライブラリは既にありますか、それとも最初から実装する必要がありますか?
広い議論の質問。 私のアプリケーションの実行状態をJavaで保存できるライブラリがありますか?Javaでの状態の保存
私はファイルを処理するアプリケーションを持っていますが、アプリケーションは突然何らかのポイントでシャットダウンすることがあります。すべてのファイルが処理され、何もされていないかどうか、進行中のプロセスの処理が開始されました。
この機能を抽象化するライブラリは既にありますか、それとも最初から実装する必要がありますか?
あなたが探しているものは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();
}
を実行すると、シリアライズする時間がなくなり、シリアライズするタイミングを知ることができます。 – Nishant
@Nishantあなたのソリューションとの違いはありませんか? DBへの接続が切断された場合はどうなりますか?私は、ObservableインターフェイスをApplicationStateに実装するなど、何かが変化したときにアプリケーションの状態を永続化するために、両方のソリューションに別のスレッドのようなものが必要だと思います。どう思いますか ? – Jalayn
ああ、私の悪い、あなたは処理の各モジュールが終了した後にシリアル化されるだろう。おそらく、処理されたファイルのリストは、すべて一緒にシリアル化されます。上記の私の疑いを気にしないでください。 – Nishant
ゼロから作成するのはかなり簡単です。
処理の進行状況の情報を格納しているDB(または単なるファイル)がありますか?すぐにファイルの処理を開始するよう
Id|fileName|status|metadata
このテーブルにエントリを作成:ような何か。 PROCESSING
とし、中間状態を保存し、最後に完了したらステータスをDONE
に設定することができます。
このようにして、再起動すると、処理されるファイルは何か分かります。プロセスのシャットダウン時/クラッシュ時に実行されたファイルは何ですか?そして(明らかに)どこから始めるべきか。アプリケーションは疎結合(およびアプリケーションが利用できるようになりますか、クラッシュする可能性があります場合は保証はありません)されている大規模なエンタープライズ環境では
、我々は信頼性の高いアーキテクチャを確保するために、同じような何かをするためにメッセージキューを使用します。
Java Preferences APIのように聞こえるかもしれません。これにより、ユーザー/システムの設定を最小限の労力で保存でき、いつでも更新/取得できます。 http://docs.oracle.com/javase/1.4.2/docs/guide/lang/preferences.html
リンクが壊れています – shyam
言及する方法があまりにも多くあります。私はあなたが最も単純だと思う選択肢を選択します。
私が挑戦しているアプローチは、メモリマップファイルを使用することです。いい機能は、アプリケーションが死んだり(OSがクラッシュしない限り)、死んでも情報が失われないということです。これは、フラッシュする必要がなく、そうでなければデータを失う心配もありません。
これは、データの一部がOSによって管理されているため、小さなヒープ(データのTBでも)が使用され、OSはディスクへのロードとフラッシュを処理して、メインメモリ実用)。
BTW:このアプローチは、OSがデータをディスクにフラッシュするときにkill -9
であっても機能します。これをテストするために、私はUnsafe.getByte(0)
を使って、アプリケーションを次のマシンコード命令のように変更した直後にSEGフォールトでクラッシュさせ、変更をディスクに書き込みます。
電源を入れても機能しませんが、すばやく操作する必要があります。メモリマップされたファイルを使用して、データをディスクに強制的に保存してから続行することができますが、これをテストする方法がわかりません。 ;)
私は
https://github.com/peter-lawrey/Java-Chronicle
そのを使用する方が簡単にファイルをメモリを作ることができるライブラリをマップした長くない読んで、あなたは一例として使用することができます。
これは素晴らしいです!!多くのありがとうPeter.Worth読んで、私は確かにそれを試してみます。 – Neeraj
あなたがそれを使っていなくても、読む価値があります。すなわち、私は自分のライブラリを押すように見えたくありません。私は、より多くの人々が知っておくべき、クールで面白いアプローチだと思っています。 –
のApache Commonsの設定API:http://commons.apache.org/proper/commons-configuration/userguide/howto_filebased.html#File-based_Configurations
私はあなたが質問を間違って理解したと思います。説明全体をもう一度お読みください。 – Neeraj
私はいくつかの永続的な構成ストレージを探していましたが、ここで私の答えを見つけて、この質問が何か違うことを忘れているのを忘れてしまいました。ありがとう。 –
それは、コマンドラインアプリケーションです[春バッチ](http://static.springsource.org/spring-batch/)これをチェックしてください – yegor256
特定の方法で、あなたを助ける可能性がある場合:[1] [JVMの状態を永続化] [1]:http://stackoverflow.com/questions/424341/are-there-any-java-vms-which-can-save-their-状態からファイルへのリロード - その – NiranjanBhat
あなたが探しているリカバリの種類がトランザクションである場合は、進捗データをDBに格納する方が良いオプションかもしれません。そうでなければ、クラッシュ/シャットダウンの際にデータを失うことなく、これを行う方法があるかどうかはわかりません。結局のところ、プロセスを作る方法(一日の終わりに、JVMはプロセスです)は、例えば "kill -9"を発行するときに正しいことをしますか? – Pavan