8

誰かがファイルへのトランザクション書き込みを実装した場合は、助けてください。関連トピックは、以前のスレッド ( transactional write
) で議論されました。

ユース ケースは次のとおりです。
ログ ファイルへの書き込みが失敗した場合、適切な DB トランザクションをロールバックする必要があります。

したがって、ファイルへの書き込みはトランザクション方式で実行する必要があります。

私はApache Commons Transaction lib を選択しました。
そして、適切なドキュメントや例が見つからないため、これ以上先に進めないという問題があります。

FileResourceManager のインスタンスを作成しました:

FileResourceManager frm = new FileResourceManager("c:\cur", "c:\cur", true, logger);

このApache Commons Transaction チュートリアルから理解できるように、次の手順を実装する必要があります。

  1. 取引開始:
    frm.start();

  2. そのトランザクション ID を取得します。
    transactionId = frm.generatedUniqueTxId();

  3. 必要なメソッドを呼び出します。たとえば、transactionId と resourceId を指定した writeResource:
    frm.writeResource(transactionId, resourceId);

そして、ここに曖昧さがあります:
a) どうすればresourceId実際のリソースに接続できますか?トランザクション的に書く必要がありますか?
b) トランザクション的に書き込む私のファイルはどのようになりますresourceIdか?

アドバイスありがとうございます。

4

1 に答える 1

5

誰も答えない限り、私は私の最近の経験からそうしようとします.

役立つドキュメント:
example2(.ppt)

単純化されたアルゴリズムは次のようになります (実際には、example2 に示されています):
1. FileResourceManager を初期化します
2. FileResourceManager を開始します
3. FileResourceManager インスタンスからトランザクション ID を取得します
4.ステップ 3 のトランザクション ID でトランザクションを開始します
5.必要なリソースを書き込みますトランザクション的
に、それは主要なステップのようです!
6.トランザクションのコミットまたはロールバック

注: resourceId、私の質問で尋ねたものについては、単にトランザクションファイルの名前です。このネーミングは、この属性をうまく表していません。

コード、私が使用した:

private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FileAppender.class);
private static LoggerFacade loggerFacade = new Log4jLogger(logger);

private static String tempDir = (String) System.getProperties().get("java.io.tmpdir");

private FileResourceManager frm = new FileResourceManager(tempDir, tempDir, false, loggerFacade);
private static OutputStream outputStream;

public void writeOut(E event) throws IOException {
    Object txId = null;
    try {
        frm.start();
        txId = frm.generatedUniqueTxId();
        frm.startTransaction(txId);
        outputStream = frm.writeResource(txId, fileName, true);
        frm.commitTransaction(txId);

    }

    catch (Exception e) {
        throw new IOException("DB rollback");
    }
}
于 2011-01-18T17:02:08.633 に答える