Niedawno zacząłem używać Spring Data Data Source Transaction Manager. Mam teraz problem. Moja transakcja obejmuje aktualizacje tabeli bazy danych i operację zapisu do pliku.Jak zarządzać transakcją (która obejmuje plik IO), gdy wyjątek IOException jest generowany z metody zamykania plików.
Działa dobrze, ale mam pewne wątpliwości dotyczące pliku I/O. Jak widać poniżej, skonfigurowałem metody openFile i closeFile mojego komponentu bean odpowiednio jako metodę init i metodę destroy, która z kolei zapewnia metody, które można nazwać tak jak constuructor i destruktor. Jeśli plik nie został poprawnie zamknięty, niektóre rekordy mogły nie zostać zapisane w pliku output.txt, co oznacza, że nie byłem w stanie odpowiednio obsłużyć zarządzania transakcjami.
Chciałbym jednak przywrócić te aktualizacje DB, które nie zostały dołączone do płaskiego pliku. Dzięki mojemu rozwiązaniu nie można dodać metody fileClose do transakcji. Czy ktokolwiek wie, jak prawidłowo wdrożyć to pożądane działanie?
Wszelkie sugestie będą bardzo mile widziane
<!--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);
}
}
}