批处理和业务层通信

时间:2012-04-19 13:15:29

标签: design-patterns domain-driven-design spring-batch

我正在使用Spring批处理设计批处理应用程序,其中我有以下架构(层):

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

我的问题是:

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

由于

1 个答案:

答案 0 :(得分:3)

  

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

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

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

为作者和业务层的界面提供一些灵感

  1. 使用ItemWriterAdapter,可以使用businessLayer.addOrderItem方法
  2. 编写自己的包装器
  3. 将业务层移动到编写器中,很少需要重新使用批量优化业务层
  4. 我会使用选项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>