Gần đây tôi đã bắt đầu sử dụng Trình quản lý giao dịch nguồn dữ liệu của Spring. Tôi có một vấn đề bây giờ. Giao dịch của tôi bao gồm các cập nhật cho bảng DB và thao tác ghi vào một tệp.Cách quản lý giao dịch (bao gồm Tệp IO) khi một IOException được ném từ phương thức đóng tệp
Nó hoạt động tốt nhưng tôi có một số nghi ngờ về tệp I/O. Như bạn thấy dưới đây, tôi đã cấu hình các phương thức openFile và closeFile của bean của tôi như là phương thức init và phương thức hủy diệt, lần lượt cung cấp các phương thức đó được gọi giống như một constuructor và một destructor. Nếu tệp không được đóng đúng cách, một số bản ghi có thể không được ghi thành công vào tệp output.txt có nghĩa là tôi cũng không thể xử lý đúng cách quản lý giao dịch.
Tuy nhiên, tôi muốn khôi phục các cập nhật DB chưa được thêm vào tệp phẳng. Với giải pháp của tôi, có vẻ như không thể thêm phương thức fileClose vào giao dịch. Có ai biết cách thực hiện hành động mong muốn này đúng không?
Bất kỳ lời đề nghị sẽ được đánh giá rất
<!--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);
}
}
}