私は最近、Spring の Data Source Transaction Manager を使い始めました。今問題があります。私のトランザクションには、DB テーブルへの更新とファイルへの書き込み操作が含まれます。
正常に動作しますが、ファイル I/O について疑問があります。以下に示すように、Bean の openFile メソッドと closeFile メソッドをそれぞれ init-method と destroy-method として構成しました。これにより、コンストラクターとデストラクターのように呼び出されるメソッドが提供されます。ファイルが適切に閉じられていない場合、一部のレコードが output.txt ファイルに正常に書き込まれていない可能性があります。これは、トランザクション管理も適切に処理できていないことを意味します。
ただし、フラット ファイルに追加されていない DB 更新をロールバックしたいと考えています。私の解決策では、 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);
}
}
}