Spring Batch和Hibernate - 群发电子邮件应用程序

时间:2013-03-01 17:53:26

标签: spring hibernate email batch-processing spring-batch

我们正在开发一个基于Spring的批处理和基于Hibernate的应用程序,它将负责发送1000封电子邮件。

简而言之,目前只有一个步骤定义了一个工作。

<job id="emailJob" xmlns="http://www.springframework.org/schema/batch" restartable="true"
     job-repository="jobRepository">
    <step id="emailJobFetchUsers">
        <tasklet>
            <chunk reader="emailItemReader" processor="emailItemProcessor" writer="emailItemWriter" commit-interval="1"/>
        </tasklet>
        <end on="COMPLETED"/>
        <fail on="FAILED"/>
    </step>
    <listeners>
        <listener ref="loggingListener"/>
    </listeners>
</job>
  • emailItemReader扩展了HibernateCursorItemReader,并将返回行的实体(在这种情况下是一条代表客户选择的电子邮件的记录)
  • emailItemProcessor生成并发送客户特定的电子邮件
  • emailItemWriter只是更新实体的某些信息,例如最后发送的日期

虽然这是有效的,但我不确定它是否应该全部是一步,或者是否应该有一个步骤负责每个动作。我主要担心的是可重启性和恢复性。也就是说,这样的例外发生在一个用户身上(可能是由于无效的电子邮件地址或生成电子邮件的问题),或者如果应用程序服务器出现故障并重新启动,我希望它能够从它离开的地方接收发送电子邮件关闭。

有人可以就上述事项提出建议吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

是的,应该可以重启。检查读者超类的javadoc。但是,您需要注意以下事项:

  • 您需要维护查询中的顺序 - 读者只能从失败的项目开始,因此每个查询执行必须以相同的顺序返回项目
  • 如果itemWriter中的实体修改影响查询结果,则可能会很棘手 - e.q.如果按上次发送日期过滤,则无法按预期工作

如果发生以下情况,我相信更多:

  1. 作业执行失败
  2. 将新客户插入到DB \
  3. 作业重新启动
  4. 然后查询结果可能与第一次(失败)执行期间的结果不同。如果您的应用程序可以使用这种情况,那么我建议添加一些条件来防止它 - 比如在查询中添加一个检查以跳过在第一个作业执行时间之后注册的客户。