Apache Transaction: запись файла транзакционно - как использовать resourceId - PullRequest
7 голосов
/ 13 января 2011

Если кто-нибудь реализовал запись транзакций в файл, пожалуйста, помогите мне.
Связанная тема обсуждалась в более ранней теме ( транзакционная запись ).

Вариант использования следующий:
если запись в файл журнала не удалась, соответствующая транзакция БД будет откатана.

Таким образом, запись в файл должна выполняться транзакционным способом.

Я выбрал Транзакция Apache Commons lib.
И есть проблема, которая не позволяет мне идти дальше, потому что не нашел соответствующей документации или примеров.

Я создал экземпляр FileResourceManager:

FileResourceManager frm = new FileResourceManager ( "C: \ дворняжка", "c: \ cur", true, logger);

Как я понял из этого учебника по транзакциям Apache Commons , я должен реализовать следующие шаги:

  1. начало транзакции:
    frm.start();

  2. получить для него идентификатор транзакции:
    transactionId = frm.generatedUniqueTxId();

  3. вызов метода, который необходим, например, writeResource с ID транзакции и ИД ресурса:
    frm.writeResource(transactionId, resourceId);

А вот и двусмысленность:
а) как я могу связать resourceId с реальным ресурсом, который я должен писать транзакционно?
б) как мой файл, который я напишу транзакционно, теперь будет о resourceId?

Спасибо за совет.

1 Ответ

4 голосов
/ 18 января 2011

Пока никто не отвечает, я пытаюсь сделать это из моего последнего опыта.

Полезные документы:
example2 (.ppt)

Упрощенный алгоритм выглядит (на самом деле, как показано в примере 2):
1. инициализация FileResourceManager
2. запуск FileResourceManager
3. получить идентификатор транзакции из экземпляра FileResourceManager
4. начать транзакцию с идентификатором транзакции с шага 3
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");
    }
}
...