Apache Transaction: fichier d'écriture transactionnellement - comment utiliser resourceId
-
10-10-2019 - |
Question
Si quelqu'un a mis en œuvre l'écriture transactionnelle au dossier, s'il vous plaît, aidez-moi.
Sujet connexe a été discuté dans le fil plus tôt ( transactionnel écriture).
Cas d'utilisation est le suivant:
si l'écriture dans le fichier journal est échoué, cette transaction appropriée DB qui devraient être annulées.
Ainsi, le writinig au fichier doit être effectué de manière transactionnelle.
J'ai créé instance de FileResourceManager:
FileResourceManager FRM = new FileResourceManager ( "c: \ roquet", "C: \ cur", vrai, enregistreur);
Si je comprends bien tutoriel de cette Apache Commons Transaction , i devrait mettre en œuvre les étapes ci-dessous:
-
démarrer la transaction:
frm.start();
-
get ID de transaction pour elle:
transactionId = frm.generatedUniqueTxId();
-
procédé d'appel, ce qui est nécessaire, par exemple, writeResource avec transactionId et resourceId:
frm.writeResource(transactionId, resourceId);
Et voici l'ambiguïté:
a) comment puis-je resourceId
connexion avec des ressources réelles, que je devrais écrire transactioanally?
b) comment faire mon dossier, que je vais écrire transactionnellement va maintenant au sujet resourceId
?
Nous vous remercions de conseiller.
La solution
En réponse loin de personne, j'essaie de faire ma dernière expérience.
documentataion utiles:
Example2 (.ppt)
algorithme simplifié ressemble (en fait, représenté en Example2):
1. initialize FileResourceManager
2. FileResourceManager commencer
3. transaction obtenir Id de
exemple FileResourceManager
4. transaction commencer par transaction Id de l'étape 3
. 5 write ressources dont vous avez besoin - ici est mentionné l'écrire transactionnellement , donc semble que ce soit la principale étape
6. commit ou rollback transaction
Remarque: resourceId , à propos de j'ai demandé, ma question, est tout simplement nom fichier transactionnel . Cette appellation ne représente pas très bien cet attribut.
Code, j'utilisé:
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");
}
}