我使用RepositoryItemReader从数据库中读取项目 然后我使用ItemProcessor将它们转换为MimeMessages 然后我使用MimeMessageItemWriter
发送它们所有这一切都很有效。
但是当发送项目电子邮件时,我想更新该项目的数据库并设置sentMail日期,以便下次运行作业时,它不会重新发送已经发出的电子邮件。
我应该在哪里更改数据库?
在读者中?但是如果smtp没有响应会发生什么呢?整个块是否会回滚? 在处理器或复合处理器? 在作家?但这并不好,因为现在它是一个MimeMessage,我不再拥有projectID了。
或者我应该使用听众?
答案 0 :(得分:0)
您应该有一个服务级别类来包装整个处理:
这样一来,只有在你能成功发送邮件的情况下才能更新数据库(好的只是到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和状态。