【问题标题】:Patterns for this type of problem此类问题的模式
【发布时间】:2011-09-11 21:40:49
【问题描述】:

我需要有关用于以下问题的模式的建议。

在对应于文件的表中有很多行——让我们称之为消息(由 DB 中的 MSG_ID 标识)。意思是,文件已经被分割成许多块并存入数据库。

因此,可以使用 GROUP_ID 列来识别文件对应的部分,而 MSG_ID 对应于单个消息。主键是 GROUP_ID 和 MSG_ID 的组合。

现在,每条消息都包含 n 条逻辑记录(通常是支付指令(k x 128 字节数据))。只有在阅读了接下来的 128 个字符后,才能说当前阅读支付指令在哪里结束。支付指令的一部分也可以在连续消息中。这意味着一条完整的支付指令可以分布在 MSG_ID n 的结尾和 MSG_ID n+1 的开头。

我们正在使用 Spring Batch 进行处理。

我已经尝试查询表并将所有记录一一写入一个平面文件,然后从那里启动 spring 批处理。

我想知道是否有任何模式可以在不使用平面文件的情况下实现需求。

喜欢,

  1. 从 db 中读取 MSG_ID 1 和 GROUP_ID "ABC"

  2. 将支付指令分开,并将每条指令交给处理器。

  3. 当到达 MSG_ID 1 的末尾时,检查手头的最终记录是否形成支付指令,如果不是,则读取 MSG_ID 2 和 GROUP_ID "ABC" 并附加到上一个剩余记录。

    李>
  4. 读取到 MSG_ID==N,其中 N 在开始读取过程之前已知。

  5. 我可以使用 Spring 中的 ItemReaders 或 Java 中的 Iterator 模式吗?

更清楚地说,有一些处理模式,“如果您的逻辑记录分布在多行中”。 “如果数据库中的一行包含'M'个逻辑记录,其中M可能不是整数,使用这种类型的Iterator或ItemReaders”是否有任何模式

谢谢。

【问题讨论】:

    标签: java spring iterator streamreader sqldatareader


    【解决方案1】:

    我相信你应该为你的场景编写一个自定义的Reader(处理逻辑)。这似乎并不常见。

    您提出的算法似乎没问题。您应该可以轻松编写Reader,它会读取完整的付款指令并将其交给进一步处理。

    【讨论】:

    • 我已经编写了自定义阅读器,可以从平面文件中读取。认为可能有更好的模式可以使用。
    • 我认为您不需要将中间结果写入文件。来自数据库的支付指令的聚合不应该对您的系统造成太大压力,以至于需要一个单独的处理步骤只是进行聚合。然而,对于应该如何阅读和处理完整的支付指令的问题,唯一确定的答案可以通过剖析的方式获得。为了使选项更清晰,您可以:a)聚合到文件/另一个表,然后运行批处理,b)在批处理运行期间聚合。
    • 我想我没有解释为什么我写到平面文件。写入平面文件是我想到的一种方法,使用 Spring 的拆分选项。但它看起来像 1. 从数据库读取,2. 写入文件,3. 确定拆分,4. 从平面文件读取,步骤是多余的。所以我决定追求第二种选择。即,摆脱平面文件,在阅读器中从数据库中读取,将对象传递给处理器。
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多