Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 批处理和业务层通信_Design Patterns_Domain Driven Design_Spring Batch - Fatal编程技术网

Design patterns 批处理和业务层通信

Design patterns 批处理和业务层通信,design-patterns,domain-driven-design,spring-batch,Design Patterns,Domain Driven Design,Spring Batch,我正在使用SpringBatch设计一个批处理应用程序,其中我有以下体系结构(层): 我将所有spring批处理代码(读取文件、处理和写入)放在顶部模块中。此顶部模块特定于文件的特定格式。因此,我将来可能会有一个新的并行模块,能够读取/处理/写入新的格式。与格式无关,文件的每一行对应于要执行的特定操作。例如,每一行可能代表“将行项目X添加到订单Y”的操作。因此,对于每一行,在完成读取和处理之后,我使用一个自定义ItemWriter,它调用紧接下面的层的所需操作 实现不同批处理操作的业务逻辑层。

我正在使用SpringBatch设计一个批处理应用程序,其中我有以下体系结构(层):

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

  • 顶层模块和业务逻辑层之间的接口是否有最佳实践(可能是特定的设计模式)
  • 假设每个文件只包含一个订单的行。编写每一行的简单方法是每行调用一个批处理操作。在本例中,对于每一行,都会调用OrderRepository来检索订单,然后保存订单。我正在考虑另一种方法,即按块编写行(就像我们对SpringBatch所做的那样)。写入操作采用的参数具有类型列表。按照第二种方法,我需要向业务操作传递将区块添加到相关顺序所需的数据。使用哪个表单在顶层模块和业务逻辑层之间传递信息
谢谢

是否有最佳实践(可能是特定的设计模式)可供使用 顶层模块和业务逻辑层之间的接口是什么

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

  • 考虑数据和数据流
  • 有多少数据
  • 瓶颈是什么?(处理与写作,通常是写作部分)
给你一些关于writer和business layer界面的灵感

  • 使用,可以使用businessLayer.addOrderItem方法
  • 写你自己的包装
  • 将业务层移动到编写器中,很少真正需要重用批优化的业务层
  • 我将使用选项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
        }
    }
    
    <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>
    
    公共类SimpleItemWriter实现ItemWriter{
    @凌驾
    公共空白写入(列表)