Ho recentemente iniziato a utilizzare Gestore transazioni di origine dati di Spring. Ho un problema ora. La mia transazione include aggiornamenti a una tabella DB e un'operazione di scrittura su un file.Come gestire la transazione (che include File IO) quando viene lanciata una IOException dal metodo del file chiuso
Funziona bene ma ho qualche dubbio sull'I/O dei file. Come vedete in seguito, ho configurato i metodi openFile e closeFile del mio bean rispettivamente come metodo init e destroy-metodo, che a sua volta fornisce quei metodi per essere chiamati proprio come un costitutore e un distruttore. Se il file non viene chiuso correttamente, alcuni dei record potrebbero non essere stati scritti correttamente nel file output.txt, il che significa che non sono stato in grado di gestire correttamente anche la gestione delle transazioni.
Tuttavia, mi piacerebbe eseguire il rollback di quegli aggiornamenti DB che non sono stati aggiunti al file flat. Con la mia soluzione, sembra impossibile aggiungere il metodo fileClose alla transazione. Qualcuno sa come implementare correttamente questa azione desiderata?
Ogni suggerimento sarà molto apprezzato
<!--XML CONFIGURATION -->
<bean id="myFileWriter" class="com.job.step.ItemFileWriter" init-method="openFile" destroy-method="closeFile">
<property name="jdbcTemplate" ref="jdbcTemplateProduct"/>
</bean>
public class ItemFileWriter implements ItemWriter<Item> {
private static final Logger log = Logger.getLogger(ItemFileWriter.class);
private BufferedWriter bw = null;
public void openFile() throws IOException {
try {
bw = new BufferedWriter(new FileWriter("C:\\output.txt"));
} catch (IOException e) {
//log.error(e);
throw e;
}
}
public void closeFile() throws IOException {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
log.error(e);
throw e;
}
}
}
@Transactional(rollbackFor = IOException.class)
public void write(List<? extends Item> itemList) throws IOException
{
for (Iterator<? extends Item> iterator = itemList.iterator(); iterator.hasNext();) {
Item item = (Item) iterator.next();
String updateRtlnOutbound = "UPDATE SAMPLESCHEMA.SAMPLETABLE SET STATUS='TRANSFERRED' WHERE ID = ?";
jdbcTemplate.update(updateRtlnOutbound, new Object[]{item.getID()});
String item = String.format("%09d\n", item.customerNumber);
bw.write(item);
}
}
}