我正在使用 Spring Batch 发送批量电子邮件。 我正在使用 ItemReader 获取包含需要向其发送电子邮件的详细信息的列表,并使用 ItemProcessor 准备它并使用 ItemWriter 发送它。 它工作正常,但问题是我必须确定哪个电子邮件 ID 邮件发送失败。
简而言之,我想做这样的事情:
try {
mailSender.send(items.toArray(new MimeMessagePreparator[items.size()]));
} catch (final SendFailedException e) {
logProblem(e);
final Address[] invalidAddresses = e.getInvalidAddresses();
setFailedAddresses(invalidAddresses);
final Address[] validSentAddresses = e.getValidSentAddresses();
setConfirmedAddresses(validSentAddresses);
final Address[] validUnsentAddresses = e.getValidUnsentAddresses();
resend(validUnsentAddresses);
}
但是发送方法定义是这样的
JavaMailSender.send(MimeMessagePreparator[] arg0) 抛出 MailException
所以它显示无法访问的catch block
这是我的 ItemProcessor 实现:
@Override
public MimeMessagePreparator process(final UserEmailDtlBO userEmailDtlBO) throws Exception {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true);
message.setTo(userEmailDtlBO.getEmail());
message.setFrom(mailbundle.getString("mailFrom"));
Map<String, Object> model = new HashMap<String, Object>();
model.put("user", userEmailDtlBO);
// message.addInline("logoImg", new ClassPathResource("/conf/logo_green.png"));
String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/conf/demo_email.vm", "utf-8", model);
message.setSubject("demo email template");
message.setText(text, true);
URL resource = this.getClass().getResource("/conf/logo_green.png");
String fileStr = resource.getFile();
File emailLogo = new File(fileStr);
message.addInline("logoImg", emailLogo);
}};
return preparator;
}
这是我的 ItemWriter 实现:
@Override
public void write(List<? extends MimeMessagePreparator> items) throws MailException{
mailSender.send(items.toArray(new MimeMessagePreparator[items.size()]));
}
请帮助我处理 SendFailedException 。
最佳答案
javax.mail.SendFailedException
是一个受检查的异常,所以
org.springframework.mail.javamail.JavaMailSender.send(MimeMessagePreparator... mimeMessagePreparators)
永远不会抛出检查异常,只会抛出 javadoc API 中定义的运行时异常。
您可以检查抛出的异常是否属于类型
org.springframework.mail.MailSendException
,然后调用
ex.getFailedMessages()
关于那些异常(exception)。至少 org.springframework.mail.javamail.JavaMailSenderImpl 在特定条件下填充失败的消息(详细信息请查看源代码)。 如果没有,请编写您自己的 impl 类来捕获 SendFailedException,提取所需的值并将其包装在您自己的 MySendFailedException 中。
为了在 Spring Batch 中进行处理,您可以定义一个
org.springframework.batch.core.ItemWriteListener
并处理异常
public void onWriteError(Exception ex, List<? extends O> item) { }
关于java - 如何处理SendFailedException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068559/