gpt4 book ai didi

design-patterns - 批处理与业务层通信

转载 作者:行者123 更新时间:2023-12-04 05:49:42 27 4
gpt4 key购买 nike

我正在使用具有以下架构(层)的 Spring Batch 设计一个批处理应用程序:

  • 我放置所有 spring 批处理代码(读取文件、处理和写入)的顶级模块。这个顶层模块特定于某种格式的文件。所以,我将来可能会有一个新的并行模块,能够读取/处理/写入新格式。独立于格式,文件的每一行都对应于要执行的特定操作。例如,每一行可以表示操作“将行项目 X 添加到订单 Y”。因此,对于每一行,在完成读取和处理后,我使用一个自定义 ItemWriter 来调用紧接在下方的层的所需操作。
  • 将实现不同批处理操作的业务逻辑层。这些操作中的每一个都是使用域层对象实现的。例如,“添加行项目;X 到订单 Y”操作将通过使用 OrderRepository 检索订单然后调用订单的 addLineItem 方法来实现。
  • 我拥有所有领域对象的领域层。按照前面的示例,我有 Order 和 LineItem 实体。

我的问题是:

  • 是否有最佳实践(也许是特定的设计模式)可用于顶层模块和业务逻辑层之间的接口(interface)?
  • 假设每个文件只包含一个订单的行。编写每一行的天真的方法是每行调用一个批处理操作。在这种情况下,对于每一行,都会调用 OrderRepository 来检索订单,然后保存订单。我正在考虑另一种方法,其中行由 block 编写(就像我们使用 Spring 批处理一样)。写操作采用的参数具有 List 类型。按照第二种方法,我需要向业务操作传递将 block 添加到相关订单所需的数据。顶层模块和业务逻辑层之间采用哪种形式传递信息?

谢谢

最佳答案

Is there a best practice (maybe a specific design pattern) to use for the interface between the top modules and the business logic layer?

afaik 没有真正的最佳实践,它与已知的最佳实践不同,但批处理通常需要解决性能要求/约束​​,甚至更经常产生性能问题,所以我的最佳实践是:

  • 考虑数据和数据流
  • 有多少数据?
  • 瓶颈是什么? (处理与写作,通常是写作部分)

给writer和业务层的接口(interface)一些启发

  1. 使用ItemWriterAdapter ,可以使用 businessLayer.addOrderItem 方法
  2. 编写自己的包装器
  3. 将业务层移至编写器中,很少有真正需要重用批量优化业务层

我会选择选项 2,因为在批处理上下文中我想使用列表和批处理 SQL

和往常一样,这取决于您的具体要求:-)

ItemWriter 包装示例

public class SimpleItemWriter implements ItemWriter<SimpleItem> {

@Override
public void write(List<? extends SimpleItem> items) throws Exception {
// do something, e.g. delegate to another spring bean
}
}

ItemWriterAdapter 配置示例

<bean id="sample-item-writer-adapter" class="org.springframework.batch.item.adapter.ItemWriterAdapter">
<property name="targetObject" ref="businessLayerBean" />
<property name="targetMethod" value="doSomething"
</bean>

<step id="splitFilesStep">
<tasklet>
<chunk
reader="itemReader"
writer="sample-item-writer-adapter"
commit-interval="5">
</chunk>
</tasklet>
</step>

关于design-patterns - 批处理与业务层通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com