Как управлять транзакцией (включая файловый ввод-вывод), когда из метода закрытия файла возникает исключение IOException

Недавно я начал использовать диспетчер транзакций источника данных 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);
    }                           
}
}   
7
задан Kivanc 9 March 2011 в 12:20
поделиться