Spring 批处理:在 CompositeItemWriter 中使用 before-step 和 after-step 方法

2024-02-23

我需要从数据库读取数据,然后生成 XLSX 文件并更新数据库中的数据。

对于读者部分来说没有问题。 对于作家部分,我最终创建了一个CompositeItemWriter,由第一个组成Writer生成 XLSX 文件和更新数据库中数据的第二个文件。

问题:我需要拦截第一个编写器的前后步骤,以便能够正确地分块写入 XLSX 文件。但是,一旦我将两位作家写成一个CompositeItemWriter,方法注释为@BeforeStep et @AfterStep不被调用。

让第一个作家实现时遇到同样的问题StepExecutionListener.

知道为什么吗?

下面是 CompositeItemWriter 的定义、步骤和 writer:

public CompositeItemWriter<Adhesion> compositeItemWriter() {
  CompositeItemWriter writer = new CompositeItemWriter();
  writer.setDelegates(Arrays.asList(adhesionToXlsWriter,  adhesionToDbWriter));
  return writer;
}

@Bean
public Step xlsStep(ItemReader<Adhesion> adhesionFromDbReader) {
   return stepBuilderFactory.get(JOB_NAME + "-step")
      .<Adhesion, Adhesion>chunk(10)
      .reader(adhesionFromDbReader)
      .writer(compositeWriter())
      .build();
   }


@Component
public class AdhesionToXlsWriter implements ItemWriter<Adhesion> {

   @BeforeStep
   public void beforeStep(StepExecution stepExecution) {
      // !! never called !!
   }

   @Override
   public void write(List<? extends Adhesion> items) throws Exception {
      // generate XLSX content
   }

   @AfterStep
   public ExitStatus afterStep(StepExecution stepExecution) {
      // !! never called !!
   }
}

您需要将 XslWriter 注册为该步骤的侦听器。使用stepBuilder的“监听器”方法。

如果编写器、读取器、处理器“隐藏”在复合类后面,则 spring 框架将不会自动将其识别为侦听器。因此你必须“手动”进行。

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

Spring 批处理:在 CompositeItemWriter 中使用 before-step 和 after-step 方法 的相关文章

随机推荐

  • 将任务添加到 Build.scala

    该文件http www scala sbt org 0 13 0 docs Detailed Topics Tasks html http www scala sbt org 0 13 0 docs Detailed Topics Task
  • 查找名称包含字符串的所有文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找一个命令 该命令将从当前目录返回文件名中包含字符串的文件 我见过locate and find可以查找以某些内容开头的文件的命
  • NuGet 包管理器:“AutoMapper”已具有为“Microsoft.CSharp”定义的依赖项

    我尝试在 Visual Studio Premium 2012 上使用 NuGet 将 AutoMapper 添加为项目的依赖项 但失败 它说 手术失败 AutoMapper 已经定义了一个依赖项 微软 CSharp 我可以添加其他依赖项
  • Flutter 重定向到 initState 上的页面

    我有一个应用程序 您需要登录才能继续 例如使用 Google 我想在需要身份验证时重定向用户 但是当我运行Navigator of context pushNamed myroute 我收到以下错误 EXCEPTION CAUGHT BY
  • 如何从 firebase 中删除条目

    我正在探索 Firebase 的功能 我在如何使用 java 代码从 Firebase 中删除节点或条目时遇到了问题 我搜索了他们的API 网络版本确实提供了remove 函数 但java没有 有一个removeValue 方法上的Fire
  • FluentNHibernate Component.ColumnPrefix 未应用

    我最近升级了FluentNHibernate from v1 1 0 685 to v1 2 0 712 最新 对于NHibernate 2 1 我的问题似乎是使用的类Component ColumnPrefix 映射 例如 public
  • ret2libc 攻击不会生成 shell

    我执行了 ret2libc 一切正常 但 shell 没有生成 源代码是 include
  • JHipster 的正确 Eclipse 设置是什么?

    我在第一次尝试在 STS Eclipse 中编译 jhipster 项目时收到此错误 The type org springframework core NestedRuntimeException cannot be resolved I
  • 如何向 PyPi 分发类型提示?

    我致力于将 Python 3 5 类型提示添加到响应库中 但是当我测试进行分发时 sdist or bdist wheel 它没有安装我的 pyi文件 我可以看到它是发行版的一部分 但仅此而已 您可以在此处查看我在存储库中获得的内容 htt
  • 包含 jQuery $.post() 函数的函数的返回值

    我知道 AJAX 是异步的 等等 但我有以下代码 function doesUsernameExist element Check via AJAX POST if username already exists in the databa
  • 合并 2 个排序列表

    我被要求针对以下问题提出尽可能多的解决方案 编写一个函数 它接受两个数字列表 均假设为 按升序排列 并将它们合并到一个列表中 也在 升序 我的第一个解决方案是append list1 onto list2然后重新sort 然后我发现一个内置
  • Android Mono 中的自定义应用程序子类

    我试图创建一个 Android App Application 的子类来覆盖 OnCreate 但我无法让它工作 这是我的代码 namespace MonoAndroidAcra Application Debuggable true La
  • 如何访问 tcp 标头详细信息?

    就像我创建了套接字并将该套接字绑定到客户端一样 我能够连接两侧并能够发送任意数量的数据 它基本上是 TCP 套接字 我的问题是我想访问 TCP 标头详细信息以检查和设置某种操作的参数 但我无法做到这一点 我正在用户空间中工作 从套接字级别我
  • 如何使用 Mercurial“恢复”未更改的文件?

    我在我的计算机上安装了 Windows7 我必须更改所有权限 取得所有权 这显然 触及 了我的所有文件 现在所有内容似乎都被 修改 当我执行 hg status 时 但只有一些文件有实际更改 是否有一个命令我可以运行 以便我可以 提交 或
  • 如何在 wicket 1.5 中的页面加载时打开模式窗口

    我使用 wicket 1 4 x 一段时间 在这里找到的解决方案效果很好 如何在页面加载时打开模态对话框 https stackoverflow com questions 4765790 how to open modaldialog o
  • 如何在 VBA 中替换范围/选择范围内的 Microsoft Word 字符样式?

    我正在开发一个带有宏的 Word 2007 模板 该宏会将字符样式应用于所选文本 查找 替换功能似乎是一个很好的起点 但我认为我发现了一个错误 限制 导致宏无法按预期工作 这是我的 vba 代码 Sub restyleSelection D
  • 如何检查按钮形状是否启用? [复制]

    这个问题在这里已经有答案了 如何使用 UIAccessibility 检查 iOS 设备辅助功能设置中的 按钮形状 选项是否已启用 我想在定制按钮上支持 按钮样式 我将代码转换为this https stackoverflow com a
  • 我如何使用 Node.js 和 Mongoose 计算总正价、总负价和总和

    我已经编写了获取所有用户记录的查询 exports index function req res Userdata find function err userdatas if err return handleError res err
  • 如何在React Native中使用全局变量?

    在 React Native 中 当我在不同屏幕之间移动时 我想使用全局变量 谁能帮助我如何实现它 React Native 中的全局范围是全局变量 例如global foo foo 那么你可以在任何地方使用 global foo 但不要滥
  • Spring 批处理:在 CompositeItemWriter 中使用 before-step 和 after-step 方法

    我需要从数据库读取数据 然后生成 XLSX 文件并更新数据库中的数据 对于读者部分来说没有问题 对于作家部分 我最终创建了一个CompositeItemWriter 由第一个组成Writer生成 XLSX 文件和更新数据库中数据的第二个文件