当关闭文件方法抛出 IOException 时如何管理事务(包括文件 IO)

2024-02-04

我最近开始使用 Spring 的数据源事务管理器。我现在有问题。 我的事务包括对数据库表的更新和对文件的写入操作。

它工作正常,但我对文件 I/O 有一些疑问。如下所示,我已将 bean 的 openFile 和 closeFile 方法分别配置为 init 方法和 destroy 方法,这反过来又提供了这些方法,就像构造函数和析构函数一样被调用。如果文件没有正确关闭,某些记录可能无法成功写入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);
    }                           
}
}   

一般来说,文件 IO 不是事务性的(某些特定于操作系统的功能除外)。

因此,您能做的最好的事情就是将打开和关闭操作移至write()方法,以便在事务内执行它们并在关闭失败时回滚事务。

但请注意,在事务回滚的情况下,您无法回滚文件 IO,因此在某些情况下您可以获得包含项目的正确文件,而在数据库中这些项目不会被标记为TRANSFERRED.

为了解决这个问题你可以尝试使用低级事务管理支持 http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html并尝试在回滚的情况下删除文件,但我认为它仍然无法提供强有力的一致性保证:

@Transactional(rollbackFor = IOException.class)
public void write(List<? extends Item> itemList) throws IOException 
{                
    openFile();
    TransactionSynchronizationManager().registerSynchronization(new TransactionSynchronizationAdapter() {
        public void afterCompletion(int status) {
            if (status = STATUS_ROLLED_BACK) {
                // try to delete the file
            }
        }
    });

    try {
        ...
    } finally {
        closeFile();                        
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当关闭文件方法抛出 IOException 时如何管理事务(包括文件 IO) 的相关文章

  • HibernateTemplate 可以与 EntityManager 共存吗?

    我们有一个 spring 3 应用程序 它仍然使用已弃用的HibernateTemplate为了持久性并希望迁移到更现代的 JPAEntityManager 是否可以在迁移过程中并行使用这两个 API 甚至可能在单个事务中同时使用 以便我们
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 检查两个日期周期是否重叠[重复]

    这个问题在这里已经有答案了 我有两个日期范围 start1 end1 gt gt date1 start2 end2 gt gt date2 我想检查两个日期是否重叠 我的流程图我假设 运算符对于比较是有效的 boolean isOverL
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • .NET 世界有 Maven 替代方案或端口吗?

    NET 世界有 Maven 替代方案或端口吗 我很想使用 Java 世界拥有的良好依赖管理系统 但我没有找到任何可与 NET 项目相媲美的系统 NMaven http incubator apache org nmaven 是第一个 官方努
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • 使用 PowerMock 和 TestNG 模拟单个静态方法

    class StaticClass public static String a return a public static String ab return a b 我想嘲笑StaticClass a以便它返回 x 并致电StaticC
  • 如何使用 Java 文档 API 为 OrientDB 数据库创建自动递增索引/序列?

    我通过其文档 API 将 OrientDB 与 Java 结合使用 我有一个简单的类叫做items它有一个属性ID 我明确声明架构如下 OSchema schema db getMetadata getSchema OClass items
  • 如何在 WebSphere Liberty Batch 中配置事务超时?

    的作用是什么javax transaction global timeout 我是否需要实施检查点 超时 中的方法检查点算法 服务器配置级别有什么东西吗 它如何与应用程序级别的设置进行交互 2016年12月2日编辑 重新设计并解释了为应用程
  • Jetty 提供静态内容所需的最少文件集?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 不支持使用 JDK 版本“11.0.1”进行构建。请安装 JDK 版本 `1.8.0`

    我已经下载了 Visual Studio for Mac 并尝试开始学习 Xamarin iOS 和 Android 问题是当我尝试运行 android 项目时出现以下错误 Building with JDK Version 11 0 1
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 在服务器上创建 Zip 文件并使用 java 下载该 zip

    我从 mkyong 获得了以下代码 用于在本地压缩文件 但是 我的要求是在服务器上压缩文件并需要下载它 任何人都可以帮忙吗 代码写入zip文件 public void zipFiles File contentFile File navFi
  • 避免加密和编码的 URL 字符串中的换行符

    我正在尝试实现一个简单的字符串编码器来混淆 URL 字符串的某些部分 以防止它们被用户弄乱 我使用的代码几乎与示例中的相同JCA指南 http docs oracle com javase 6 docs technotes guides s
  • 如何在 Windows 上使用 Java Hotspot JVM 禁用小型转储 (mdmp) 文件生成

    目前 我有一个已部署的可执行 jar 文件 该文件在崩溃时会创建大型 7 Gb 小型转储文件 我想要一个导致崩溃原因的文本表示 而不是 JVM 状态的二进制文件 我尝试使用中找到的信息这个 CodeRanch 帖子 http www cod
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • Java:易失性足以使类线程安全?

    我有一个关于 Java 中 volatile 语句的问题 请看这个构造的例子 class Master Foo is a class with thread safe methods public volatile Foo foo clas
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码
  • 如何读取FTL文件中的JSONArray?

    我在我的 Java 文件中硬编码了以下 JSON 对象 JSONObject notificationInfoJson new JSONObject notificationInfoJson put title Payment Receiv

随机推荐

  • EclEmma 代码覆盖率忽略 Junit 测试

    我发现在 JUnit 测试中不检查代码覆盖率的唯一方法是右键单击包 选择 Coverage as 然后选择配置 然后我可以取消单击我的测试包 我已经尝试了所有可能的组合来排除test在常规首选项 java 代码覆盖率 排除下 没有看到任何变
  • url重写index.php

    我有类似的网址 http mysite com index php p resources http mysite com index php p resources s view id 938 但我想要像这样的网址 http mysite
  • `Object obj(args...)` 和 `Object obj{args...}` 有什么区别?

    草稿本有效的C 11 http scottmeyers blogspot com 2013 01 effective c11 content and status html斯科特 迈耶斯 Scott Meyers 指出 创建对象时区分 和
  • ASP.Net MVC 控制器命名空间数组

    我注意到 MapRoute 扩展包含一个重载 它接受称为 命名空间 的 string 参数 我读了谷歌为我提供的内容 据说这是为了帮助框架在它不会找到的地方找到控制器 我做了一些尖峰 并尝试将控制器放在奇怪的位置 我把一个放在 Script
  • 在WPF中设置具有2个级别的TreeView HierarchicalDataTemplate

    我有一个在窗口的 DataContext 中表示的视图模型 public class SchoolViewModel ViewModelBase public ObservableCollection
  • Jetpack compose中的[NestedScrollView + RecyclerView]或[NestedRecyclerView(另一个回收器内的回收器)相当于什么

    I want to create the following layout in Jetpack compose 我尝试在垂直可滚动框中创建两个列表 但这是不可能的 因为我收到了此错误 java lang IllegalStateExcep
  • 如何向枚举添加扩展方法

    我有这个枚举代码 enum Duration Day Week Month 我可以为此枚举添加扩展方法吗 根据这个site http damieng com blog 2012 10 29 8 things you probably did
  • python 中的全局关键字

    我正在学习 python 并与其中的 global 关键字作斗争vscode 到目前为止 代码可以正常工作 但是vscodelinter 引发错误 我想了解原因 我尝试过使用 global 关键字 即使出现 linter 错误 代码也可以正
  • 从 Service Worker 中获取 Service Worker ID 或日期

    有谁知道是否有办法在服务人员内部获取此号码或日期 命名我的服务工作线程缓存会很方便cache 1182 or cache 20171127171448 我想在安装事件之前必须知道接收日期 不 这个东西不存在于Service Worker 规
  • Angular 2 - 将 URL 与路由匹配

    是否可以获取 URL 或路径并找出它在代码隐藏中匹配的路由 Ex Router matchRoute my route 返回有关匹配路由的信息 例如 path my route component HeroListComponent dat
  • 如何在XAML中创建类的实例?

    我想创建没有可视元素的简单实用程序类 并在 XAML 中创建它 以便我可以定义数据绑定 我尝试创建派生类DependencyObject并创建它Window Resources部分 但它不调用任何构造函数 您可以在 app xaml 中实例
  • strcpy() 中的分段错误

    我有这样的基本结构 typedef struct struck char id char mat int value char place Truck 像这样的函数创建该结构的新 实例 Truck CTruck char id char m
  • 在 Eclipse 中调试。在断点之间移动

    我正在 Eclipse 中调试 JAVA 代码 假设迭代循环内有 2 个断点 如何直接进入断点 同时在每次迭代时跳过其余代码 按 F8 这也是Resume按钮 这将带你到断点 从那里使用 F6 调试每一行 如果您想转到下一个断点 请按 F8
  • Apollo graphQL 中 useQuery 和 useLazyQuery 有什么区别?

    我正在浏览 Apollo React hooks 的文档 并看到有两个查询钩子可供使用 其中是useQuery and useLazyQuery 我正在读这一页 https www apollographql com docs react
  • 当在字符串中按下 QpushButton 时,如何在 QlineEdit 中获取文本?

    我正在尝试实现一个功能 我的代码如下 当用户单击名为 connect 的按钮时 我想在 shost 字符串中获取带有对象名 host 的 lineedit 中的文本 我怎样才能做到这一点 我尝试过但失败了 我该如何实现这个功能呢 impor
  • JavaScript - 挂钩对所有“点击”事件的一些检查

    因此 我有一个附加到几个按钮的常规 onclick 事件 处理 onclick 事件的每个函数都会执行不同的操作 因此我不能为这两个事件重用相同的函数 element1 onclick function if this classList
  • 系统中发现硒元素,但 Jenkins 中未发现

    我和我的团队最近开始使用 Selenium Web Driver 和 JUnit 开发自动化脚本 我面临一个问题 而且我真的不知道如何继续 任何建议都会有用 问题是 我有一个页面 在其中我以表单形式上传两个 Excel 然后按提交按钮确认上
  • ngx-datatable 页脚自定义

    如何自定义 ngx 数据表 我无法找到必须更改代码以删除记录总数并将其替换为下拉列表以显示每页项目的位置 我的分页也缺少一些图标 使用自定义页脚模板 请参阅下面的链接 所以它会覆盖默认的页脚 https github com swimlan
  • 如何使用 JQuery 按一个类查找元素,但排除其他元素

    我有多个元素 其中有一个类 li class target class exclude class li li class target class exclude class li li class target class li li
  • 当关闭文件方法抛出 IOException 时如何管理事务(包括文件 IO)

    我最近开始使用 Spring 的数据源事务管理器 我现在有问题 我的事务包括对数据库表的更新和对文件的写入操作 它工作正常 但我对文件 I O 有一些疑问 如下所示 我已将 bean 的 openFile 和 closeFile 方法分别配