发送电子邮件和更新数据库

时间:2014-10-13 09:54:23

标签: java spring spring-batch

我使用RepositoryItemReader从数据库中读取项目 然后我使用ItemProcessor将它们转换为MimeMessages 然后我使用MimeMessageItemWriter

发送它们

所有这一切都很有效。

但是当发送项目电子邮件时,我想更新该项目的数据库并设置sentMail日期,以便下次运行作业时,它不会重新发送已经发出的电子邮件。

我应该在哪里更改数据库?

在读者中?但是如果smtp没有响应会发生什么呢?整个块是否会回滚? 在处理器或复合处理器? 在作家?但这并不好,因为现在它是一个MimeMessage,我不再拥有projectID了。

或者我应该使用听众?

1 个答案:

答案 0 :(得分:0)

您应该有一个服务级别类来包装整个处理:

  • 从数据库中读取(并保留id)
  • 创建MimeMessage
  • 发送消息
  • 更新数据库

这样一来,只有在你能成功发送邮件的情况下才能更新数据库(好的只是到SMTP服务器,但从这一点开始是另一个故事......)

编辑:在spring-batch的上下文中,服务级别是spring-batch本身

在spring-batch的上下文中,读者部分很好,你当然应该使用MimeMessageItemWriter来发送消息。但您必须能够按照上述步骤操作。恕我直言,一个简单的解决方案是在类中扩展MimeMessage

class MessageAndId extends MimeMessage {
    private int databaseId; // or whatever your id is
    private boolean sendError;
    public MessageAndId(MimeMessage source, int databaseId) {
        super(source);
        this.databaseId = databaseId;
        sendError = false;
    }
}

您的ItemProcessor应该将您的输入转换为MessageAndId,并且您的编写者应该是一个复合编写器,首先使用自定义错误处理程序调用{​​{1}},该处理程序将MimeMessageItemWriter设置为true它的sendError方法,接下来调用ItemWriter来更新数据库,知道每条消息的数据库ID和状态。

相关问题