Недавно я начал использовать диспетчер транзакций источника данных Spring. Теперь у меня проблема. Моя транзакция включает обновления таблицы БД и операцию записи в файл.
Он работает нормально, но у меня есть некоторые сомнения насчет файлового ввода-вывода. Как вы видите ниже, я настроил методы openFile и closeFile моего bean-компонента как init-method и destroy-method соответственно, которые, в свою очередь, предоставляют эти методы для вызова точно так же, как конструктор и деструктор. Если файл не закрыт должным образом, возможно, некоторые записи не были успешно записаны в файл output.txt, что означает, что я также не смог правильно обработать управление транзакциями.
Однако я хотел бы откатить те обновления БД, которые не были добавлены в плоский файл. В моем решении добавить к транзакции метод fileClose невозможно. Кто-нибудь знает, как правильно реализовать это желаемое действие?
Мы будем очень благодарны за любые предложения
<!--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);
}
}
}