Spring批处理聚合值并写入单个值

2023-12-19

我正在使用 spring Batch,我需要实现以下目标

  1. 读取包含日期和金额等详细信息的 csv 文件
  2. 汇总同一日期所有金额的总和
  3. 保留一项包含日期和总和的条目

我过去使用过批处理,我想到了以下方法。创建一个批次需要 2 个步骤。

Step 1:

  1. Reader:使用 FlatFileItemReader 循环遍历整个文件
  2. 处理器:使用作为日期的键和作为金额的值填充地图。如果存在条目,则获取该值并将其添加到新值
  3. 作家:没有操作作家,因为我不想写

Step 2:

  1. Reader:循环遍历地图的值
  2. 作者:坚持价值观

我能够实现步骤 1,其中我填充了Map. This Map已宣布与@JobScope

我陷入了如何为步骤 2 创建读取器的困境,该读取器只需要读取值列表。我试过ListItemReader但我无法访问Map来自ListItemReader.

请提供解决方案或者您是否有更好的方法来解决这个问题

Thanks


选项1: 如果您的简历已经按日期排序,您可以实现一个组读取器,它会读取行直到键值发生更改。之后,整个组可以作为一项传递给处理器。

这样的小组阅读器可能如下所示:

  private SingleItemPeekableItemReader<I> reader;
  private ItemReader<I> peekReaderDelegate;

  @Override
  public void afterPropertiesSet() throws Exception {
    Assert.notNull(peekReaderDelegate, "The 'itemReader' may not be null");
    this.reader= new SingleItemPeekableItemReader<I>();
    this.reader.setDelegate(peekReaderDelegate);
  }

  @Override
  // GroupDTO is just a simple container. It is also possible to use
  // List<I> instead of GroupDTO<I>
  public GroupDTO<I> read() throws Exception {
    State state = State.NEW; // a simple enum with the states NEW, READING, and COMPLETE
    GroupDTO<I> group = null;
    I item = null;

    while (state != State.COMPLETE) {
      item = reader.read();

      switch (state) {
        case NEW: {
          if (item == null) {
            // end reached
            state = State.COMPLETE;
            break;
          }

          group = new GroupDTO<I>();
          group.addItem(item);
          state = State.READING;
          I nextItem = reader.peek();
          // isGroupBreak returns true, if 'item' and 'nextItem' do NOT belong to the same group
          if (nextItem == null || getGroupBreakStrategy.isGroupBreak(item, nextItem)) {
            state = State.COMPLETE;
          }
          break;
        }
        case READING: {
          group.addItem(item);

          // peek and check if there the peeked entry has a new date
          I nextItem = peekEntry();
          // isGroupBreak returns true, if 'item' and 'nextItem' do NOT belong to the same group
          if (nextItem == null || getGroupBreakStrategy.isGroupBreak(item, nextItem)) {
            state = State.COMPLETE;
          }
          break;
        }
        default: {
          throw new org.springframework.expression.ParseException(groupCounter, "ParsingError: Reader is in an invalid state");
        }
      }
    }

    return group;
  }

您需要一个 SingleItemPeekableItemReader,以便预读取下一个元素。这一篇涵盖了您的普通读者。

选项2: 第一步正如您所建议的,但只需为步骤 2 编写一个 tasklet。无需使用读取器-进程-编写器方法,而是可以使用一个简单的 tasklet 将映射的内容写入文件。

选项 3: 如果您确实想在步骤 2 中使用读取器-处理器-写入器方法,请编写您自己的读取器来迭代您的映射。

类似的东西(我没有测试该代码):

public class MapReader implements ItemReader {

     private MapContainer container;
     private Iterator<Map.Entry<Date, Integer> mapIterator;

     @PostConstruct
     public void afterPropertiesSet() {
        Assert.notNull(container);
        iterator = container.getMap().entry().iterator;
     }

     public void setMapContainer(MapContainer container) {
         this.container = container;
     }

     public Map.Entry<Date, Integer> read() {
        if (iterator.hasNext()) {
           return iterator.next();
        }
        return null;
      }
}

@Component
public class MapContainer {
    private Map<Date, Integer> data = new Hashmap<>();

    public Map<Date, Integer> getMap() {
        return data;
    }

    // add modifier method as needed for step 1

}

因此,您为容器创建一个 spring-bean 实例,将其注入到步骤 2 的处理器中,在那里填充,同时将其注入到上面的阅读器中。

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

Spring批处理聚合值并写入单个值 的相关文章

  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐

  • 如何在 Qt 项目中包含 OpenSSL

    我是 Qt 的新手 我已经做了一些谷歌搜索 但找不到足够详细的答案 我需要在基于 qmake 的 Qt 项目中使用 OpenSSL 我如何下载 安装 链接它 以便我可以执行包含语句并在我的代码中使用它的功能 假设使用 Windows 您可以
  • 通过引用传递 std::string 数组

    我想创建一个不通过引用传递 std string 进行修改的函数 void changeStr std string str str Hello World 而是一个完整的 固定大小的 std strings 数组 该函数将执行完全相同的操
  • AngularJS - 当另一个范围内的键为 true 时更改范围值

    我有一个像这样的 ng repeat li p car model p span span span X span li 基于此 scope cars scope cars model Ford check true model Honda
  • 使用本机登录页面的登录凭据实施 Oauth2

    我正在尝试实现基于 Oauth2 的 Web 服务 我有 clientID clientSecret 授权端点 令牌端点和回调 Url 自定义架构指向 android 本机页面 当我检查其他基于 Oauth2 的 API 时 它有登录 Ur
  • 为乒乓球游戏的神经网络寻找正确的参数

    我在 Pong 游戏中实现深度神经网络时遇到了一些麻烦 因为无论我更改哪些参数 我的网络总是发散 我玩了一个 Pong Game 并实现了一个基于 theano lasagne 的深度 q 学习算法 该算法基于 Google Deepmin
  • 找不到存储过程,但可以执行它

    我是 SQL Server 新手 创建了我的第一个存储过程 它执行得很好 我可以在 可编程性 存储过程 下找到它 因此我弹出一个新查询并输入以下语句 use name of database exec name of stored proc
  • 如何对甘特条进行聚类而不重叠?

    使用 create gantt 我有重叠的开始日期和结束日期 import plotly plotly as py import plotly figure factory as ff import plotly df dict Task
  • 获取应用服务器下的真实(虚拟)主机名

    我有一个在 Jetty 下运行的应用程序 我希望该应用程序返回自引用绝对 URL 生成 RSS 提要时 因此客户端必须能够在没有 当前 URL 上下文的情况下工作 问题是我事先不知道应用程序将部署在哪个主机名下 而且很可能它将部署在多个主机
  • 通过 Powershell 为另一个用户设置环境变量

    我正在尝试从管理员用户 ABC 的 powershell 设置用户 XYZ 的环境变量 我正在使用 Start Process 启动用户 XYZ 的 powershell 但我无法捕获输出 所有这些过程都需要用Java来完成 有人可以帮我吗
  • 将对象实例添加到 gradle 插件扩展

    我有类似下面的插件 其中有一个外部命名空间 其中有一个 具体 实例 mother 一个对象加上另一个集合 children family mother firstname John lastname Cleese children son
  • Spring bean 的标准命名

    有人知道应用程序上下文中 Spring bean 的标准命名吗 我使用了驼峰命名法 但我不确定是否存在一种标准 我在网上搜索了相关内容 但没有找到任何东西 Bean 命名约定 Spring 框架参考第 1 3 1 节 https docs
  • 使用Excel作为Access数据库的前端(使用VBA)

    我正在为朋友构建一个小型应用程序 他们希望能够使用 Excel 作为前端 UI 基本上是 Excel 中的用户表单 他们在 Excel 中有一堆数据 他们希望能够查询这些数据 但我不想使用 Excel 作为数据库 因为我认为它不适合该目的
  • JBoss 6.4.20 补丁中允许使用哪些版本的 Jackson?

    我正在尝试更新我的 Jackson 版本6 4 20 JBoss补丁 https www redhat com archives rhsa announce 2018 May msg00028 html 我在用着org codehause
  • 匹配 bool 与 const void* 重载的函数的地址

    我正在阅读使用随机数生成器作为 C 中的函数出现意外值 https stackoverflow com questions 27225614 unexpected value using random number generator as
  • MTOM 是如何工作的?

    MTOM 是 W3C 消息传输优化机制 是一种高效地向 Web 服务发送二进制数据或从 Web 服务发送二进制数据的方法 它一般如何运作 这一切都始于 SOAP 的事实XML 当您发送文本以外的任何内容 例如图像 时 必须将其转换为 XML
  • Java 未经检查的操作转换为泛型

    我想知道为什么以下内容会发出有关不安全 未经检查的操作的警告 Map
  • 使用 Puppeteer 将鼠标悬停在 Node.js 中的元素上并获取计算样式?

    我想将鼠标悬停在某个元素上 比如说document getElementById abc 并找到它的悬停计算样式 我应该如何使用 Puppeteer 在 Node js 中执行此操作 您可以使用以下解决方案来迭代并将鼠标悬停在某些元素上以获
  • Unity 3d Sprite Shader(如何在多个灯光照射下将最大亮度限制为 1)

    我正在 Unity 中创建一个视频游戏 每个精灵都使用具有 CornucopiaShader shader 材质的精灵渲染器进行渲染 我遇到的问题是我想将精灵的最大亮度 或颜色 限制为精灵的正常图像 无论有多少点光源照射它的功率 灯光的强度
  • 为什么shared_ptr<>必须分别分配控制块和托管对象?

    这个链接的问题询问是否make shared lt gt 函数和shared ptr lt gt 构造函数不同 使用 make shared 时会发生什么 https stackoverflow com questions 24779929
  • Spring批处理聚合值并写入单个值

    我正在使用 spring Batch 我需要实现以下目标 读取包含日期和金额等详细信息的 csv 文件 汇总同一日期所有金额的总和 保留一项包含日期和总和的条目 我过去使用过批处理 我想到了以下方法 创建一个批次需要 2 个步骤 Step