Я недавно начал использовать диспетчер транзакций источника данных Spring. У меня сейчас проблема.
Моя транзакция включает в себя обновления таблицы БД и операцию записи в файл.
Работает нормально, но у меня есть некоторые сомнения по поводу файлового ввода / вывода. Как вы видите ниже, я настроил методы openFile и closeFile для моего bean-компонента как init-метод и destroy-метод соответственно, что, в свою очередь, обеспечивает вызовы этих методов точно так же, как constuructor и destructor. Если файл не закрыт должным образом, возможно, некоторые записи не были успешно записаны в файл 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);
}
}
}